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

Normalize input URL scheme during auth process
This commit is contained in:
Tobias Kaminsky 2021-07-16 12:01:42 +02:00 committed by GitHub
commit b94a439e4b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 110 additions and 0 deletions

View file

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

View file

@ -23,6 +23,7 @@ package com.owncloud.android.authentication;
import android.text.TextUtils;
import java.net.URI;
import java.util.Locale;
/**
@ -97,4 +98,14 @@ public final class AuthenticatorUrlUtils {
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;
}
}
}

View file

@ -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);
}
}
}