OSDN Git Service

URLをWebブラウザで開く時にスキームが正しいか検証する
authorKimura Youichi <kim.upsilon@bucyou.net>
Sat, 21 Jan 2023 08:16:31 +0000 (17:16 +0900)
committerKimura Youichi <kim.upsilon@bucyou.net>
Sat, 21 Jan 2023 08:26:42 +0000 (17:26 +0900)
OpenTween.Tests/MyCommonTest.cs
OpenTween/MyCommon.cs
OpenTween/Properties/Resources.Designer.cs
OpenTween/Properties/Resources.en.resx
OpenTween/Properties/Resources.resx
OpenTween/Tween.cs
OpenTween/TweetDetailsView.cs

index dff7e0a..e6860d7 100644 (file)
@@ -311,15 +311,6 @@ namespace OpenTween
         }
 
         [Fact]
-        public void CreateBrowserProcessStartInfo_DefaultBrowserTest()
-        {
-            var startInfo = MyCommon.CreateBrowserProcessStartInfo(browserPathWithArgs: null, "https://example.com/");
-            Assert.Equal("https://example.com/", startInfo.FileName);
-            Assert.Equal("", startInfo.Arguments);
-            Assert.True(startInfo.UseShellExecute);
-        }
-
-        [Fact]
         public void CreateBrowserProcessStartInfo_BrowserPathTest()
         {
             var startInfo = MyCommon.CreateBrowserProcessStartInfo("C:\\browser.exe", "https://example.com/");
index ba9d2d9..04b7d93 100644 (file)
@@ -984,11 +984,30 @@ namespace OpenTween
         public static bool IsNullOrEmpty([NotNullWhen(false)] string? value)
             => string.IsNullOrEmpty(value);
 
-        public static Task OpenInBrowserAsync(IWin32Window? owner, string url)
-            => MyCommon.OpenInBrowserAsync(owner, SettingManager.Instance.Local.BrowserPath, url);
+        public static Task OpenInBrowserAsync(IWin32Window? owner, string urlStr)
+            => MyCommon.OpenInBrowserAsync(owner, SettingManager.Instance.Local.BrowserPath, urlStr);
 
-        public static async Task OpenInBrowserAsync(IWin32Window? owner, string? browserPath, string url)
+        public static Task OpenInBrowserAsync(IWin32Window? owner, Uri uri)
+            => MyCommon.OpenInBrowserAsync(owner, SettingManager.Instance.Local.BrowserPath, uri);
+
+        public static async Task OpenInBrowserAsync(IWin32Window? owner, string? browserPath, string urlStr)
         {
+            if (!Uri.TryCreate(urlStr, UriKind.Absolute, out var uri))
+            {
+                var message = string.Format(Properties.Resources.CannotOpenUriText, urlStr);
+                MessageBox.Show(owner, message, ApplicationSettings.ApplicationName, MessageBoxButtons.OK, MessageBoxIcon.Warning);
+            }
+            await MyCommon.OpenInBrowserAsync(owner, browserPath, uri);
+        }
+
+        public static async Task OpenInBrowserAsync(IWin32Window? owner, string? browserPath, Uri uri)
+        {
+            if (uri.Scheme != "http" && uri.Scheme != "https")
+            {
+                var message = string.Format(Properties.Resources.CannotOpenUriText, uri.OriginalString);
+                MessageBox.Show(owner, message, ApplicationSettings.ApplicationName, MessageBoxButtons.OK, MessageBoxIcon.Warning);
+            }
+
             try
             {
                 await Task.Run(() =>
index ac7556d..131fe64 100644 (file)
@@ -506,6 +506,15 @@ namespace OpenTween.Properties {
         }
         
         /// <summary>
+        ///   URLを開くことができません: {0} に類似しているローカライズされた文字列を検索します。
+        /// </summary>
+        internal static string CannotOpenUriText {
+            get {
+                return ResourceManager.GetString("CannotOpenUriText", resourceCulture);
+            }
+        }
+        
+        /// <summary>
         ///   画像ファイル(*.gif;*.jpg;*.jpeg;*.png)|*.gif;*.jpg;*.jpeg;*.png に類似しているローカライズされた文字列を検索します。
         /// </summary>
         internal static string ChangeIconToolStripMenuItem_ClickText1 {
index 08305d6..a0779cc 100644 (file)
@@ -49,6 +49,7 @@
        <data name="ButtonUnFollow_ClickText1"><value> : Unfollow this user?</value></data>
        <data name="ButtonUnFollow_ClickText2"><value>Confirm unfollowing</value></data>
        <data name="CalcApiUsingText1"><value>Now getting API informations...</value></data>
+       <data name="CannotOpenUriText"><value>Cannot open URL: {0}</value></data>
        <data name="ChangeIconToolStripMenuItem_ClickText1"><value>Images(*.gif;*.jpg;*.jpeg;*.png)|*.gif;*.jpg;*.jpeg;*.png</value></data>
        <data name="ChangeIconToolStripMenuItem_ClickText2"><value>The icon file size is limited under 700kb.</value></data>
        <data name="ChangeIconToolStripMenuItem_ClickText3"><value>Now changing icon...</value></data>
index d04a2e8..28f41de 100644 (file)
@@ -54,6 +54,7 @@
        <data name="ButtonUnFollow_ClickText1"><value> をフォロー解除します。よろしいですか?</value></data>
        <data name="ButtonUnFollow_ClickText2"><value>フォロー解除確認</value></data>
        <data name="CalcApiUsingText1"><value>API情報取得中・・・</value></data>
+       <data name="CannotOpenUriText"><value>URLを開くことができません: {0}</value></data>
        <data name="ChangeIconToolStripMenuItem_ClickText1"><value>画像ファイル(*.gif;*.jpg;*.jpeg;*.png)|*.gif;*.jpg;*.jpeg;*.png</value></data>
        <data name="ChangeIconToolStripMenuItem_ClickText2"><value>サイズ700KBまでのアイコン画像ファイルを選択してください</value></data>
        <data name="ChangeIconToolStripMenuItem_ClickText3"><value>アイコン設定中・・・</value></data>
index 6649f9b..ecad417 100644 (file)
@@ -4124,7 +4124,7 @@ namespace OpenTween
 
                 if (dialog.ShowDialog(this) == DialogResult.Yes)
                 {
-                    await MyCommon.OpenInBrowserAsync(this, versionInfo.DownloadUri.OriginalString);
+                    await MyCommon.OpenInBrowserAsync(this, versionInfo.DownloadUri);
                 }
                 else if (dialog.SkipButtonPressed)
                 {
index f1aa2f2..4a68385 100644 (file)
@@ -486,7 +486,7 @@ namespace OpenTween
             if (e.Url.AbsoluteUri != "about:blank")
             {
                 await this.ShowPostDetails(this.CurrentPost!); // 現在の発言を表示し直す (Navigated の段階ではキャンセルできない)
-                await MyCommon.OpenInBrowserAsync(this, e.Url.OriginalString);
+                await MyCommon.OpenInBrowserAsync(this, e.Url);
             }
         }
 
@@ -560,7 +560,7 @@ namespace OpenTween
             var sourceUri = this.CurrentPost?.SourceUri;
             if (sourceUri != null && e.Button == MouseButtons.Left)
             {
-                await MyCommon.OpenInBrowserAsync(this, sourceUri.AbsoluteUri);
+                await MyCommon.OpenInBrowserAsync(this, sourceUri);
             }
         }