Package org.apache.abdera.ext.gdata

Source Code of org.apache.abdera.ext.gdata.GoogleLoginAuthScheme

/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements.  The ASF licenses this file to You
* 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.  For additional information regarding
* copyright in this work, please see the NOTICE file in the top level
* directory of this distribution.
*/
package org.apache.abdera.ext.gdata;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.Formatter;

import org.apache.abdera.protocol.client.AbderaClient;
import org.apache.abdera.protocol.client.ClientResponse;
import org.apache.abdera.protocol.client.RequestOptions;
import org.apache.abdera.util.Version;
import org.apache.commons.httpclient.Credentials;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.UsernamePasswordCredentials;
import org.apache.commons.httpclient.auth.AuthScheme;
import org.apache.commons.httpclient.auth.AuthenticationException;
import org.apache.commons.httpclient.auth.MalformedChallengeException;
import org.apache.commons.httpclient.auth.RFC2617Scheme;
import org.apache.commons.httpclient.methods.StringRequestEntity;

/**
* <p>Implements the GoogleLogin auth scheme used by gdata (Blogger, Google Calendar, etc).
* Warning: this scheme is slow!</p>
*
* <pre>
*   GoogleLoginAuthScheme.register();
*  
*   AbderaClient client = new CommonsClient();
*   client.addCredentials(
*     "http://beta.blogger.com",
*     null, "GoogleLogin",
*     new UsernamePasswordCredentials(
*       "email","password"));
* </pre>
*/
public class GoogleLoginAuthScheme
  extends RFC2617Scheme
  implements AuthScheme {
 
  public static void register(AbderaClient abderaClient, boolean exclusive) {
    AbderaClient.registerScheme("GoogleLogin", GoogleLoginAuthScheme.class);
    if (exclusive)
      ((AbderaClient)abderaClient).setAuthenticationSchemePriority("GoogleLogin");
    else
      ((AbderaClient)abderaClient).setAuthenticationSchemeDefaults();
  }
 
  private String service = null;
 
  @Override
  public void processChallenge(
    String challenge)
      throws MalformedChallengeException {
    super.processChallenge(challenge);
    service = getParameter("service");
  }
 
  public String authenticate(
    Credentials credentials,
    HttpMethod method)
      throws AuthenticationException {
    String auth = null;
    if (credentials instanceof UsernamePasswordCredentials) {
      UsernamePasswordCredentials usercreds =
        (UsernamePasswordCredentials) credentials;
      String id = usercreds.getUserName();
      String pwd = usercreds.getPassword();
      auth = getAuth(id, pwd);
    } else if (credentials instanceof GoogleLoginAuthCredentials) {
      GoogleLoginAuthCredentials gcreds =
        (GoogleLoginAuthCredentials) credentials;
      service = gcreds.getService();
      auth = gcreds.getAuth();
    } else {
      throw new AuthenticationException(
      "Cannot use credentials for GoogleLogin authentication");
    }
    StringBuffer buf = new StringBuffer("GoogleLogin ");
    buf.append(auth);
    return buf.toString();
  }
 
  public String authenticate(
    Credentials credentials,
    String method,
    String uri)
      throws AuthenticationException {
    return authenticate(credentials, null);
  }
 
  public String getSchemeName() {
    return "GoogleLogin";
  }
 
  public boolean isComplete() {
    return true;
  }
 
  public boolean isConnectionBased() {
    return false;
  }
 
 
  protected String getAuth(String id, String pwd) {
    return getAuth(id, pwd, service);
  }
 
  protected String getAuth(String id, String pwd, String service) {
    try {
      AbderaClient abderaClient = new AbderaClient();
      Formatter f = new Formatter();
      f.format(
        "Email=%s&Passwd=%s&service=%s&source=%s",
        URLEncoder.encode(id, "utf-8"),
        URLEncoder.encode(pwd, "utf-8"),
        (service != null) ? URLEncoder.encode(service, "utf-8") : "",
        URLEncoder.encode(Version.APP_NAME, "utf-8"));
      StringRequestEntity stringreq = new StringRequestEntity(
        f.toString(),"application/x-www-form-urlencoded","utf-8");
      String uri = "https://www.google.com/accounts/ClientLogin";
      RequestOptions options = abderaClient.getDefaultRequestOptions();
      options.setContentType("application/x-www-form-urlencoded");
      ClientResponse response = abderaClient.post(uri, stringreq, options);
      InputStream in = response.getInputStream();
      ByteArrayOutputStream out = new ByteArrayOutputStream();
      int n = -1;
      while ((n = in.read()) != -1) { out.write(n); }
      out.flush();
      response.release();
      String auth = new String(out.toByteArray());
      return auth.split("\n")[2].replaceAll("Auth=", "auth=");
    } catch (Exception e) {}
    return null;
  }

  public static String getGoogleLogin(String id, String pwd, String service) {
    String auth = (new GoogleLoginAuthScheme()).getAuth(id, pwd, service);
    StringBuffer buf = new StringBuffer("GoogleLogin ");
    buf.append(auth);
    return buf.toString();
  }
}
TOP

Related Classes of org.apache.abdera.ext.gdata.GoogleLoginAuthScheme

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.