OSDN Git Service

na-get-lib,ダウンロードしたインストーラファイルの権限を落とす暫定コードを追加。
authorttp <ttp@users.sourceforge.jp>
Sun, 7 Dec 2008 05:46:42 +0000 (05:46 +0000)
committerttp <ttp@users.sourceforge.jp>
Sun, 7 Dec 2008 05:46:42 +0000 (05:46 +0000)
git-svn-id: http://localhost/svn/AppliStation/trunk@1000 34ed2c89-c49f-4a4b-abdb-c318350108cf

na-get-lib/NaGet.InteropServices/CreateProcessCaller.cs
na-get-lib/NaGet.Packages.Install/Installation.cs
na-get-lib/NaGet.SubCommands/NaGetInstall.cs
na-get-lib/NaGet/Utils.cs

index 696388f..382f6ae 100644 (file)
@@ -1,4 +1,4 @@
-using System;\r
+using System;\r
 using System.Diagnostics;\r
 using System.Runtime.InteropServices;\r
 \r
index f8ab19d..fd0523a 100644 (file)
@@ -187,6 +187,12 @@ namespace NaGet.Packages.Install
                                        File.Move(installerFile, newFile);\r
                                        installerFile = newFile;\r
                                }\r
+                               \r
+                               // 権限を親フォルダに落とす\r
+                               try {\r
+                                       string targetDir = Path.GetDirectoryName(installerFile);\r
+                                       NaGet.Utils.SetAccessControlRecursive(targetDir, File.GetAccessControl(Path.GetDirectoryName(targetDir)));\r
+                               } catch (Exception) {} // 失敗時は何もしない\r
                        }\r
                }\r
                \r
@@ -356,7 +362,7 @@ namespace NaGet.Packages.Install
                }\r
                \r
                /// <summary>\r
-               /// ã\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83©ã\81®ä¸\80æ\99\82ä¿\9då­\98å\85\88ã\83\91ã\82¹ã\82\92ç\94\9fæ\88\90\r
+               /// インストーラの保存先パスを生成\r
                /// </summary>\r
                private string getArchiveFilePath()\r
                {\r
@@ -374,6 +380,11 @@ namespace NaGet.Packages.Install
                                        }\r
                                } else {\r
                                        Directory.CreateDirectory(folder);\r
+                                       \r
+                                       // 権限を親フォルダに合わせる\r
+                                       try {\r
+                                               Directory.SetAccessControl(folder, Directory.GetAccessControl(Path.GetDirectoryName(folder)));\r
+                                       } catch (Exception) {} // 失敗時無視\r
                                }\r
                        }\r
                        \r
@@ -462,6 +473,8 @@ namespace NaGet.Packages.Install
                                                               new FileNotFoundException(errMsg, archiveInstExe));\r
                        }\r
                        \r
+                       \r
+                       \r
                        ProcessStartInfo procInfo = new ProcessStartInfo(archiveInstExe, archiveInstArgs);\r
                        procInfo.UseShellExecute = false;\r
                        procInfo.CreateNoWindow = true;\r
index b2cd573..1de1e1d 100644 (file)
@@ -1,4 +1,5 @@
 using System;\r
+using System.Collections.Generic;\r
 using NaGet.Packages.Install;\r
 using NaGet.Packages;\r
 using NaGet.Net;\r
