Skip to content

Commit

Permalink
Merge pull request #4646 from nextcloud/backport/4644/stable-3.8
Browse files Browse the repository at this point in the history
[stable-3.8] Allow broader check on CheckAuth
  • Loading branch information
tobiasKaminsky authored Oct 9, 2019
2 parents 889258b + bd00eeb commit 82af789
Showing 1 changed file with 39 additions and 39 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/**
* ownCloud Android client application
* ownCloud Android client application
*
* @author David A. Velasco
* Copyright (C) 2015 ownCloud Inc.
Expand Down Expand Up @@ -46,101 +46,101 @@
* {@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);
}
ArrayList<Object> data = new ArrayList<>();
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";
}
}

}

0 comments on commit 82af789

Please sign in to comment.