示例#1
0
function Auth_OpenID_checkTimestamp($nonce_string,
                                    $allowed_skew = null,
                                    $now = null)
{
    // Is the timestamp that is part of the specified nonce string
    // within the allowed clock-skew of the current time?
    global $Auth_OpenID_SKEW;

    if ($allowed_skew === null) {
        $allowed_skew = $Auth_OpenID_SKEW;
    }

    $parts = Auth_OpenID_splitNonce($nonce_string);
    if ($parts == null) {
        return false;
    }

    if ($now === null) {
        $now = time();
    }

    $stamp = $parts[0];

    // Time after which we should not use the nonce
    $past = $now - $allowed_skew;

    // Time that is too far in the future for us to allow
    $future = $now + $allowed_skew;

    // the stamp is not too far in the future and is not too far
    // in the past
    return (($past <= $stamp) && ($stamp <= $future));
}
示例#2
0
 function runTest()
 {
     $result = Auth_OpenID_splitNonce($this->nonce_str);
     $this->assertNull($result);
 }
示例#3
0
 /**
  * @access private
  */
 function _idResCheckNonce($message, $endpoint)
 {
     if ($message->isOpenID1()) {
         // This indicates that the nonce was generated by the consumer
         $nonce = $this->_idResGetNonceOpenID1($message, $endpoint);
         $server_url = '';
     } else {
         $nonce = $message->getArg(Auth_OpenID_OPENID2_NS, 'response_nonce');
         $server_url = $endpoint->server_url;
     }
     if ($nonce === null) {
         return new Auth_OpenID_FailureResponse($endpoint, "Nonce missing from response");
     }
     $parts = Auth_OpenID_splitNonce($nonce);
     if ($parts === null) {
         return new Auth_OpenID_FailureResponse($endpoint, "Malformed nonce in response");
     }
     list($timestamp, $salt) = $parts;
     if (!$this->store->useNonce($server_url, $timestamp, $salt)) {
         return new Auth_OpenID_FailureResponse($endpoint, "Nonce already used or out of range");
     }
     return null;
 }
 function index()
 {
     try {
         $member = Member::currentUser();
         if ($member) {
             // user is already logged in
             return $this->redirect(OpenStackIdCommon::getRedirectBackUrl());
         }
         $consumer = Injector::inst()->get('MyOpenIDConsumer');
         $query = Auth_OpenID::getQuery();
         $message = Auth_OpenID_Message::fromPostArgs($query);
         $nonce = $message->getArg(Auth_OpenID_OPENID2_NS, 'response_nonce');
         list($timestamp, $salt) = Auth_OpenID_splitNonce($nonce);
         $claimed_id = $message->getArg(Auth_OpenID_OPENID2_NS, 'claimed_id');
         error_log(sprintf('OpenStackIdAuthenticator : id %s - salt %s - timestamp %s', $claimed_id, $salt, $timestamp));
         // Complete the authentication process using the server's response.
         $response = $consumer->complete(OpenStackIdCommon::getReturnTo());
         if ($response->status == Auth_OpenID_CANCEL) {
             error_log('OpenStackIdAuthenticator : Auth_OpenID_CANCEL');
             SS_Log::log('OpenStackIdAuthenticator : Auth_OpenID_CANCEL', SS_Log::WARN);
             throw new Exception('The verification was cancelled. Please try again.');
         } else {
             if ($response->status == Auth_OpenID_FAILURE) {
                 error_log('OpenStackIdAuthenticator : Auth_OpenID_FAILURE');
                 SS_Log::log('OpenStackIdAuthenticator : Auth_OpenID_FAILURE', SS_Log::WARN);
                 throw new Exception("The OpenID authentication failed.");
             } else {
                 if ($response->status == Auth_OpenID_SUCCESS) {
                     error_log('OpenStackIdAuthenticator : Auth_OpenID_SUCCESS');
                     $openid = $response->getDisplayIdentifier();
                     $openid = OpenStackIdCommon::escape($openid);
                     if ($response->endpoint->canonicalID) {
                         $openid = escape($response->endpoint->canonicalID);
                     }
                     //get user info from openid response
                     $member = null;
                     list($email, $full_name) = $this->getUserProfileInfo($response);
                     if (!is_null($email)) {
                         //try to get user by email
                         $member = $this->member_repository->findByEmail($email);
                     }
                     if (!$member) {
                         // or by openid
                         $member = Member::get()->filter('IdentityURL', $openid)->first();
                     }
                     if ($member) {
                         $result = $member->canLogIn();
                         if ($result->valid()) {
                             $member->setIdentityUrl($openid);
                             $member->write();
                             $member->LogIn(true);
                             return $this->redirect(OpenStackIdCommon::getRedirectBackUrl());
                         }
                         throw new Exception("Inactive User!");
                     }
                     throw new Exception("The OpenID authentication failed: can not find user " . $openid);
                 }
             }
         }
     } catch (Exception $ex) {
         Session::set("Security.Message.message", $ex->getMessage());
         Session::set("Security.Message.type", "bad");
         SS_Log::log($ex, SS_Log::WARN);
         return $this->redirect("Security/badlogin");
     }
 }
