[freeside-commits] freeside/FS/FS/part_export acct_google.pm, 1.1.2.2, 1.1.2.3

Mark Wells mark at wavetail.420.am
Tue Mar 22 14:03:20 PDT 2011


Update of /home/cvs/cvsroot/freeside/FS/FS/part_export
In directory wavetail.420.am:/tmp/cvs-serv2803/FS/FS/part_export

Modified Files:
      Tag: FREESIDE_2_1_BRANCH
	acct_google.pm 
Log Message:
load modules correctly for acct_google

Index: acct_google.pm
===================================================================
RCS file: /home/cvs/cvsroot/freeside/FS/FS/part_export/acct_google.pm,v
retrieving revision 1.1.2.2
retrieving revision 1.1.2.3
diff -u -w -d -r1.1.2.2 -r1.1.2.3
--- acct_google.pm	11 Mar 2011 02:09:14 -0000	1.1.2.2
+++ acct_google.pm	22 Mar 2011 21:03:17 -0000	1.1.2.3
@@ -3,6 +3,7 @@
 use strict;
 use vars qw(%info %SIG $CACHE);
 use Tie::IxHash;
+
 use base 'FS::part_export';
 
 tie my %options, 'Tie::IxHash',
@@ -88,6 +89,23 @@
   );
 }
 
+sub captcha_url {
+  my $self = shift;
+  my $google = $self->google_handle;
+  if (exists ($google->{'captcha_url'}) ) {
+    return 'http://www.google.com/accounts/'.$google->{'captcha_url'};
+  }
+  else {
+    return '';
+  }
+}
+
+sub captcha_auth {
+  my $self = shift;
+  my $response = shift;
+  my $google = $self->google_handle('captcha_response' => $response);
+  return (defined($google->{'token'}));
+}
 
 my %google_error = (
   1000 => 'unknown error',
@@ -113,7 +131,9 @@
 
 sub google_request {
   my ($self, $method, %opt) = @_;
-  my $google = $self->google_handle;
+  my $google = $self->google_handle(
+    'captcha_response' => delete $opt{'captcha_response'}
+  );
   return $google->{'error'} if $google->{'error'};
 
   # Throw away the result from this; we don't use it yet.
@@ -132,15 +152,23 @@
 
 sub google_handle {
   my $self = shift;
-  my $class = 'REST::Google::Apps::Provisioning';
-  eval "use $class";
-
-  die "failed to load $class\n" if $@;
+  my %opt = @_;
+  my @class = ( 
+    'REST::Google::Apps::Provisioning',
+    'Cache::FileCache',
+    'LWP::UserAgent 5.815',
+  );
+  foreach (@class) {
+    eval "use $_";
+    die "failed to load $_\n" if $@;
+  }
   $CACHE ||= new Cache::FileCache( {
       'namespace'   => __PACKAGE__,
       'cache_root'  => "$FS::UID::cache_dir/cache.$FS::UID::datasrc",
   } );
-  my $google = $class->new( 'domain'  => $self->option('domain') );
+  my $google = REST::Google::Apps::Provisioning->new(
+    'domain'  => $self->option('domain') 
+  );
 
   # REST::Google::Apps::Provisioning lacks error reporting.  We deal 
   # with that by hooking HTTP::Response to throw a useful fatal error 
@@ -167,24 +195,71 @@
     }
   );
 
-  my $cache_id = $self->exportnum . '_token';
-  $google->{'token'} = $CACHE->get($cache_id);
+  my $cache_token = $self->exportnum . '_token';
+  my $cache_captcha = $self->exportnum . '_captcha_token';
+  $google->{'token'} = $CACHE->get($cache_token);
   if ( !$google->{'token'} ) {
-    eval { 
-      $google->authenticate(
+    my %login = (
         'username'  => $self->option('username'),
         'password'  => $self->option('password'),
-      ) 
-    };
+    );
+    if ( $opt{'captcha_response'} ) {
+      $login{'logincaptcha'} = $opt{'captcha_response'};
+      $login{'logintoken'} = $CACHE->get($cache_captcha);
+    }
+    eval { $google->captcha_auth(%login); };
     if ( $@ ) {
-      # XXX CAPTCHA
       $google->{'error'} = $@->{'error'};
-      $CACHE->remove($cache_id);
+      $google->{'captcha_url'} = $@->{'captchaurl'};
+      $CACHE->set($cache_captcha, $@->{'captchatoken'}, '1 minute');
       return $google;
     }
-    $CACHE->set($cache_id, $google->{'token'}, '1 hour');
+    $CACHE->remove($cache_captcha);
+    $CACHE->set($cache_token, $google->{'token'}, '1 hour');
   }
   return $google;
 }
 
+# REST::Google::Apps::Provisioning also lacks a way to do this
+sub REST::Google::Apps::Provisioning::captcha_auth {
+  my $self = shift;
+
+  return( 1 ) if $self->{'token'};
+
+  my ( $arg );
+  %{$arg} = @_;
+
+  map { $arg->{lc($_)} = $arg->{$_} } keys %{$arg};
+
+  foreach my $param ( qw/ username password / ) {
+    $arg->{$param} || croak( "Missing required '$param' argument" );
+  }
+
+  my @postargs = (
+    'accountType' => 'HOSTED',
+    'service'     => 'apps',
+    'Email'       => $arg->{'username'} . '@' . $self->{'domain'},
+    'Passwd'      => $arg->{'password'},
+  );
+  if ( $arg->{'logincaptcha'} ) {
+    push @postargs, 
+      'logintoken'  => $arg->{'logintoken'},
+      'logincaptcha'=> $arg->{'logincaptcha'}
+      ;
+  }
+  my $response = $self->{'lwp'}->post(
+    'https://www.google.com/accounts/ClientLogin',
+    \@postargs
+  );
+
+  $response->is_success() || return( 0 );
+
+  foreach ( split( /\n/, $response->content() ) ) {
+    $self->{'token'} = $1 if /^Auth=(.+)$/;
+    last if $self->{'token'};
+  }
+
+  return( 1 ) if $self->{'token'} || return( 0 );
+}
+
 1;



More information about the freeside-commits mailing list