function handle($args) {
parent::handle($args);
if (!common_logged_in()) {
- common_user_error(_t('Not logged in.'));
+ common_user_error(_('Not logged in.'));
} else {
$this->try_login();
}
function try_login() {
- $consumer = oid_consumer();
+ $consumer =& oid_consumer();
$response = $consumer->complete(common_local_url('finishaddopenid'));
if ($response->status == Auth_OpenID_CANCEL) {
- $this->message(_t('OpenID authentication cancelled.'));
+ $this->message(_('OpenID authentication cancelled.'));
return;
} else if ($response->status == Auth_OpenID_FAILURE) {
// Authentication failed; display the error message.
- $this->message(_t('OpenID authentication failed: ') . $response->message);
+ $this->message(sprintf(_('OpenID authentication failed: %s'), $response->message));
} else if ($response->status == Auth_OpenID_SUCCESS) {
- // This means the authentication succeeded; extract the
- // identity URL and Simple Registration data (if it was
- // returned).
+
$display = $response->getDisplayIdentifier();
- $canonical = ($response->endpoint->canonicalID) ?
- $response->endpoint->canonicalID : $response->getDisplayIdentifier();
+ $canonical = ($response->endpoint && $response->endpoint->canonicalID) ?
+ $response->endpoint->canonicalID : $display;
$sreg_resp = Auth_OpenID_SRegResponse::fromSuccessResponse($response);
$sreg = $sreg_resp->contents();
}
- $user = $this->get_user($canonical);
+ $cur =& common_current_user();
+ $other = oid_get_user($canonical);
- if ($user) {
- $this->message(_t('This OpenID is already associated with user "') . $user->nickname . _t('"'));
- } else {
- $user = common_current_user();
- if (!$this->connect_user($user, $display, $canonical)) {
- $this->message(_t('Error connecting user'));
- return;
+ if ($other) {
+ if ($other->id == $cur->id) {
+ $this->message(_('You already have this OpenID!'));
+ } else {
+ $this->message(_('Someone else already has this OpenID.'));
}
- if ($sreg) {
- if (!$this->update_user($user, $sreg)) {
- $this->message(_t('Error updating profile'));
- return;
- }
- }
- # success!
- common_redirect(common_local_url('openidsettings'));
+ return;
}
- }
- }
-
- function message($msg) {
- common_show_header(_t('OpenID Login'));
- common_element('p', NULL, $msg);
- common_show_footer();
- }
-
- function get_user($canonical) {
- $user = NULL;
- $oid = User_openid::staticGet('canonical', $canonical);
- if ($oid) {
- $user = User::staticGet('id', $oid->user_id);
- }
- return $user;
- }
-
- function update_user($user, $sreg) {
- $profile = $user->getProfile();
+ # start a transaction
- $orig_profile = clone($profile);
+ $cur->query('BEGIN');
- if ($sreg['fullname'] && strlen($sreg['fullname']) <= 255) {
- $profile->fullname = $sreg['fullname'];
- }
+ $result = oid_link_user($cur->id, $canonical, $display);
- if ($sreg['country']) {
- if ($sreg['postcode']) {
- # XXX: use postcode to get city and region
- # XXX: also, store postcode somewhere -- it's valuable!
- $profile->location = $sreg['postcode'] . ', ' . $sreg['country'];
- } else {
- $profile->location = $sreg['country'];
+ if (!$result) {
+ $this->message(_('Error connecting user.'));
+ return;
+ }
+ if ($sreg) {
+ if (!oid_update_user($cur, $sreg)) {
+ $this->message(_('Error updating profile'));
+ return;
+ }
}
- }
-
- # XXX save language if it's passed
- # XXX save timezone if it's passed
- if (!$profile->update($orig_profile)) {
- common_server_error(_t('Error saving the profile.'));
- return false;
- }
+ # success!
- $orig_user = clone($user);
+ $cur->query('COMMIT');
- if ($sreg['email'] && Validate::email($sreg['email'], true)) {
- $user->email = $sreg['email'];
- }
+ oid_set_last($display);
- if (!$user->update($orig_user)) {
- common_server_error(_t('Error saving the user.'));
- return false;
+ common_redirect(common_local_url('openidsettings'));
}
-
- return true;
}
- function connect_user($user, $display, $canonical) {
-
- $oid = new User_openid();
- $oid->display = $display;
- $oid->canonical = $canonical;
- $oid->user_id = $user->id;
- $oid->created = DB_DataObject_Cast::dateTime();
-
- common_debug('Saving ' . print_r($oid, TRUE), __FILE__);
-
- if (!$oid->insert()) {
- $err = PEAR::getStaticProperty('DB_DataObject','lastError');
- common_debug('DB error ' . $err->code . ': ' . $err->message, __FILE__);
- return false;
- }
+ function message($msg) {
+ common_show_header(_('OpenID Login'));
+ common_element('p', NULL, $msg);
+ common_show_footer();
}
}