View source
<?php
function tfa_code_form($form, $form_state, $uid, $hash = NULL) {
if (!flood_is_allowed('tfa_validate', variable_get('tfa_hourly_threshold', 5))) {
drupal_set_message(t('You have reached the threshold for incorrect code entry attempts. Please try again later.'), 'error');
return drupal_access_denied();
}
$account = user_load($uid);
$form['desc'] = array(
'#markup' => t('Enter your received login code to continue.'),
);
$form['uid'] = array(
'#type' => 'value',
'#value' => $uid,
);
$form['code'] = array(
'#type' => 'textfield',
'#title' => t('Code'),
'#required' => TRUE,
);
$form['resend'] = array(
'#type' => 'fieldset',
'#title' => t('Resend code'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#description' => t('If you have not received the code you may resend it. You can only resend the code !count times per hour.', array(
'!count' => variable_get('tfa_hourly_threshold', 5),
)),
);
$form['resend']['send'] = array(
'#type' => 'submit',
'#value' => t('Resend code'),
'#limit_validation_errors' => array(),
'#submit' => array(
'tfa_resend_code',
),
);
$form['login'] = array(
'#type' => 'submit',
'#value' => t('Log in'),
);
return $form;
}
function tfa_code_form_validate($form, &$form_state) {
$code = tfa_get_code($form_state['values']['uid']);
if ($code['code'] != $form_state['values']['code']) {
form_set_error('code', t('Invalid code.'));
flood_register_event('tfa_validate');
}
}
function tfa_code_form_submit($form, &$form_state) {
global $user;
$uid = $form_state['values']['uid'];
$account = user_load($uid);
$edit = array();
$user = $account;
$user->login = REQUEST_TIME;
db_update('users')
->fields(array(
'login' => $user->login,
))
->condition('uid', $user->uid)
->execute();
drupal_session_regenerate();
tfa_accept_code($account->uid);
watchdog('tfa', 'TFA login code accepted for @name. Session opened.', array(
'@name' => $user->name,
));
flood_clear_event('tfa_send');
flood_clear_event('tfa_validate');
user_module_invoke('login', $edit, $user);
}
function tfa_resend_code($form, &$form_state) {
$account = user_load($form['uid']['#value']);
$code = tfa_generate_code($account);
tfa_store_code($account->uid, $code);
tfa_tfa_process($account);
}
function tfa_admin_settings() {
$form = array();
$channels = array();
$hook = 'tfa_api';
foreach (module_implements($hook) as $module) {
$function = $module . '_' . $hook;
if (function_exists($function)) {
$channel = $function();
$channels[$module] = $channel;
$send_methods[$module] = $channel['title'];
}
}
$default_channel = variable_get('tfa_channel', 'sms');
$form['tfa_channel'] = array(
'#type' => 'select',
'#title' => t('Channel'),
'#options' => $send_methods,
'#default_value' => $default_channel,
'#description' => t('Choose the channel to communicate the TFA login code.'),
);
$form['tfa_phone_field'] = array(
'#type' => 'container',
'#children' => t('<div class="error messages">A phone field is required for the TFA process. Add a user field for phone number storage to continue. Consult the <a href="!url">help documentation for more info</a>.</div>', array(
'!url' => url('admin/help/tfa'),
)),
'#states' => array(
'visible' => array(
':input[name="tfa_channel"]' => array(
'value' => 'sms',
),
),
),
);
$instances = field_info_instances('user');
if (!empty($instances['user'])) {
$options = array();
foreach ($instances['user'] as $name => $field) {
$options[$name] = $field['label'];
}
unset($form['tfa_phone_field']['#children']);
$form['tfa_phone_field']['#type'] = 'select';
$form['tfa_phone_field']['#default_value'] = variable_get('tfa_phone_field', '');
$form['tfa_phone_field']['#options'] = $options;
$form['tfa_phone_field']['#description'] = t('Choose the field that stores phone numbers.');
}
$form['tfa_required'] = array(
'#type' => 'checkbox',
'#title' => t('Require TFA process'),
'#default_value' => variable_get('tfa_required', 0),
'#description' => t('Require TFA to login except for accounts that have permission to "Skip TFA". Note, any account that is not setup for TFA (and is not set to skip TFA) will not be able to login.'),
);
$form['tfa_send_message'] = array(
'#type' => 'textfield',
'#title' => t('Message'),
'#default_value' => variable_get('tfa_send_message', 'Login code'),
'#description' => t('Text to prepend before the TFA login code. Plain text only.'),
);
$form['tfa_code_length'] = array(
'#type' => 'textfield',
'#title' => t('Code length'),
'#default_value' => variable_get('tfa_code_length', 6),
'#description' => t('Length of the TFA login code.'),
);
$form['tfa_code_ttl'] = array(
'#type' => 'textfield',
'#title' => t('Code expiration time'),
'#default_value' => variable_get('tfa_code_ttl', 86400),
'#description' => t('Length of time the TFA login code is valid.'),
);
return system_settings_form($form);
}