示例#5
0
 function _testNonceCleanup(&$store)
 {
     if (!$store->supportsCleanup()) {
         return;
     }
     $server_url = 'http://www.myopenid.com/openid';
     $now = time();
     $old_nonce1 = Auth_OpenID_mkNonce($now - 20000);
     $old_nonce2 = Auth_OpenID_mkNonce($now - 10000);
     $recent_nonce = Auth_OpenID_mkNonce($now - 600);
     global $Auth_OpenID_SKEW;
     $orig_skew = $Auth_OpenID_SKEW;
     $Auth_OpenID_SKEW = 0;
     $store->cleanupNonces();
     // Set SKEW high so stores will keep our nonces.
     $Auth_OpenID_SKEW = 100000;
     $params = Auth_OpenID_splitNonce($old_nonce1);
     array_unshift($params, $server_url);
     $this->assertTrue(call_user_func_array(array(&$store, 'useNonce'), $params));
     $params = Auth_OpenID_splitNonce($old_nonce2);
     array_unshift($params, $server_url);
     $this->assertTrue(call_user_func_array(array(&$store, 'useNonce'), $params));
     $params = Auth_OpenID_splitNonce($recent_nonce);
     array_unshift($params, $server_url);
     $this->assertTrue(call_user_func_array(array(&$store, 'useNonce'), $params));
     $Auth_OpenID_SKEW = 3600;
     $cleaned = $store->cleanupNonces();
     $this->assertEquals(2, $cleaned);
     // , "Cleaned %r nonces." % (cleaned,)
     $Auth_OpenID_SKEW = 100000;
     // A roundabout method of checking that the old nonces were
     // cleaned is to see if we're allowed to add them again.
     $params = Auth_OpenID_splitNonce($old_nonce1);
     array_unshift($params, $server_url);
     $this->assertTrue(call_user_func_array(array(&$store, 'useNonce'), $params));
     $params = Auth_OpenID_splitNonce($old_nonce2);
     array_unshift($params, $server_url);
     $this->assertTrue(call_user_func_array(array(&$store, 'useNonce'), $params));
     // The recent nonce wasn't cleaned, so it should still fail.
     $params = Auth_OpenID_splitNonce($recent_nonce);
     array_unshift($params, $server_url);
     $this->assertFalse(call_user_func_array(array(&$store, 'useNonce'), $params));
     $Auth_OpenID_SKEW = $orig_skew;
 }
示例#6
0
 function test_badNonce()
 {
     // remove the nonce from the store
     $nonce = Auth_OpenID_mkNonce();
     list($timestamp, $salt) = Auth_OpenID_splitNonce($nonce);
     $this->store->useNonce($this->server_url, $timestamp, $salt);
     $response = Auth_OpenID_Message::fromOpenIDArgs(array('response_nonce' => $nonce, 'ns' => Auth_OpenID_OPENID2_NS));
     $result = $this->consumer->_idResCheckNonce($response, $this->endpoint);
     $this->assertTrue(Auth_OpenID::isFailure($result));
 }