View source
<?php
define('FRIENDLY_REGISTER_MAX_HITS', 300);
define('FRIENDLY_REGISTER_EXPIRES', 86400);
function friendly_register_menu() {
$items['ajax/check-email'] = array(
'page callback' => 'friendly_register_check_email',
'page arguments' => array(
2,
),
'access callback' => TRUE,
'type' => MENU_CALLBACK,
);
$items['ajax/check-user'] = array(
'page callback' => 'friendly_register_check_user',
'page arguments' => array(
2,
),
'access callback' => TRUE,
'type' => MENU_CALLBACK,
);
return $items;
}
function friendly_register_permission() {
return array(
'ignore flood' => array(
'title' => t('Ignore Flood Checking'),
'description' => t('Allows users to have unlimited checks against friendly register.'),
'restrict access' => FALSE,
),
);
}
function friendly_register_cron() {
$expires = REQUEST_TIME - FRIENDLY_REGISTER_EXPIRES;
db_delete('friendly_register_flood')
->condition('lasthit', $expires, '<=')
->execute();
}
function friendly_register_form_user_register_form_alter(&$form, &$form_state, $form_id) {
foreach (array(
'name',
'mail',
) as $field) {
$class = 'friendly-register-' . $field;
if (isset($form['account'][$field]['#attributes']['class'])) {
$form['account'][$field]['#attributes']['class'][] = $class;
}
elseif (isset($form['account'][$field]['#attributes'])) {
$form['account'][$field]['#attributes']['class'] = array(
$class,
);
}
else {
$form['account'][$field]['#attributes'] = array(
'class' => array(
$class,
),
);
}
}
friendly_register_load_resources();
}
function friendly_register_load_resources() {
$path = drupal_get_path('module', 'friendly_register');
drupal_add_js($path . '/js/friendly_register.js', 'file');
drupal_add_css($path . '/css/friendly_register.css');
}
function friendly_register_check_email($address) {
$email_is_valid = TRUE;
$all_email_checks = module_invoke_all('validate_email_address', $address);
foreach ($all_email_checks as $check) {
$email_is_valid = $check && $email_is_valid;
}
if ($email_is_valid) {
drupal_json_output(_friendly_register_check_field('mail', $address));
}
else {
drupal_json_output(array(
'available' => 'incomplete',
));
}
}
function friendly_register_validate_email_address($address) {
return valid_email_address($address);
}
function friendly_register_check_user($username) {
$user_is_valid = TRUE;
$all_user_checks = module_invoke_all('validate_user_name', $username);
foreach ($all_user_checks as $check) {
$user_is_valid = $check && $user_is_valid;
}
if ($user_is_valid) {
drupal_json_output(_friendly_register_check_field('name', $username));
}
else {
drupal_json_output(array(
'available' => 'invalid',
));
}
}
function _friendly_register_check_field($field_name, $value) {
if (_friendly_register_check_flood()) {
$result = db_query("SELECT uid FROM {users} WHERE " . $field_name . " = :value", array(
':value' => $value,
))
->fetchField();
return array(
'available' => $result == NULL,
);
}
else {
return array(
'flood' => TRUE,
);
}
}
function _friendly_register_check_flood() {
if (user_access('ignore flood')) {
return TRUE;
}
else {
$ip = ip_address();
$q = 'SELECT hits FROM {friendly_register_flood} WHERE ip = :ip';
$hits = db_query($q, array(
':ip' => $ip,
))
->fetchField();
if ($hits == NULL) {
db_insert('friendly_register_flood')
->fields(array(
'ip' => $ip,
'hits' => 1,
'lasthit' => REQUEST_TIME,
))
->execute();
}
else {
db_update('friendly_register_flood')
->expression('hits', 'hits + 1')
->expression('lasthit', REQUEST_TIME)
->condition('ip', $ip)
->execute();
}
return $hits < FRIENDLY_REGISTER_MAX_HITS;
}
}