Browse Source

Merge pull request #8535 from nextcloud/fix-auth-with-uppercase-scheme

Normalize input URL scheme during auth process
Tobias Kaminsky 3 years ago
parent
commit
b94a439e4b

+ 2 - 0
src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java

@@ -771,6 +771,8 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity
                 accountSetupBinding.hostUrlInput.setText(uri);
                 accountSetupBinding.hostUrlInput.setText(uri);
             }
             }
 
 
+            uri = AuthenticatorUrlUtils.normalizeScheme(uri);
+
             // Handle internationalized domain names
             // Handle internationalized domain names
             try {
             try {
                 uri = DisplayUtils.convertIdn(uri, true);
                 uri = DisplayUtils.convertIdn(uri, true);

+ 11 - 0
src/main/java/com/owncloud/android/authentication/AuthenticatorUrlUtils.java

@@ -23,6 +23,7 @@ package com.owncloud.android.authentication;
 
 
 import android.text.TextUtils;
 import android.text.TextUtils;
 
 
+import java.net.URI;
 import java.util.Locale;
 import java.util.Locale;
 
 
 /**
 /**
@@ -97,4 +98,14 @@ public final class AuthenticatorUrlUtils {
 
 
         return strippedUrl;
         return strippedUrl;
     }
     }
+
+    public static String normalizeScheme(String url) {
+        URI uri = URI.create(url);
+        if (uri.getScheme() != null) {
+            String lcScheme = uri.getScheme().toLowerCase(Locale.ROOT);
+            return String.format("%s:%s", lcScheme, uri.getRawSchemeSpecificPart());
+        } else {
+            return url;
+        }
+    }
 }
 }

+ 97 - 0
src/test/java/com/owncloud/android/authentication/AuthenticatorUrlUtilsTest.java

@@ -0,0 +1,97 @@
+/*
+ *   Nextcloud Android client application
+ *
+ *   @author Chris Narkiewicz
+ *   Copyright (C) 2021 Chris Narkiewicz
+ *
+ *   This program is free software; you can redistribute it and/or
+ *   modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ *   License as published by the Free Software Foundation; either
+ *   version 3 of the License, or any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ *   You should have received a copy of the GNU Affero General Public
+ *   License along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+ 
+package com.owncloud.android.authentication;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+@RunWith(Suite.class)
+@Suite.SuiteClasses(AuthenticatorUrlUtilsTest.NormalizeScheme.class)
+public class AuthenticatorUrlUtilsTest {
+
+    public static class NormalizeScheme {
+        @Test
+        public void noScheme() {
+            // GIVEN
+            //      input URL has no scheme
+            String url = "host.net/index.php/apps/ABC/def/?";
+
+            // WHEN
+            //      scheme is normalized
+            String normalized = AuthenticatorUrlUtils.normalizeScheme(url);
+
+            // THEN
+            //      input is returned unchanged
+            Assert.assertSame(url, normalized);
+        }
+
+        @Test
+        public void lowercaseScheme() {
+            // GIVEN
+            //      input URL has scheme
+            //      scheme is lowercase
+            String url = "https://host.net/index.php/ABC/def/?";
+
+            // WHEN
+            //      scheme is normalized
+            String normalized = AuthenticatorUrlUtils.normalizeScheme(url);
+
+            // THEN
+            //      output is equal
+            Assert.assertEquals(url, normalized);
+        }
+
+        @Test
+        public void uppercaseScheme() {
+            // GIVEN
+            //      input URL has scheme
+            //      scheme has uppercase characters
+            String mixedCaseUrl = "HTtps://host.net/index.php/ABC/def/?";
+
+            // WHEN
+            //      scheme is normalized
+            String normalized = AuthenticatorUrlUtils.normalizeScheme(mixedCaseUrl);
+
+            // THEN
+            //      scheme has been lower-cased
+            //      remaining URL part is left unchanged
+            String expectedUrl = "https://host.net/index.php/ABC/def/?";
+            Assert.assertEquals(expectedUrl, normalized);
+        }
+
+        @Test
+        public void emptyInput() {
+            // GIVEN
+            //      input URL is empty
+            String emptyUrl = "";
+
+            // WHEN
+            //      scheme is normalized
+            String normalized = AuthenticatorUrlUtils.normalizeScheme(emptyUrl);
+
+            // THEN
+            //      output is empty
+            Assert.assertEquals("", normalized);
+        }
+    }
+}