package blackberry.web.widget.auth; import java.io.IOException; import java.util.Hashtable; import java.util.Vector; import javax.microedition.io.HttpConnection; import net.rim.device.api.ui.UiApplication; import net.rim.device.api.io.Base64OutputStream; import net.rim.device.api.browser.field2.BrowserFieldRequest; import net.rim.device.api.io.http.HttpHeaders; import net.rim.device.api.util.StringUtilities; import net.rim.device.api.ui.component.Dialog; public class Authenticator { // In the future, may consider organize the protocol name and handler with a map/hashtable public final static String BASIC_PROTOCOL = "basic"; public final static String WWW_AUTHENTICATION_HEADER = "www-authenticate"; public final static String RIM_AUTHENTICATION_HEADER = "x-rim-authenticate"; public static BrowserFieldRequest getAuthenticationRequest( HttpConnection response, BrowserFieldRequest request ) { String hostName = response.getHost(); if( !CredentialBank.hasCredential( hostName ) ) { String domain = getAuthenticationDomain( response ); System.out.println( "NTLM==>getAuthenticationDomain: " + domain ); invokeAuthenticationDialogAndStoreCredential( hostName, domain ); } return CredentialBank.createRequestInCredentialBank( response, request ); } public static void verifyCredential( HttpConnection response ) { String hostName = response.getHost(); CredentialBank.verifyCredential( hostName ); } private static void invokeAuthenticationDialogAndStoreCredential( String hostName, String domain ) { // ask user for credential final AuthenticationScreen askCredential = new AuthenticationScreen( hostName, domain ); UiApplication.getUiApplication().invokeAndWait( new Runnable() { public void run() { int ret = askCredential.doModal(); if( ret == Dialog.CANCEL ) { askCredential.setCancelled(); } } } ); String username = askCredential.getUsername(); String password = askCredential.getPassword(); CredentialBank.storeCredential( hostName, username, password ); } public static BrowserFieldRequest createRequestWithAuthentication( String user, String password, HttpConnection response, BrowserFieldRequest request ) { if( user == null || user.length() == 0 || password == null || password.length() == 0 ) { return request; } String authCredential = user + ":" + password; // Encode the login information in Base64 format. byte[] encoded = null; try { encoded = Base64OutputStream.encode( authCredential.getBytes(), 0, authCredential.length(), false, false ); } catch( IOException ioe ) { encoded = null; } if( encoded == null ) { return request; } String base64AuthCredential = new String( encoded ); HttpHeaders httpHead = request.getHeaders().cloneHeaders(); httpHead.setProperty( "Authorization", "Basic " + base64AuthCredential ); return new BrowserFieldRequest( request.getURL(), request.getPostData(), httpHead ); } private static String getAuthenticationDomain( HttpConnection response ) { final String domainToken = "domain="; String value = null; String headerField; int n = 0; try { while( response.getHeaderField( n ) != null ) { headerField = StringUtilities.removeChars( response.getHeaderField( n ), " " ); if( headerField.toLowerCase().indexOf( domainToken ) == 0 ) { value = headerField.substring( domainToken.length() ); break; } n++; } } catch( IOException ioe ) { } return value; } }