OSDN Git Service

na-get-lib,ウイルススキャン結果を参照するように処理を変更。(IOfficeAntiVirus::Scan()の戻り値を見るようにした)
authorttp <ttp@users.sourceforge.jp>
Sun, 13 Dec 2009 01:56:19 +0000 (10:56 +0900)
committerttp <ttp@users.sourceforge.jp>
Sun, 13 Dec 2009 01:56:19 +0000 (10:56 +0900)
na-get-lib/NaGet.Net/DownloadScanner.cs
na-get-lib/NaGet.Packages.Install/Installation.cs
na-get-lib/NaGet.SubCommands/NaGetInstall.cs

index f002ec8..9b65a84 100644 (file)
@@ -13,6 +13,15 @@ using NaGet.InteropServices;
 \r
 namespace NaGet.Net\r
 {\r
+       public enum DownloadScannerResult : uint {\r
+               OK = 0, // S_OK\r
+               InfectedAndCleaned = 1, // S_FALSE\r
+               InfectedButNotCleaned = 0x80004005,     // E_FAIL\r
+               ErrorNotFound = 2,      // ERROR_NOT_FOUND\r
+               \r
+               ScannerNotFound = 0xFFFFFFFF,\r
+       }\r
+       \r
        /// <summary>\r
        /// ダウンロードしたファイルをスキャンする\r
        /// </summary>\r
@@ -48,7 +57,8 @@ namespace NaGet.Net
                [Guid("56FFCC30-D398-11D0-B2AE-00A0C908FA49")]\r
                [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]\r
                private interface IOfficeAntiVirus {\r
-                       void Scan(ref MSOAVINFO pmsoavinfo);\r
+                       [PreserveSig()]\r
+                       uint Scan(ref MSOAVINFO pmsoavinfo);\r
                }\r
                #endregion\r
                \r
@@ -135,14 +145,10 @@ namespace NaGet.Net
                /// <param name="path">ファイルのパス</param>\r
                /// <param name="origin">ファイルをダウンロードしたURL。nullであってはならない</param>\r
                /// <exception cref="COMException">COMのエラー発生時。たとえば、AVGではウイルスと検出されたのにユーザが「無視」を指定したときにも投げられる。</exception>\r
-               /// <returns>ウイルススキャンがされたか否か</returns>\r
+               /// <returns>ウイルススキャン結果。</returns>\r
                /// <remarks>Init()呼出し後に使える</remarks>\r
-               public bool Scan(string path, string origin)\r
+               public DownloadScannerResult Scan(string path, string origin)\r
                {\r
-                       if (scanners.Count <= 0) {\r
-                               return false;\r
-                       }\r
-                       \r
                        MSOAVINFO info = new MSOAVINFO();\r
                        info.cbsize = Marshal.SizeOf(info);\r
                        info.uFlags = MSOAVINFOFLAG.fPath | MSOAVINFOFLAG.fHttpDownload;\r
@@ -151,11 +157,23 @@ namespace NaGet.Net
                        info.pwzHostName = HostName;\r
                        info.pwzOrigURL = origin;\r
                        \r
+                       DownloadScannerResult result = DownloadScannerResult.ScannerNotFound;\r
                        foreach (IOfficeAntiVirus i in scanners) {\r
-                               if (! System.IO.File.Exists(path)) break;\r
-                               i.Scan(ref info);\r
+                               if (System.IO.File.Exists(path)) {\r
+                                       result = (DownloadScannerResult) i.Scan(ref info);\r
+                                       if (result == DownloadScannerResult.OK && System.IO.File.Exists(path) == false) {\r
+                                               result = DownloadScannerResult.InfectedAndCleaned;\r
+                                       }\r
+                               } else {\r
+                                       result = DownloadScannerResult.ErrorNotFound;\r
+                               }\r
+                               \r
+                               if (result != DownloadScannerResult.OK) {\r
+                                       break;\r
+                               }\r
                        }\r
-                       return true;\r
+                       \r
+                       return result;\r
                }\r
        }\r
 }\r
index 7b6681a..c7f9e1a 100644 (file)
@@ -211,23 +211,24 @@ namespace NaGet.Packages.Install
                /// </summary>\r
                /// <remarks>ウイルスのため退避・削除されたときも例外を投げずにあたかも正常かのように動作しえます。</remarks>\r
                /// <exception cref="ComException">スキャンで意図せぬ動作があったとき</exception>\r