@@ -61,7 +62,7 @@ namespace NaGet.SubCommands
                \r
                private void initializeMainTaskSetNames()\r
                {\r
-                       System.Collections.Generic.List<string> taskSetNames = new System.Collections.Generic.List<string>();\r
+                       List<string> taskSetNames = new List<string>();\r
                        \r
                        for (int i =0; i < Installations.Length; i++) {\r
                                taskSetNames.Add(string.Format("取得: {0}", Installations[i].ToString()));\r
@@ -84,7 +85,7 @@ namespace NaGet.SubCommands
                        \r
                        {\r
                                // ハッシュ非適合なインストーラの表\r
-                               System.Collections.Generic.List<Installation> invalidInstallers = null;\r
+                               List<Installation> invalidInstallers = null;\r
                                \r
                                while (invalidInstallers == null || invalidInstallers.Count > 0) {\r
                                        currentTaskSetIndex = 0;\r
@@ -251,9 +252,9 @@ namespace NaGet.SubCommands
                /// ダウンロードしたパッケージが整合したか否かハッシュでチェック\r
                /// </summary>\r
                /// <returns>整合しなかったインストーラのリスト</returns>\r
-               private System.Collections.Generic.List<Installation> runCheckHashForInstaller()\r
+               private List<Installation> runCheckHashForInstaller()\r
                {\r
-                       System.Collections.Generic.List<Installation> invalidInstallers = new System.Collections.Generic.List<Installation>();\r
+                       List<Installation> invalidInstallers = new List<Installation>();\r
                        \r
                        int i = 0;\r
                        foreach (Installation inst in Installations) {\r
index 1bb3eb5..87b2736 100644 (file)
@@ -4,6 +4,7 @@ using System.IO;
 using System.Text;\r
 using System.Globalization;\r
 using System.Security.Principal;\r
+using System.Security.AccessControl;\r
 using System.Reflection;\r
 using System.Diagnostics;\r
 using Microsoft.Win32;\r
@@ -108,6 +109,8 @@ namespace NaGet
                \r
                #endregion\r
                \r
+               #region ファイル情報関連ユーテイリティ関数\r
+               \r
                /// <summary>\r
                /// パス変数に指定のフォルダを追加する\r
                /// </summary>\r
@@ -145,8 +148,6 @@ namespace NaGet
                return FormatSize((double) bytes);\r
         }\r
                \r
-               #region ファイル操作関数群\r
-               \r
                /// <summary>\r
                /// URLからそのファイル名を生成する\r
                /// </summary>\r
@@ -230,20 +231,7 @@ namespace NaGet
                        bytes = null;\r
                        return output.ToString ();\r
                }\r
-               \r
-               /// <summary>\r
-               /// ファイルパスから、指定のパスセパレータの意味でファイル名を取り出す。\r
-               /// </summary>\r
-               /// <param name="filepath">ファイルパス(またはURLパス)</param>\r
-               /// <param name="separator">パスセパレータ</param>\r
-               public static string Basedir(string filepath, char separator)\r
-               {\r
-                       int dirSep = filepath.LastIndexOf(separator);\r
-                       if (dirSep < 0) return "";\r
-\r
-                       return filepath.Substring(0, dirSep);\r
-               }\r
-               \r
+    \r
                /// <summary>\r
                /// 再帰的にファイルの属性を指定します。強制的にフォルダの再帰削除の前に読み込み専用属性を消すのに使います。\r
                /// </summary>\r
@@ -266,6 +254,27 @@ namespace NaGet
                }\r
                \r
                /// <summary>\r
+               /// 再帰的にファイルのアクセス権限(ユーザ権限など)を設定します\r
+               /// </summary>\r
+               /// <param name="path">設定するフォルダ</param>\r
+               /// <param name="filesec">変更先権限</param>\r
+               public static void SetAccessControlRecursive(string path, FileSecurity filesec)\r
+               {\r
+                       // 自分自身の権限を変更\r
+                       File.SetAccessControl(path, filesec);\r
+                       \r
+                       // 子ファイルの権限を変更\r
+                       foreach (string file in Directory.GetFiles(path)) {\r
+                               File.SetAccessControl(file, filesec);\r
+                       }\r
+                       \r
+                       // 子フォルダを再帰的に権限変更\r
+                       foreach (string file in Directory.GetDirectories(path)) {\r
+                               SetAccessControlRecursive(file, filesec);\r
+                       }\r
+               }\r
+               \r
+               /// <summary>\r
                /// ファイルまたはフォルダの容量を算出して返す\r
                /// </summary>\r
                /// <param name="path">\r
@@ -444,12 +453,11 @@ namespace NaGet
                #region 権限関連関数群\r
                \r
                /// <summary>\r
-               /// 現在のユーザがAdministrators権限を持っているか否かを返す\r
+               /// 現在のユーザがAdministrators権限を持っているか否かを返す\r
                /// </summary>\r
+               /// <remarks>UAC有効時には権限昇格後になってtrueを返すようになります</remarks>\r
                public static bool IsAdministrators()\r
                {\r
-                       // TODO UAC はどうするんだ!!!!\r
-                       \r
                        // 現在の Windows ユーザーを現在のスレッドのプリンシパルに反映する\r
                        AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal );\r
                        IPrincipal prin = System.Threading.Thread.CurrentPrincipal;\r