[ljcom] r10463: LJSUP-8688 (Google integration)
Committer: ailyin
LJSUP-8688 (Google integration)A trunk/cgi-bin/LJ/Client/Google.pm A trunk/cgi-bin/LJ/Identity/Google.pm A trunk/cgi-bin/LJ/Talk/Author/Google.pm A trunk/htdocs/identity/callback-google.bml A trunk/htdocs/identity/google-interstitial.bml A trunk/htdocs/identity/google-interstitial.bml.text.local U trunk/htdocs/identity/login.bml.text.local A trunk/htdocs/img/google-profile.gif U trunk/htdocs/talkpost.bml.text.local U trunk/htdocs/userinfo.bml.text.local A trunk/templates/CommentForm/Author-Google.tmpl A trunk/templates/CommentForm/AuthorDisabled-Google.tmpl A trunk/templates/CommentForm/AuthorTitle-Google.tmpl A trunk/templates/Identity/GoogleInterstitial.tmpl A trunk/templates/Identity/GoogleInterstitialCompact.tmpl A trunk/templates/Identity/Login-google.tmpl
Added: trunk/cgi-bin/LJ/Client/Google.pm
===================================================================
--- trunk/cgi-bin/LJ/Client/Google.pm (rev 0)
+++ trunk/cgi-bin/LJ/Client/Google.pm 2011-05-03 03:22:27 UTC (rev 10463)
@@ -0,0 +1,102 @@
+package LJ::Client::Google;
+use strict;
+use warnings;
+
+sub fetch_access_token {
+ my ( $class, $opts ) = @_;
+
+ my $postdata = {
+ 'client_id' => $LJ::GOOGLE_OAUTH_CONF->{'client_id'},
+ 'client_secret' => $LJ::GOOGLE_OAUTH_CONF->{'client_secret'},
+ };
+
+ if ( my $code = $opts->{'code'} ) {
+ $postdata->{'code'} = $code;
+ $postdata->{'grant_type'} = 'authorization_code';
+
+ } elsif ( my $refresh_token = $opts->{'refresh_token'} ) {
+ $postdata->{'refresh_token'} = $refresh_token;
+ $postdata->{'grant_type'} = 'refresh_token';
+
+ }
+
+ my $ua = $class->get_useragent;
+
+ my $res = $ua->post( 'https://accounts.google.com/o/oauth2/token',
+ $postdata );
+
+ unless ( $res->is_success ) {
+ require Data::Dumper;
+ warn 'google connectivity error: ' .
+ Data::Dumper::Dumper($res);
+ die 'google connectivity error';
+ }
+
+ return LJ::JSON->from_json( $res->content );
+}
+
+sub save_access_token {
+ my ( $class, $u, $token_info ) = @_;
+
+ die 'no user to save the token in'
+ unless $u;
+
+ $u->set_prop( {
+ 'google_access_token' => $token_info->{'access_token'},
+ 'google_refresh_token' => $token_info->{'refresh_token'},
+ 'google_token_expire' => time + $token_info->{'expires_in'},
+ } );
+}
+
+sub get_user_access_token {
+ my ( $class, $u ) = @_;
+
+ if ( $u->prop('google_token_expire') >= time ) {
+ my $token_info = $class->fetch_access_token( {
+ 'refresh_token' => $u->prop('google_refresh_token'),
+ } );
+
+ $class->save_access_token( $u, $token_info );
+ }
+
+ return $u->prop('google_access_token');
+}
+
+sub fetch_userinfo {
+ my ( $class, $opts ) = @_;
+
+ my $access_token = $opts->{'access_token'};
+
+ unless ( $access_token ) {
+ my $u = $opts->{'user'};
+
+ die 'no access token passed and no user to extract it from'
+ unless $u;
+
+ $access_token = $class->get_user_access_token($u);
+ }
+
+ my $url = 'https://www-opensocial.googleusercontent.com/'
+ . 'api/people/@me/@self?'
+ . 'oauth_token=' . $access_token;
+
+ my $ua = $class->get_useragent;
+
+ my $res = $ua->get($url);
+
+ unless ( $res->is_success ) {
+ require Data::Dumper;
+ warn 'google connectivity error: ' .
+ Data::Dumper::Dumper($res);
+ die 'google connectivity error';
+ }
+
+ my $result_hash = LJ::JSON->from_json( $res->content );
+ return $result_hash->{'entry'};
+}
+
+sub get_useragent {
+ return LJ::get_useragent( 'role' => 'google_auth' );
+}
+
+1;
Added: trunk/cgi-bin/LJ/Identity/Google.pm
===================================================================
--- trunk/cgi-bin/LJ/Identity/Google.pm (rev 0)
+++ trunk/cgi-bin/LJ/Identity/Google.pm 2011-05-03 03:22:27 UTC (rev 10463)
@@ -0,0 +1,143 @@
+package LJ::Identity::Google;
+use strict;
+use warnings;
+
+use base qw( LJ::Identity );
+
+sub typeid { 'G' }
+sub pretty_type { 'Google' }
+sub short_code { 'google' }
+
+sub enabled {
+ return LJ::is_enabled('twitter_auth')
+ && $LJ::GOOGLE_OAUTH_CONF;
+}
+
+## GFC version, drop this
+# sub attempt_login {
+# my ($class, $errs, %opts) = @_;
+#
+# $errs ||= [];
+# my $returl = $opts{'returl'} || $LJ::SITEROOT;
+# my $returl_fail = $opts{'returl_fail'} || $returl || $LJ::SITEROOT;
+#
+# my $fcauth
+# = LJ::Request->cookie( 'fcauth' . $LJ::GOOGLE_FC_CONF->{'site_id'} );
+#
+# die 'no fcauth cookie'
+# unless $fcauth;
+#
+# my $profile = LJ::Client::GoogleFC->fetch_user_profile( {
+# 'fcauth' => $fcauth,
+# } );
+#
+# # callback-google.bml logic goes here, yo
+# die;
+# }
+
+sub attempt_login {
+ my ($class, $errs, %opts) = @_;
+
+ my $forwhat = $opts{'forwhat'} || 'login';
+
+ my $callback_url = "$LJ::SITEROOT/identity/callback-google.bml?" .
+ 'forwhat=' . $forwhat;
+
+ my $addr = 'https://accounts.google.com/o/oauth2/auth?'
+ . 'scope=' . LJ::eurl('https://www.google.com/m8/feeds/') . '&'
+ . 'client_id=' . $LJ::GOOGLE_OAUTH_CONF->{'client_id'} . '&'
+ . 'redirect_uri=' . LJ::eurl($callback_url) . '&'
+ . 'response_type=code';
+
+ return LJ::Request->redirect($addr);
+}
+
+sub initialize_user {
+ my ($self, $u, $extra) = @_;
+
+ my $ua = LJ::Client::Google->get_useragent;
+
+ my $token_info = $extra->{'token_info'};
+ my $userinfo = $extra->{'userinfo'};
+
+ die "no access token passed" unless $token_info;
+
+ my $userdata = $extra->{'userdata'};
+ unless ($userinfo) {
+ $userinfo = LJ::Client::Google->fetch_userinfo( {
+ 'access_token' => $token_info->{'access_token'},
+ } );
+ }
+
+ my $googleuserid = $userinfo->{'id'};
+
+ ## INITIALIZE USER PROFILE
+
+ my $name = $userinfo->{'displayName'};
+ my $link = $userinfo->{'profileUrl'};
+
+ # these are pretty much essential and cannot be changed by the
+ # user: the access token we're using to communicate on the user's
+ # behalf, their name, and the link to their profile
+ LJ::Client::Google->save_access_token( $u, $token_info );
+
+ $u->set_prop( 'google_userid' => $googleuserid );
+ $u->set_prop( 'google_name' => $name );
+ $u->set_prop( 'google_link' => $link );
+
+ # google doesn't let us know their gender, so default to unspecified
+ $u->set_prop( 'gender' => 'U' );
+
+ # the name specified in profile; this can actually be changed
+ # by the user later in the profile settings
+ LJ::update_user( $u, { 'name' => $name } );
+
+ # userpic
+ my $upidata = $ua->get( $userinfo->{'thumbnailUrl'} )->content;
+
+ my $userpic = eval { LJ::Userpic->create($u, data => \$upidata) };
+ $userpic->make_default if $userpic;
+
+ # website
+ $u->set_prop( 'url' => $link );
+
+ # facebook identities are plus accounts by default
+ $u->add_to_class('plus');
+
+ # until they get notifications set, they don't get anything
+ LJ::update_user($u, { 'opt_gettalkemail' => 'N' });
+
+ # ping events feed to let subscribers know of this account
+ LJ::run_hooks('profile_save', $u);
+}
+
+sub url {
+ my ($self, $u) = @_;
+
+ # the 'url' prop should have been set by the initialization code;
+ # failing that, let's not re-fetch the website from there, and let's
+ # link to their facebook profile instead.
+ return $u->prop('google_link');
+}
+
+sub display_name {
+ my ($self, $u) = @_;
+ return $u->prop('google_name') || $u->username;
+}
+
+sub ljuser_display_params {
+ my ($self, $u, $opts) = @_;
+
+ return {
+ 'journal_url' => $u->prop('google_link') || 'about:blank',
+ 'journal_name' => $u->display_name,
+ 'userhead' => 'google-profile.gif',
+ 'userhead_w' => 16,
+ };
+}
+
+sub profile_window_title {
+ return LJ::Lang::ml('/userinfo.bml.title.googleprofile');
+}
+
+1;
Added: trunk/cgi-bin/LJ/Talk/Author/Google.pm
===================================================================
--- trunk/cgi-bin/LJ/Talk/Author/Google.pm (rev 0)
+++ trunk/cgi-bin/LJ/Talk/Author/Google.pm 2011-05-03 03:22:27 UTC (rev 10463)
@@ -0,0 +1,8 @@
+package LJ::Talk::Author::Google;
+use strict;
+
+use base qw( LJ::Talk::Author::Identity );
+
+sub identity_class { 'LJ::Identity::Google' }
+
+1;
Added: trunk/htdocs/identity/callback-google.bml
===================================================================
--- trunk/htdocs/identity/callback-google.bml (rev 0)
+++ trunk/htdocs/identity/callback-google.bml 2011-05-03 03:22:27 UTC (rev 10463)
@@ -0,0 +1,81 @@
+<?page
+body<=
+<?_code
+{
+#line 6
+ use strict;
+ use vars qw($title);
+ use LJ::Client::Google;
+
+ # user will unlikely ever need to see this
+ $title = 'Google Landing Page';
+
+ my $forwhat = LJ::Request->get_param('forwhat') || 'login';
+
+ my ($returl, $returl_fail);
+ eval {
+ ($returl, $returl_fail) =
+ LJ::Identity::Google->unpack_forwhat($forwhat);
+ };
+
+ return LJ::Lang::ml('error.invalidform') if $@;
+
+ unless (LJ::Identity::Google->enabled) {
+ return 'This feature is disabled.';
+ }
+
+ my $code = LJ::Request->get_param('code');
+
+ unless ( $code ) {
+ require Data::Dumper;
+
+ warn 'could not get code from Google ' .
+ '(this could be a user cancel) ' .
+ Data::Dumper::Dumper(\%GET);
+
+ return LJ::Request->redirect($returl_fail);
+ }
+
+ my $token_info
+ = LJ::Client::Google->fetch_access_token( { 'code' => $code } );
+
+ my $created;
+
+ my $userinfo = LJ::Client::Google->fetch_userinfo( {
+ 'access_token' => $token_info->{'access_token'},
+ } );
+
+ my $u = LJ::User::load_identity_user(
+ 'V', $userinfo->{'id'},
+ { 'token_info' => $token_info, 'userinfo' => $userinfo },
+ \$created
+ );
+
+ LJ::Client::Google->save_access_token( $u, $token_info );
+
+ # do we need to re-initialize every time? either fix this, or drop this
+ # LJ::Identity::Google->initialize_user( $u, $token_info );
+
+ # send out a P3P header thing so as to work around IE's
+ # unwillingness to receive our cookies while we're in an iframe
+ # affects the partner sites authorization
+ LJ::Session->allow_login_from_iframe;
+
+ $u->make_login_session('long', 0);
+ LJ::set_remote($u);
+
+ return LJ::Request->redirect($returl) unless $created;
+
+ my $redirect_url = "$LJ::SITEROOT/identity/google-interstitial.bml?" .
+ 'ret=' . LJ::eurl($returl) . '&' .
+ 'forwhat=' . LJ::eurl($forwhat);
+
+ return LJ::Request->redirect($redirect_url);
+}
+_code?>
+<=body
+title=><?_code return $title; _code?>
+head<=
+<?_code return $headextra; _code?>
+<=head
+page?>
\ No newline at end of file
Added: trunk/htdocs/identity/google-interstitial.bml
===================================================================
--- trunk/htdocs/identity/google-interstitial.bml (rev 0)
+++ trunk/htdocs/identity/google-interstitial.bml 2011-05-03 03:22:27 UTC (rev 10463)
@@ -0,0 +1,205 @@
+<?_code
+{
+#line 4
+ use strict;
+ use vars qw($title);
+
+ use Carp qw();
+
+ $title = LJ::Lang::ml('.title');
+
+ my $remote = LJ::get_remote();
+ unless ( $remote
+ && $remote->is_identity
+ && $remote->identity->short_code eq 'google' )
+ {
+ return LJ::Request->redirect("$LJ::SITEROOT/login.bml");
+ }
+
+ my $returl = LJ::Request->get_param('ret') || $LJ::SITEROOT;
+ my $forwhat = LJ::Request->get_param('forwhat') || 'login';
+
+ my $external_site_case = ( $forwhat eq 'external' );
+
+ my @errors;
+ my $step2 = 0;
+
+ my $handle_post = sub {
+ if (!LJ::check_form_auth()) {
+ push @errors, LJ::Lang::ml('error.invalidform');
+ return;
+ }
+
+ return LJ::Request->redirect($returl) if $POST{'next'};
+
+ if (!LJ::Request->post_param('subscribe')) {
+ return LJ::Request->redirect($returl);
+ }
+
+ my $email = LJ::Request->post_param('email');
+
+ my @email_errors;
+ LJ::check_email($email, \@email_errors);
+
+ if ($LJ::USER_EMAIL and $email =~ /\@\Q$LJ::USER_DOMAIN\E$/i) {
+ push @email_errors,
+ LJ::Lang::ml(
+ 'widget.createaccount.error.email.lj_domain',
+ { domain => $LJ::USER_DOMAIN }
+ );
+ }
+
+ if (@email_errors) {
+ push @errors, @email_errors;
+ return;
+ }
+
+ my $u = $remote;
+
+ LJ::update_user($remote, {
+ 'email' => $email,
+
+ # validated email becomes transitioning, transitioning
+ # or non-validated stay intact
+ 'status' => $u->email_status eq 'N' ? 'N' : 'T',
+ });
+
+ # send validation mail
+ my $aa = LJ::register_authaction($u->{'userid'},
+ 'validateemail', $email);
+
+ LJ::send_mail({
+ 'to' => $email,
+ 'from' => $LJ::DONOTREPLY_EMAIL,
+ 'charset' => 'utf-8',
+ 'subject' => LJ::Lang::ml('email.newacct.subject'),
+ 'body' => LJ::Lang::ml(
+ 'email.newacct.google.body',
+ {
+ username => $u->username,
+ display_name => $u->display_name,
+ sitename => $LJ::SITENAME,
+ siteroot => $LJ::SITEROOT,
+ conflink => "$LJ::SITEROOT/confirm/$aa->{'aaid'}." .
+ $aa->{'authcode'},
+ }
+ ),
+ });
+
+ # copypasta from LJ::Hooks::CreatePage with adjustments
+ # possibly refactor to reduce code duplication?
+
+ # we are not anymore using this. ugh.
+ LJ::update_user($u, {'opt_gettalkemail' => 'N'});
+
+ my @subs = (
+ 'CommentReply',
+ 'Befriended-u',
+ 'UserMessageRecvd-u',
+ 'InvitedFriendJoins-u',
+ 'NewUserpic',
+ 'Birthday',
+ 'NewVGift',
+ );
+
+ ## LJINT-362 (Comments for side projects):
+ ## in case an account is created on an external site, only
+ ## subscribe them to comment replies
+ if ( $external_site_case ) {
+ @subs = qw( CommentReply );
+ }
+
+ my $set = LJ::Subscription::GroupSet->fetch_for_user($u);
+ my $newset = $set->clone;
+
+ my @ntypeids = map { LJ::NotificationMethod->method_to_ntypeid($_) }
+ qw(Inbox Email);
+
+ foreach my $subcode (@subs) {
+ my $journalid = 0;
+
+ if ($subcode =~ /\-u$/) {
+ $journalid = $u->id;
+ $subcode =~ s/\-u$//;
+ }
+
+ my %sub = (
+ 'userid' => $u->id,
+ 'journalid' => $journalid,
+ 'etypeid' => LJ::Event->event_to_etypeid($subcode),
+ 'arg1' => 0,
+ 'arg2' => 0,
+ 'is_dirty' => 0,
+ 'ntypeid' => 0,
+ 'createtime' => time,
+ 'expiretime' => 0,
+ 'flags' => 0,
+ );
+
+ foreach my $ntypeid (@ntypeids) {
+ $sub{'ntypeid'} = $ntypeid;
+ $newset->insert_sub(bless({%sub}, 'LJ::Subscription'));
+ }
+ }
+
+ eval {
+ $set->update($newset);
+ };
+
+ if ($@) {
+ # theoretically, we didn't subscribe to any tracking subs yet,
+ # so there shouldn't be any errors, but if there are any,
+ # let's report
+ Carp::cluck "error subscribing user: " . $u->id;
+ }
+
+ $step2 = 1;
+ };
+
+ if (LJ::Request->did_post) {
+ $handle_post->();
+ return if LJ::Request->redirected;
+
+ ## LJINT-362 (Comments for side projects):
+ ## for external sites, there is no step 2; just
+ ## redirect them to the appropriate iframe
+ if ( $external_site_case && $step2 ) {
+ return LJ::Request->redirect( $returl );
+ }
+ }
+
+ my $mode = LJ::Request->get_param('mode');
+ unless ( defined $mode ) {
+ $mode = $external_site_case ? 'compact' : 'full';
+ }
+
+ my $template_file = $mode eq 'compact' ? 'GoogleInterstitialCompact.tmpl'
+ : 'GoogleInterstitial.tmpl';
+
+ my $template = LJ::HTML::Template->new(
+ { use_expr => 1 }, # force HTML::Template::Pro with Expr support
+ filename => "$ENV{'LJHOME'}/templates/Identity/$template_file",
+ die_on_bad_params => 0,
+ strict => 0,
+ ) or die "Can't open template: $!";
+
+ $template->param(
+ 'errors' => [ map { { 'error' => $_ } } @errors ],
+ 'form_intro' => LJ::form_auth(),
+ 'form_email' => LJ::ehtml(LJ::Request->post_param('email')),
+ 'ml_congrats' => LJ::Lang::ml('.congrats', {
+ 'username' => $remote->ljuser_display, }),
+ 'step2' => $step2,
+ 'ml_validation' => LJ::Lang::ml('.validation', { resend_url => "$LJ::SITEROOT/register.bml" }),
+ );
+
+ if ( $mode eq 'compact' ) {
+ return $template->output;
+ } else {
+ return BML::render_page({
+ 'body' => $template->output,
+ 'title' => $title,
+ });
+ }
+}
+_code?>
Added: trunk/htdocs/identity/google-interstitial.bml.text.local
===================================================================
--- trunk/htdocs/identity/google-interstitial.bml.text.local (rev 0)
+++ trunk/htdocs/identity/google-interstitial.bml.text.local 2011-05-03 03:22:27 UTC (rev 10463)
@@ -0,0 +1,21 @@
+.btn.proceed=Save and proceed
+
+.btn.next=Next
+
+.congrats=Congratulations, [[username]], your accounts are now connected.
+
+.desc=Log into LiveJournal with your Google account and get instant access to LiveJournal, including commenting, friend-finding, uploading userpics, and more!
+
+.heading.subscribe=Do you want to receive email notifications?
+
+.label.email=Enter your email:
+
+.label.subscribe.yes=Yes
+
+.label.subscribe.no=No
+
+.title=Log in with OpenID and more
+
+.tip.email=This is where you’ll get notifications and important account information. We will never share or sell your email address!
+
+.validation=Validation...[[resend_url]]
Modified: trunk/htdocs/identity/login.bml.text.local
===================================================================
--- trunk/htdocs/identity/login.bml.text.local 2011-04-29 07:43:04 UTC (rev 10462)
+++ trunk/htdocs/identity/login.bml.text.local 2011-05-03 03:22:27 UTC (rev 10463)
@@ -2,6 +2,10 @@
.facebook.desc=Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut gravida nunc vitae purus egestas lobortis. Morbi varius ligula vitae diam vehicula a elementum felis sagittis. Morbi in sapien sit amet lectus dignissim consequat nec eu arcu.
+.google.btn.connect=Connect
+
+.google.desc=Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut gravida nunc vitae purus egestas lobortis. Morbi varius ligula vitae diam vehicula a elementum felis sagittis. Morbi in sapien sit amet lectus dignissim consequat nec eu arcu.
+
.mailru.btn.connect=Enter from @Mail.ru
.mailru.desc=Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut gravida nunc vitae purus egestas lobortis. Morbi varius ligula vitae diam vehicula a elementum felis sagittis. Morbi in sapien sit amet lectus dignissim consequat nec eu arcu.
@@ -16,6 +20,8 @@
.tab.vkontakte=Vkontakte
+.tab.google=Google
+
.twitter.btn.connect=Sign in with Twitter
.twitter.desc=Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut gravida nunc vitae purus egestas lobortis. Morbi varius ligula vitae diam vehicula a elementum felis sagittis. Morbi in sapien sit amet lectus dignissim consequat nec eu arcu.
Added: trunk/htdocs/img/google-profile.gif
===================================================================
(Binary files differ)
Property changes on: trunk/htdocs/img/google-profile.gif
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Modified: trunk/htdocs/talkpost.bml.text.local
===================================================================
--- trunk/htdocs/talkpost.bml.text.local 2011-04-29 07:43:04 UTC (rev 10462)
+++ trunk/htdocs/talkpost.bml.text.local 2011-05-03 03:22:27 UTC (rev 10463)
@@ -7,6 +7,10 @@
.facebook.who.you.are=We will figure who you are
+.google=Google
+
+.google.who.you.are=We will figure who you are
+
.livejournal=LiveJournal
.loginq=Log in?
Modified: trunk/htdocs/userinfo.bml.text.local
===================================================================
--- trunk/htdocs/userinfo.bml.text.local 2011-04-29 07:43:04 UTC (rev 10462)
+++ trunk/htdocs/userinfo.bml.text.local 2011-05-03 03:22:27 UTC (rev 10463)
@@ -136,6 +136,8 @@
.title.facebookprofile=Profile
+.title.googleprofile=Profile
+
.title.mailruprofile=Mail.ru profile
.title.twitterprofile=Profile
Added: trunk/templates/CommentForm/Author-Google.tmpl
===================================================================
--- trunk/templates/CommentForm/Author-Google.tmpl (rev 0)
+++ trunk/templates/CommentForm/Author-Google.tmpl 2011-05-03 03:22:27 UTC (rev 10463)
@@ -0,0 +1,89 @@
+<TMPL_IF everyone_can_comment>
+ <TMPL_IF is_identity>
+ <div class="b-postform-login-item b-postform-login-google">
+ <input type="radio" tabindex="16" name="usertype" value="google_cookie" id="talkpostfromgoogli" class="b-postform-login-radio" <TMPL_IF whocheck_google_cookie>checked="checked"</TMPL_IF> />
+ <label for="talkpostfromgoogli" class="b-postform-login-service"><TMPL_VAR expr="ml('/talkpost.bml.google')"></label>
+ <div class="b-postform-login-opts">
+ <strong><TMPL_VAR remote_display_name></strong>
+ <TMPL_VAR ml_willscreen>
+ </div>
+ </div>
+ <TMPL_ELSE>
+ <div class="b-postform-login-item b-postform-login-google">
+ <input type="radio" tabindex="16" name="usertype" value="google" id="talkpostfromgooglo" class="b-postform-login-radio" <TMPL_IF whocheck_google>checked="checked"</TMPL_IF> />
+ <label for="talkpostfromgooglo" class="b-postform-login-service"><TMPL_VAR expr="ml('/talkpost.bml.google')"></label>
+ <div class="b-postform-login-opts">
+ <span class="i-bubble b-bubble-lite"><i class="i-bubble-arrow-border"></i><i class="i-bubble-arrow"></i><TMPL_VAR expr="ml('/talkpost.bml.google.who.you.are')"><TMPL_VAR helpicon_google></span>
+ <TMPL_VAR ml_willscreen>
+ </div>
+ </div>
+ </TMPL_IF>
+<TMPL_ELSIF registered_can_comment>
+ <TMPL_IF is_trusted_identity>
+ <TMPL_IF remote_banned>
+ <div class="b-postform-login-item b-postform-login-google">
+ <div class="b-postform-login-opts">
+ <TMPL_VAR ml_loggedin>
+ <TMPL_VAR ml_banned>
+ </div>
+ </div>
+ <TMPL_ELSE>
+ <div class="b-postform-login-item b-postform-login-google">
+ <input type="radio" tabindex="16" name="usertype" value="google_cookie" id="talkpostfromgoogli" class="b-postform-login-radio" <TMPL_IF whocheck_google_cookie>checked="checked"</TMPL_IF> />
+ <label for="talkpostfromgoogli" class="b-postform-login-service"><TMPL_VAR expr="ml('/talkpost.bml.google')"></label>
+ <div class="b-postform-login-opts">
+ <strong><TMPL_VAR remote_display_name></strong>
+ <TMPL_VAR ml_willscreen>
+ </div>
+ </div>
+ </TMPL_IF>
+ <TMPL_ELSIF is_identity>
+ <div class="b-postform-login-item b-postform-login-google b-postform-login-disabled">
+ <span class="b-postform-login-service"><TMPL_VAR expr="ml('/talkpost.bml.google')"></span>
+ <div class="b-postform-login-opts">
+ <TMPL_VAR ml_noopenidpost>
+ <TMPL_VAR helpicon_google>
+ </div>
+ </div>
+ <TMPL_ELSE>
+ <div class="b-postform-login-item b-postform-login-google">
+ <input type="radio" tabindex="16" name="usertype" value="google" id="talkpostfromgooglo" class="b-postform-login-radio" <TMPL_IF whocheck_google>checked="checked"</TMPL_IF> />
+ <label for="talkpostfromgooglo" class="b-postform-login-service"><TMPL_VAR expr="ml('/talkpost.bml.google')"></label>
+ <div class="b-postform-login-opts">
+ <span class="i-bubble b-bubble-lite"><i class="i-bubble-arrow-border"></i><i class="i-bubble-arrow"></i><TMPL_VAR expr="ml('/talkpost.bml.google.who.you.are')"><TMPL_VAR helpicon_google></span>
+ <TMPL_VAR ml_willscreen>
+ </div>
+ </div>
+ </TMPL_IF>
+<TMPL_ELSIF friends_can_comment>
+ <TMPL_IF is_identity>
+ <TMPL_IF remote_can_comment>
+ <div class="b-postform-login-item b-postform-login-google">
+ <input type="radio" tabindex="16" name="usertype" value="google_cookie" id="talkpostfromgoogli" class="b-postform-login-radio" <TMPL_IF whocheck_google_cookie>checked="checked"</TMPL_IF> />
+ <label for="talkpostfromgoogli" class="b-postform-login-service"><TMPL_VAR expr="ml('/talkpost.bml.google')"></label>
+ <div class="b-postform-login-opts">
+ <strong><TMPL_VAR remote_display_name></strong>
+ <TMPL_VAR ml_willscreen>
+ </div>
+ </div>
+ <TMPL_ELSE>
+ <div class="b-postform-login-item b-postform-login-google b-postform-login-disabled">
+ <span class="b-postform-login-service"><TMPL_VAR expr="ml('/talkpost.bml.google')"></span>
+ <div class="b-postform-login-opts">
+ <strong><TMPL_VAR remote_display_name></strong>
+ <TMPL_VAR ml_notafriend>
+ <TMPL_VAR ml_willscreen>
+ </div>
+ </div>
+ </TMPL_IF>
+ <TMPL_ELSE>
+ <div class="b-postform-login-item b-postform-login-google">
+ <input type="radio" tabindex="16" name="usertype" value="google" id="talkpostfromgooglo" class="b-postform-login-radio" <TMPL_IF whocheck_google>checked="checked"</TMPL_IF> />
+ <label for="talkpostfromgooglo" class="b-postform-login-service"><TMPL_VAR expr="ml('/talkpost.bml.google')"></label>
+ <div class="b-postform-login-opts">
+ <span class="i-bubble b-bubble-lite"><i class="i-bubble-arrow-border"></i><i class="i-bubble-arrow"></i><TMPL_VAR expr="ml('/talkpost.bml.google.who.you.are')"><TMPL_VAR helpicon_google></span>
+ <TMPL_VAR ml_willscreen>
+ </div>
+ </div>
+ </TMPL_IF>
+</TMPL_IF>
Added: trunk/templates/CommentForm/AuthorDisabled-Google.tmpl
===================================================================
--- trunk/templates/CommentForm/AuthorDisabled-Google.tmpl (rev 0)
+++ trunk/templates/CommentForm/AuthorDisabled-Google.tmpl 2011-05-03 03:22:27 UTC (rev 10463)
@@ -0,0 +1,13 @@
+<TMPL_IF everyone_can_comment>
+<TMPL_ELSIF registered_can_comment>
+ <TMPL_IF is_trusted_identity>
+ <TMPL_ELSIF is_identity>
+ b-postform-ability-disabled-google
+ </TMPL_IF>
+<TMPL_ELSIF friends_can_comment>
+ <TMPL_IF is_identity>
+ <TMPL_UNLESS remote_can_comment>
+ b-postform-ability-disabled-google
+ </TMPL_UNLESS>
+ </TMPL_IF>
+</TMPL_IF>
Added: trunk/templates/CommentForm/AuthorTitle-Google.tmpl
===================================================================
--- trunk/templates/CommentForm/AuthorTitle-Google.tmpl (rev 0)
+++ trunk/templates/CommentForm/AuthorTitle-Google.tmpl 2011-05-03 03:22:27 UTC (rev 10463)
@@ -0,0 +1,21 @@
+<TMPL_IF everyone_can_comment>
+ <span class="b-postform-login-services-item b-postform-login-services-google"><a href="#google" tabindex="11"><img src="<TMPL_VAR lj_imgprefix>/icons/google-16.gif" /><span class="b-postform-login-services-name"><TMPL_VAR expr="ml('/talkpost.bml.google')"></span></a></span>
+<TMPL_ELSIF registered_can_comment>
+ <TMPL_IF is_trusted_identity>
+ <span class="b-postform-login-services-item b-postform-login-services-google"><a href="#google" tabindex="11"><img src="<TMPL_VAR lj_imgprefix>/icons/google-16.gif" /><span class="b-postform-login-services-name"><TMPL_VAR expr="ml('/talkpost.bml.google')"></span></a></span>
+ <TMPL_ELSIF is_identity>
+ <span class="b-postform-login-services-item b-postform-login-services-google"><a href="#google" title="<TMPL_VAR ml_noopenidpost>" class="b-postform-login-services-disabled"><img src="<TMPL_VAR lj_imgprefix>/icons/google-16.gif" /><span class="b-postform-login-services-name"><TMPL_VAR expr="ml('/talkpost.bml.google')"></span></a></span>
+ <TMPL_ELSE>
+ <span class="b-postform-login-services-item b-postform-login-services-google"><a href="#google" tabindex="11"><img src="<TMPL_VAR lj_imgprefix>/icons/google-16.gif" /><span class="b-postform-login-services-name"><TMPL_VAR expr="ml('/talkpost.bml.google')"></span></a></span>
+ </TMPL_IF>
+<TMPL_ELSIF friends_can_comment>
+ <TMPL_IF is_identity>
+ <TMPL_IF remote_can_comment>
+ <span class="b-postform-login-services-item b-postform-login-services-google"><a href="#google" tabindex="11"><img src="<TMPL_VAR lj_imgprefix>/icons/google-16.gif" /><span class="b-postform-login-services-name"><TMPL_VAR expr="ml('/talkpost.bml.google')"></span></a></span>
+ <TMPL_ELSE>
+ <span class="b-postform-login-services-item b-postform-login-services-google"><a href="#google" title="<TMPL_VAR remote_display_name> <TMPL_VAR ml_notafriend> <TMPL_VAR ml_willscreen>" class="b-postform-login-services-disabled"><img src="<TMPL_VAR lj_imgprefix>/icons/google-16.gif" /><span class="b-postform-login-services-name"><TMPL_VAR expr="ml('/talkpost.bml.google')"></span></a></span>
+ </TMPL_IF>
+ <TMPL_ELSE>
+ <span class="b-postform-login-services-item b-postform-login-services-google"><a href="#google" tabindex="11"><img src="<TMPL_VAR lj_imgprefix>/icons/google-16.gif" /><span class="b-postform-login-services-name"><TMPL_VAR expr="ml('/talkpost.bml.google')"></span></a></span>
+ </TMPL_IF>
+</TMPL_IF>
Added: trunk/templates/Identity/GoogleInterstitial.tmpl
===================================================================
--- trunk/templates/Identity/GoogleInterstitial.tmpl (rev 0)
+++ trunk/templates/Identity/GoogleInterstitial.tmpl 2011-05-03 03:22:27 UTC (rev 10463)
@@ -0,0 +1,56 @@
+<form action="" method="post" class="b-googinterstitial-form">
+<TMPL_VAR form_intro>
+<TMPL_IF step2>
+ <div class="warningbar">
+ <p><TMPL_VAR ml_validation></p>
+ </div>
+ <p class="b-googinterstitial-submit"><input type="submit" name="next" value="<TMPL_VAR expr="ml('.btn.next')">"></p>
+<TMPL_ELSE>
+ <h4><TMPL_VAR ml_congrats></h4>
+ <p><TMPL_VAR expr="ml('.desc')"></p>
+ <h4><TMPL_VAR expr="ml('.heading.subscribe')"></h4>
+ <ul>
+ <li>
+ <input type="radio" name="subscribe" value="1" id="subscribe_yes" checked="checked">
+ <label for="subscribe_yes"><TMPL_VAR expr="ml('.label.subscribe.yes')"></label>
+ </li>
+ <li>
+ <input type="radio" name="subscribe" value="0" id="subscribe_no">
+ <label for="subscribe_no"><TMPL_VAR expr="ml('.label.subscribe.no')"></label>
+ </li>
+ <li>
+ <table class="b-form-columns">
+ <tr>
+ <td>
+ <label for="email"><strong><TMPL_VAR expr="ml('.label.email')"></strong></label>
+ </td>
+ <td>
+ <input type="text" name="email" id="email" value="<TMPL_VAR form_email>">
+ </td>
+ <td>
+ <TMPL_IF errors>
+ <TMPL_LOOP errors>
+ <span class="i-bubble b-bubble-warning">
+ <i class="i-bubble-arrow-border"></i>
+ <i class="i-bubble-arrow"></i>
+ <TMPL_VAR error>
+ </span>
+ </TMPL_LOOP>
+ <TMPL_ELSE>
+ <span class="i-bubble b-bubble-alert">
+ <i class="i-bubble-arrow-border"></i>
+ <i class="i-bubble-arrow"></i>
+ <TMPL_VAR expr="ml('.tip.email')">
+ </span>
+ </TMPL_IF>
+ </td>
+ </tr>
+ </table>
+ </li>
+ </ul>
+ <p class="b-googinterstitial-submit">
+ <button type="submit"><TMPL_VAR expr="ml('.btn.proceed')"></button>
+ </p>
+</TMPL_IF>
+</form>
+
Added: trunk/templates/Identity/GoogleInterstitialCompact.tmpl
===================================================================
--- trunk/templates/Identity/GoogleInterstitialCompact.tmpl (rev 0)
+++ trunk/templates/Identity/GoogleInterstitialCompact.tmpl 2011-05-03 03:22:27 UTC (rev 10463)
@@ -0,0 +1,63 @@
+<html>
+<head>
+<title>Google Interstitial</title>
+<TMPL_VAR lj_res_includes>
+</head>
+
+<body>
+
+<form action="" method="post" class="b-googinterstitial-form b-googinterstitial-form-compact">
+<TMPL_VAR form_intro>
+<TMPL_IF step2>
+ <div class="warningbar">
+ <p><TMPL_VAR ml_validation></p>
+ </div>
+ <p class="b-googinterstitial-submit"><input type="submit" name="next" value="<TMPL_VAR expr="ml('.btn.next')">"></p>
+<TMPL_ELSE>
+ <h4><TMPL_VAR ml_congrats></h4>
+ <p><TMPL_VAR expr="ml('.desc')"></p>
+ <h5><TMPL_VAR expr="ml('.heading.subscribe')"></h5>
+ <ul class="checkboxes">
+ <li>
+ <input type="radio" name="subscribe" value="1" id="subscribe_yes" checked="checked">
+ <label for="subscribe_yes"><TMPL_VAR expr="ml('.label.subscribe.yes')"></label>
+ </li>
+ <li>
+ <input type="radio" name="subscribe" value="0" id="subscribe_no">
+ <label for="subscribe_no"><TMPL_VAR expr="ml('.label.subscribe.no')"></label>
+ </li>
+ <table class="b-form-columns">
+ <tr>
+ <td>
+ <label for="email"><strong><TMPL_VAR expr="ml('.label.email')"></strong></label>
+ </td>
+ <td>
+ <input type="text" name="email" id="email" value="<TMPL_VAR form_email>">
+ </td>
+ <td>
+ <TMPL_IF errors>
+ <TMPL_LOOP errors>
+ <span class="i-bubble b-bubble-warning">
+ <i class="i-bubble-arrow-border"></i>
+ <i class="i-bubble-arrow"></i>
+ <TMPL_VAR error>
+ </span>
+ </TMPL_LOOP>
+ <TMPL_ELSE>
+ <span class="i-bubble b-bubble-alert">
+ <i class="i-bubble-arrow-border"></i>
+ <i class="i-bubble-arrow"></i>
+ <TMPL_VAR expr="ml('.tip.email')">
+ </span>
+ </TMPL_IF>
+ </td>
+ </tr>
+ </table>
+ </ul>
+ <p class="b-googinterstitial-submit">
+ <button type="submit"><TMPL_VAR expr="ml('.btn.proceed')"></button>
+ </p>
+</TMPL_IF>
+</form>
+
+</body>
Added: trunk/templates/Identity/Login-google.tmpl
===================================================================
--- trunk/templates/Identity/Login-google.tmpl (rev 0)
+++ trunk/templates/Identity/Login-google.tmpl 2011-05-03 03:22:27 UTC (rev 10463)
@@ -0,0 +1,3 @@
+<button type="submit" class="b-googlebtn"><span><i></i><TMPL_VAR expr="ml('/identity/login.bml.google.btn.connect')"></span></button>
+<p class="b-auth-desc"><TMPL_VAR expr="ml('/identity/login.bml.google.desc')"></p>
+<TMPL_IF errors><TMPL_LOOP errors><p class="b-auth-error"><span class="i-message i-message-error"><TMPL_VAR error></span></p></TMPL_LOOP></TMPL_IF>