-               /// <exception cref="FileNotFoundException">スキャン後にインストーラーファイルが存在しないとき</exception>\r
                /// <param name="scanner">スキャナーオブジェクト</param>\r
-               public void ScanInstallerFile(DownloadScanner scanner)\r
+               /// <returns>スキャン結果</returns>\r
+               public DownloadScannerResult ScanInstallerFile(DownloadScanner scanner)\r
                {\r
+                       DownloadScannerResult result;\r
                        Exception e = null;\r
                        try {\r
-                               scanner.Scan(installerFile, InstalledPackage.Installer[installerIndex].Url.Href);\r
-                       } catch (System.Runtime.InteropServices.COMException ex) {\r
+                               result = scanner.Scan(installerFile, InstalledPackage.Installer[installerIndex].Url.Href);\r
+                       } catch (Exception ex) {\r
+                               result = DownloadScannerResult.ScannerNotFound;\r
                                e = ex;\r
                        }\r
                        \r
-                       if (! File.Exists(installerFile)) {\r
-                               // ファイルが消されているならばFileNotFoundExceptionを出す\r
-                               throw new FileNotFoundException(string.Empty, installerFile, e);\r
-                       } else if ( e != null ) {\r
+                       if ( e != null ) {\r
                                // ファイルが消されていないが例外が発生していたときは、その例外を投げる\r
                                throw e;\r
+                       } else {\r
+                               return result;\r
                        }\r
                }\r
                \r
index c789cbc..05f0db1 100644 (file)
@@ -239,12 +239,32 @@ namespace NaGet.SubCommands
                                        \r
                                        RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, TaskSetNames[currentTaskSetIndex]);\r
                                        if (! NaGet.Env.EnableScanInstallerFile) {\r
-                                               RaiseTaskSetEvent(NaGetTaskSetEventType.INFO, string.Format("ウイルススキャンを行わない設定のため、ダウンロードしたファイルはウイルススキャンされませんでした"));\r
+                                               RaiseTaskSetEvent(NaGetTaskSetEventType.INFO, "ウイルススキャンを行わない設定のため、ダウンロードしたファイルはウイルススキャンされませんでした");\r
                                        } else if (!scanner.HasScanner) {\r
-                                               RaiseTaskSetEvent(NaGetTaskSetEventType.INFO, string.Format("ダウンロードしたファイルはウイルススキャンされませんでした(ウイルススキャンソフトが検出できませんでした)"));\r
+                                               RaiseTaskSetEvent(NaGetTaskSetEventType.INFO, "ダウンロードしたファイルはウイルススキャンされませんでした(ウイルススキャンソフトが検出できませんでした)");\r
                                        } else {\r
                                                try {\r
-                                                       inst.ScanInstallerFile(scanner);\r
+                                                       DownloadScannerResult result = inst.ScanInstallerFile(scanner);\r
+                                                       \r
+                                                       switch (result) {\r
+                                                               case DownloadScannerResult.ScannerNotFound:\r
+                                                                       RaiseTaskSetEvent(NaGetTaskSetEventType.INFO, "ダウンロードしたファイルはウイルススキャンされませんでした(ウイルススキャンソフトが検出できませんでした)");\r
+                                                                       break;\r
+                                                               case DownloadScannerResult.InfectedAndCleaned:\r
+                                                                       RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR,\r
+                                                                                 "インストーラーファイルからウイルス感染が検出されたため、削除されました。");\r
+                                                                       done = true;\r
+                                                                       return;\r
+                                                               case DownloadScannerResult.InfectedButNotCleaned:\r
+                                                                       RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR,\r
+                                                                                 "インストーラーファイルからウイルス感染が検出されました。");\r
+                                                                       done = true;\r
+                                                                       break;\r
+                                                               case DownloadScannerResult.ErrorNotFound:\r
+                                                                       throw new System.IO.FileNotFoundException(string.Empty);\r
+                                                                       //break;\r
+                                                       }\r
+                                                       \r
                                                } catch (System.Runtime.InteropServices.COMException ex) {\r
                                                        RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING,\r
                                                                          string.Format("{0} (E{1})", ex.Message, ex.ErrorCode));\r