Beispiel #1
0
 /**
  * openid_auth_2
  * Authenticate user with OpenID, step 2
  */
 private static function openid_auth_2()
 {
     $results = array();
     $results['type'] = 'openid';
     $consumer = Openid::get_consumer();
     if ($consumer) {
         $response = $consumer->complete(Openid::get_return_url());
         if ($response->status == Auth_OpenID_CANCEL) {
             $results['success'] = false;
             $results['error'] = 'OpenID verification cancelled.';
         } else {
             if ($response->status == Auth_OpenID_FAILURE) {
                 $results['success'] = false;
                 $results['error'] = 'OpenID authentication failed: ' . $response->message;
             } else {
                 if ($response->status == Auth_OpenID_SUCCESS) {
                     // Extract the identity URL and Simple Registration data (if it was returned).
                     $sreg_resp = Auth_OpenID_SRegResponse::fromSuccessResponse($response);
                     $sreg = $sreg_resp->contents();
                     $results['website'] = $response->getDisplayIdentifier();
                     if (@$sreg['email']) {
                         $results['email'] = $sreg['email'];
                     }
                     if (@$sreg['nickname']) {
                         $results['username'] = $sreg['nickname'];
                     }
                     if (@$sreg['fullname']) {
                         $results['name'] = $sreg['fullname'];
                     }
                     $users = User::get_from_website($results['website']);
                     if (count($users) > 0) {
                         if (count($users) == 1) {
                             $user = new User($users[0]);
                             $results['success'] = true;
                             $results['username'] = $user->username;
                         } else {
                             // Several users for the same website/openid? Allowed but stupid, try to get a match on username.
                             // Should we make website field unique?
                             foreach ($users as $id) {
                                 $user = new User($id);
                                 if ($user->username == $results['username']) {
                                     $results['success'] = true;
                                     $results['username'] = $user->username;
                                 }
                             }
                         }
                     } else {
                         // Don't return success if an user already exists for this username but don't have this openid identity as website
                         $user = User::get_from_username($results['username']);
                         if ($user->id) {
                             $results['success'] = false;
                             $results['error'] = 'No user associated to this OpenID and username already taken.';
                         } else {
                             $results['success'] = true;
                             $results['error'] = 'No user associated to this OpenID.';
                         }
                     }
                 }
             }
         }
     }
     return $results;
 }