Merge pull request #4644 from nextcloud/detectAuth

Allow broader check on CheckAuth
This commit is contained in:
Tobias Kaminsky 2019-10-09 21:06:00 +02:00 committed by GitHub
commit 07d0abe87e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -1,5 +1,5 @@
/**
* ownCloud Android client application
* ownCloud Android client application
*
* @author David A. Velasco
* Copyright (C) 2015 ownCloud Inc.
@ -46,78 +46,78 @@ import java.util.Locale;
* {@link RemoteOperationResult#getData()} a value of {@link AuthenticationMethod}.
*/
public class DetectAuthenticationMethodOperation extends RemoteOperation {
private static final String TAG = DetectAuthenticationMethodOperation.class.getSimpleName();
public enum AuthenticationMethod {
UNKNOWN,
NONE,
BASIC_HTTP_AUTH,
BASIC_HTTP_AUTH,
SAML_WEB_SSO,
BEARER_TOKEN
}
private Context mContext;
/**
* Constructor
*
* @param context Android context of the caller.
*
* @param context Android context of the caller.
*/
public DetectAuthenticationMethodOperation(Context context) {
mContext = context;
}
/**
* Performs the operation.
*
*
* Triggers a check of existence on the root folder of the server, granting
* that the request is not authenticated.
*
*
* Analyzes the result of check to find out what authentication method, if
* any, is requested by the server.
*/
@Override
protected RemoteOperationResult run(OwnCloudClient client) {
@Override
protected RemoteOperationResult run(OwnCloudClient client) {
RemoteOperationResult result = null;
AuthenticationMethod authMethod = AuthenticationMethod.UNKNOWN;
RemoteOperation operation = new ExistenceCheckRemoteOperation("", mContext, false);
client.clearCredentials();
client.setFollowRedirects(false);
// try to access the root folder, following redirections but not SAML SSO redirections
result = operation.execute(client);
String redirectedLocation = result.getRedirectedLocation();
String redirectedLocation = result.getRedirectedLocation();
while (!TextUtils.isEmpty(redirectedLocation) && !result.isIdPRedirection()) {
client.setBaseUri(Uri.parse(result.getRedirectedLocation()));
result = operation.execute(client);
redirectedLocation = result.getRedirectedLocation();
}
}
// analyze response
if (result.getHttpCode() == HttpStatus.SC_UNAUTHORIZED) {
// analyze response
if (result.getHttpCode() == HttpStatus.SC_UNAUTHORIZED || result.getHttpCode() == HttpStatus.SC_FORBIDDEN) {
ArrayList<String> authHeaders = result.getAuthenticateHeaders();
for (String header : authHeaders) {
// currently we only support basic auth
if (header.toLowerCase(Locale.ROOT).startsWith("basic")) {
if (header.toLowerCase(Locale.ROOT).contains("basic")) {
authMethod = AuthenticationMethod.BASIC_HTTP_AUTH;
break;
}
}
// else - fall back to UNKNOWN
} else if (result.isSuccess()) {
authMethod = AuthenticationMethod.NONE;
} else if (result.isIdPRedirection()) {
authMethod = AuthenticationMethod.SAML_WEB_SSO;
}
// else - fall back to UNKNOWN
Log_OC.d(TAG, "Authentication method found: " + authenticationMethodToString(authMethod));
if (authMethod != AuthenticationMethod.UNKNOWN) {
result = new RemoteOperationResult(true, result.getHttpCode(), result.getHttpPhrase(), null);
}
@ -125,22 +125,22 @@ public class DetectAuthenticationMethodOperation extends RemoteOperation {
data.add(authMethod);
result.setData(data);
return result; // same result instance, so that other errors
// can be handled by the caller transparently
}
private String authenticationMethodToString(AuthenticationMethod value) {
switch (value){
case NONE:
return "NONE";
case BASIC_HTTP_AUTH:
return "BASIC_HTTP_AUTH";
case BEARER_TOKEN:
return "BEARER_TOKEN";
case SAML_WEB_SSO:
return "SAML_WEB_SSO";
default:
return "UNKNOWN";
}
// can be handled by the caller transparently
}
private String authenticationMethodToString(AuthenticationMethod value) {
switch (value) {
case NONE:
return "NONE";
case BASIC_HTTP_AUTH:
return "BASIC_HTTP_AUTH";
case BEARER_TOKEN:
return "BEARER_TOKEN";
case SAML_WEB_SSO:
return "SAML_WEB_SSO";
default:
return "UNKNOWN";
}
}
}