5.3. // We might be safe in this case because mt_rand should never be using // the same seed, but this is still more secure. $token = hash("sha256", mt_rand() . $time); $id = db_insert("islandora_authtokens")->fields( array( 'token' => $token, 'uid' => $user->uid, 'pid' => $pid, 'dsid' => $dsid, 'time' => $time, 'remaining_uses' => $uses, ))->execute(); return $token; } /** * Submit a token to islandora for authentication. Supply islandora with the * token and the object/datastream it is for and you will receive access if * authentication passes. Tokens can only be redeemed in a short window after * their creation. * * @param string $pid * The PID of the object to retrieve. * @param string $dsid * The datastream id to retrieve. * @param string $token * The registered token that allows access to this object. * * @return mixed * The user credentials for access if the token validation passes, * FALSE otherwise */ function islandora_validate_object_token($pid, $dsid, $token) { static $accounts = array(); if(!empty($accounts[$pid][$dsid][$token])) { return $accounts[$pid][$dsid][$token]; } // Check for database token. $time = time(); $query = db_select('islandora_authtokens', 'tokens'); $query->join('users', 'u', 'tokens.uid = u.uid'); // The results will look like user objects. $result = $query ->fields('u', array('uid', 'name', 'pass')) ->fields('tokens', array('remaining_uses')) ->condition('token', $token, '=') ->condition('pid', $pid, '=') ->condition('dsid', $dsid, '=') ->condition('time', $time, '<=') ->condition('time', $time - TOKEN_TIMEOUT, '>') ->execute() ->fetchAll(); if ($result) { $remaining_uses = $result[0]->remaining_uses; $remaining_uses--; // Remove the authentication token so it can't be used again. if ($remaining_uses == 0) { db_delete("islandora_authtokens") ->condition('token', $token, '=') ->condition('pid', $pid, '=') ->condition('dsid', $dsid, '=') ->execute(); } // Decrement authentication token uses. else { db_update("islandora_authtokens") ->fields(array('remaining_uses' => $remaining_uses)) ->condition('token', $token, '=') ->condition('pid', $pid, '=') ->condition('dsid', $dsid, '=') ->execute(); } unset($result[0]->remaining_uses); $accounts[$pid][$dsid][$token] = $result[0]; } else { $accounts[$pid][$dsid][$token] = FALSE; } return $accounts[$pid][$dsid][$token]; } /** * Will remove any expired authentication tokens. */ function islandora_remove_expired_tokens() { $time = time(); db_delete("islandora_authtokens") ->condition('time', $time - TOKEN_TIMEOUT, '<') ->execute(); }