? tokenauth.97820.patch Index: tokenauth.install =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/tokenauth/Attic/tokenauth.install,v retrieving revision 1.3.4.11 diff -u -p -r1.3.4.11 tokenauth.install --- tokenauth.install 27 Sep 2010 17:06:22 -0000 1.3.4.11 +++ tokenauth.install 27 Sep 2010 21:12:24 -0000 @@ -11,27 +11,36 @@ */ function tokenauth_schema() { $schema['tokenauth_tokens'] = array( - 'description' => 'Stores information about each user\'s token', - 'fields' => array( - 'uid' => array( - 'description' => 'The user\'s {users}.uid', - 'type' => 'int', - 'size' => 'normal', - 'not null' => TRUE, - ), - 'token' => array( - 'description' => 'The user specific token', - 'type' => 'varchar', - 'length' => 50, - 'not null' => TRUE, - ), - ), - 'primary key' => array('token'), - 'unique keys' => array( - 'uid_key' => array('uid') - ), + 'description' => 'Stores information about each user\'s token', + 'fields' => array( + 'uid' => array( + 'description' => 'The user\'s {users}.uid', + 'type' => 'int', + 'size' => 'normal', + 'not null' => TRUE, + ), + 'token' => array( + 'description' => 'The user specific token', + 'type' => 'varchar', + 'length' => 50, + 'not null' => TRUE, + ), + 'issued' => array( + 'type' => 'int', + 'not null' => TRUE, + 'default' => 0, + 'description' => t('Record the Unix timestamp the token was issued.'), + ), + ), + 'primary key' => array('token'), + 'unique keys' => array( + 'uid_key' => array('uid') + ), + 'indexes' => array( + 'issued' => array('issued'), + ), ); - return $schema; + return $schema; } /** @@ -65,4 +74,23 @@ function tokenauth_uninstall() { variable_del('tokenauth_pages'); variable_del('tokenauth_reset'); variable_del('tokenauth_text'); + variable_del('tokenauth_lifespan'); } + +/** + * Add date of issue for each token. + */ +function tokenauth_update_6006() { + $ret = array(); + $spec = array( + 'type' => 'int', + 'not null' => TRUE, + 'default' => 0, + 'description' => t('Record the Unix timestamp the token was issued.'), + ); + db_add_field($ret, 'tokenauth_tokens', 'issued', $spec, array( + 'indexes' => array('issued' => array('issued')) + )); + db_query("UPDATE {tokenauth_tokens} SET issued=%d", time()); + return $ret; +} \ No newline at end of file Index: tokenauth.module =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/tokenauth/Attic/tokenauth.module,v retrieving revision 1.11.4.30 diff -u -p -r1.11.4.30 tokenauth.module --- tokenauth.module 23 Sep 2010 17:10:01 -0000 1.11.4.30 +++ tokenauth.module 27 Sep 2010 21:12:24 -0000 @@ -167,6 +167,22 @@ function tokenauth_user($op, &$edit, &$a } } +/** + * Implementation of hook_cron(). + */ +function tokenauth_cron() { +watchdog('tokenauth', 'Running cron for tokenauth'); + $lifespan = variable_get('tokenauth_lifespan', 0); + if (isset($lifespan) && $lifespan > 0) { + $expire = time() - $lifespan; + $result = db_query("SELECT uid FROM {tokenauth_tokens} WHERE issued < %d", $expire); + while ($row = db_fetch_object($result)) { + tokenauth_reset_user($row->uid); + watchdog('tokenauth', 'Generating new token for user !uid.', array('!uid' => $row->uid)); + } + } +} + /// Token Integration /// /** @@ -281,10 +297,11 @@ function tokenauth_reset_user($uid = NUL $entry = array( 'uid' => $uid, 'token' => isset($token) ? $token : user_password(variable_get('tokenauth_length', 10)), + 'issued' => _tokenauth_get_timestamp(), ); if (!$update) { // drupal_write_record mysteriously failing from tokenauth_enable(). - $return = db_query("INSERT INTO {tokenauth_tokens} (uid,token) VALUES (%d,'%s')", $entry['uid'], $entry['token']); + $return = db_query("INSERT INTO {tokenauth_tokens} (uid,token,issued) VALUES (%d,'%s', %d)", $entry['uid'], $entry['token'], $entry['issued']); } else { $return = drupal_write_record('tokenauth_tokens', $entry, 'uid'); @@ -345,6 +362,17 @@ function tokenauth_get_user($token) { } /** + * Helper function to grab the request timestamp. + */ +function _tokenauth_get_timestamp() { + static $timestamp; + if (empty($timestamp)) { + $timestamp = time(); + } + return $timestamp; +} + +/** * Helper function to build a token reset form. */ function tokenauth_reset_user_form($uid, $label = NULL, $token = NULL) { Index: tokenauth.pages.inc =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/tokenauth/Attic/tokenauth.pages.inc,v retrieving revision 1.1.2.6 diff -u -p -r1.1.2.6 tokenauth.pages.inc --- tokenauth.pages.inc 2 Sep 2010 21:10:57 -0000 1.1.2.6 +++ tokenauth.pages.inc 27 Sep 2010 21:12:24 -0000 @@ -31,6 +31,15 @@ function tokenauth_admin_settings() { '#default_value' => variable_get('tokenauth_pages', "rss.xml\n*/feed\n*/opml"), '#description' => t("Enter one page per line as Drupal paths. The '*' character is a wildcard. Example paths are %blog for the blog page and %blog-wildcard for every personal blog. %front is the front page. Read drupal_match_path() for the details.", array('%blog' => 'blog', '%blog-wildcard' => 'blog/*', '%front' => '')), ); + $form['tokenauth_general']['tokenauth_lifespan'] = array( + '#type' => 'textfield', + '#title' => t('Token lifespan'), + '#description' => t('Specify the number of days before the token is automatically reset. Leave as "0" for unlimited.'), + '#default_value' => _tokenauth_convert_time_unit(variable_get('tokenauth_lifespan', 0), FALSE), + '#size' => 4, + '#maxlength' => 4, + '#required' => TRUE, + ); $form['tokenauth_text'] = array( '#type' => 'fieldset', @@ -84,6 +93,11 @@ function tokenauth_admin_settings_valida if ($form_state['values']['tokenauth_length'] > 33) { form_set_error('tokenauth_length', t('The maximum token length is 32.')); } + if (!is_numeric($form_state['values']['tokenauth_lifespan']) || $form_state['values']['tokenauth_lifespan'] < 0) { + form_set_error('tokenauth_lifespan', t('You must enter a number of "0" or greater.')); + } + // Convert to Unixtime in admin pages to save performance on cron runs. + $form_state['values']['tokenauth_lifespan'] = _tokenauth_convert_time_unit($form_state['values']['tokenauth_lifespan']); } /** @@ -142,3 +156,24 @@ function tokenauth_user_profile_form(&$f $form = array_merge($form, tokenauth_reset_user_form($account->uid, NULL, $token)); return $form; } + +/** + * Convert to/from unixtime to facilitate UI in "days". + * + * This is done in the administration interface to save performance on cron. + * + * @param $time + * Time before tokens should expire. May be in seconds or days dependening on whether it + * is going into the database or coming out. + * @param $seconds + * If TRUE, will convert the $time measurement into seconds, suitable for unixtime comparison. + * + * @return + * Total lifespan in seconds or days before tokens should be expired. + */ +function _tokenauth_convert_time_unit($time, $seconds = TRUE) { + if ($seconds) { + return $time * 86400; + } + return $time / 86400; +}