/**
* Copyright 2010 JBoss Inc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.eclipse.webdav.internal.authentication;
import java.io.UnsupportedEncodingException;
import java.net.Authenticator;
import java.net.URL;
import java.util.Map;
import org.eclipse.webdav.http.client.IAuthenticator;
import org.eclipse.webdav.http.client.Request;
import org.eclipse.webdav.internal.kernel.utils.Assert;
/**
* The <code>BasicAuthority</code> provides the necessary behavior to
* authorizes client <code>Request</codes>s for communication with HTTP
* servers using the Basic authentication scheme.
*
* @see AuthorizationAuthority
*/
public class BasicAuthority extends AuthorizationAuthority {
/**
* Creates a new authenticator that stores its authentication information
* in the given authentication store.
* <p>The <code>BasicAuthenticator</code> authenticates according to the
* "Basic" authentication scheme.
* <p>Instances of this class must not be created directly, instead, use
* an instance of the class <code>Authenticator</code> to authorize
* requests.
*
* @param authenticationStore a store that holds authentication
* information
*/
public BasicAuthority(IAuthenticator authenticationStore) {
super(authenticationStore);
}
/**
* Returns the Basic authorization credentials for the given username and
* password. The credentials have the following form:
* <code>
* credentials = "Basic" basic-credentials
* basic-credentials = base64-user-pass
* base64-user-pass = <base64 encoding of user-pass, except not
* limited to 76 char/line>
* user-pass = userid ":" password
* userid = *<TEXT excluding ":">
* password = *TEXT
* </code>
* <P>Userids might be case sensitive.
* <P>For example, if the user's name is "Aladdin" and the user's
* password is "open sesame", the following credentials are supplied:
* <code>
* Basic QWxhZGRpbjpvcGVuIHN1c2FtZQ==
* </code>
* @param username
* @param password
* @return the Basic authorization credentials for the given
* username and password
*/
private String credentials(String username, String password) {
Assert.isNotNull(username);
Assert.isNotNull(password);
String userpass = username + ":" + password; //$NON-NLS-1$
byte[] data = null;
try {
data = userpass.getBytes("UTF8"); //$NON-NLS-1$
} catch (UnsupportedEncodingException e) {
data = userpass.getBytes();
}
return "Basic " + Base64Encoder.encode(data); //$NON-NLS-1$
}
/**
* @see Authenticator#getAuthenticationInfo(AuthenticateChallenge, Map, URL, URL)
*/
protected Map getAuthenticationInfo(AuthenticateChallenge challenge, Map oldInfo, URL serverUrl, URL protectionSpaceUrl) {
Assert.isNotNull(challenge);
Assert.isNotNull(serverUrl);
Assert.isNotNull(protectionSpaceUrl);
return authenticatorStore.requestAuthenticationInfo(protectionSpaceUrl, challenge.getRealm(), challenge.getAuthScheme());
}
/**
* @see Authenticator#getAuthorization(Request, Map, URL, URL, URL)
*/
protected String getAuthorization(Request request, Map info, URL serverUrl, URL protectionSpaceUrl, URL proxyServerUrl) {
Assert.isNotNull(request);
Assert.isNotNull(info);
Assert.isNotNull(serverUrl);
Assert.isNotNull(protectionSpaceUrl);
String username = (String) info.get("username"); //$NON-NLS-1$
String password = (String) info.get("password"); //$NON-NLS-1$
if (username == null || password == null) {
return null;
}
return credentials(username, password);
}
}