friendly_register.module 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. <?php
  2. /**
  3. * @file
  4. * Primary logic for the friendly_register module that allows for checking of username and email.
  5. */
  6. define('FRIENDLY_REGISTER_MAX_HITS', 300);
  7. define('FRIENDLY_REGISTER_EXPIRES', 86400);
  8. /**
  9. * Implements hook_menu().
  10. */
  11. function friendly_register_menu() {
  12. $items['ajax/check-email'] = array(
  13. 'page callback' => 'friendly_register_check_email',
  14. 'page arguments' => array(2),
  15. 'access callback' => TRUE,
  16. 'type' => MENU_CALLBACK,
  17. );
  18. $items['ajax/check-user'] = array(
  19. 'page callback' => 'friendly_register_check_user',
  20. 'page arguments' => array(2),
  21. 'access callback' => TRUE,
  22. 'type' => MENU_CALLBACK,
  23. );
  24. return $items;
  25. }
  26. /**
  27. * Implements hook_permission().
  28. */
  29. function friendly_register_permission() {
  30. return array(
  31. 'ignore flood' => array(
  32. 'title' => t('Ignore Flood Checking'),
  33. 'description' => t('Allows users to have unlimited checks against friendly register.'),
  34. 'restrict access' => FALSE,
  35. ),
  36. );
  37. }
  38. /**
  39. * Implements hook_cron().
  40. */
  41. function friendly_register_cron() {
  42. $expires = REQUEST_TIME - FRIENDLY_REGISTER_EXPIRES;
  43. db_delete('friendly_register_flood')
  44. ->condition('lasthit', $expires, '<=')
  45. ->execute();
  46. }
  47. /**
  48. * Implements hook_form_FORM_ID_alter().
  49. */
  50. function friendly_register_form_user_register_form_alter(&$form, &$form_state, $form_id) {
  51. foreach (array('name', 'mail') as $field) {
  52. $class = 'friendly-register-' . $field;
  53. if (isset($form['account'][$field]['#attributes']['class'])) {
  54. $form['account'][$field]['#attributes']['class'][] = $class;
  55. }
  56. elseif (isset($form['account'][$field]['#attributes'])) {
  57. $form['account'][$field]['#attributes']['class'] = array(
  58. $class,
  59. );
  60. }
  61. else {
  62. $form['account'][$field]['#attributes'] = array(
  63. 'class' => array(
  64. $class,
  65. ),
  66. );
  67. }
  68. }
  69. friendly_register_load_resources();
  70. }
  71. /**
  72. * Utility function for load required resources.
  73. */
  74. function friendly_register_load_resources() {
  75. $path = drupal_get_path('module', 'friendly_register');
  76. drupal_add_js($path . '/js/friendly_register.js', 'file');
  77. drupal_add_css($path . '/css/friendly_register.css');
  78. }
  79. function friendly_register_check_email($address) {
  80. // Check if it is a valid email address. No need to check if it is not
  81. if (valid_email_address($address)) {
  82. drupal_json_output(_friendly_register_check_field('mail', $address));
  83. }
  84. else {
  85. // This flag will return incomplete so the user doesn't see an error
  86. // if they are just starting to enter in their email address
  87. drupal_json_output(array('available' => 'incomplete'));
  88. }
  89. }
  90. function friendly_register_check_user($username) {
  91. drupal_json_output(_friendly_register_check_field('name', $username));
  92. }
  93. function _friendly_register_check_field($field_name, $value) {
  94. if (_friendly_register_check_flood()) {
  95. $result = db_query("SELECT uid FROM {users} WHERE " . $field_name . " = :value", array(':value' => $value))->fetchField();
  96. return array('available' => ($result == NULL));
  97. }
  98. else {
  99. return array('flood' => TRUE);
  100. }
  101. }
  102. function _friendly_register_check_flood() {
  103. if (user_access('ignore flood')) {
  104. return TRUE;
  105. }
  106. else {
  107. $ip = ip_address();
  108. $q = 'SELECT hits FROM {friendly_register_flood} WHERE ip = :ip';
  109. $hits = db_query($q, array(':ip' => $ip))->fetchField();
  110. if ($hits == NULL) {
  111. $id = db_insert('friendly_register_flood')
  112. ->fields(array(
  113. 'ip' => $ip,
  114. 'hits' => 1,
  115. 'lasthit' => REQUEST_TIME,
  116. ))->execute();
  117. }
  118. else {
  119. db_update('friendly_register_flood')
  120. ->expression('hits', 'hits + 1')
  121. ->expression('lasthit', REQUEST_TIME)
  122. ->condition('ip', $ip)
  123. ->execute();
  124. }
  125. return $hits < FRIENDLY_REGISTER_MAX_HITS;
  126. }
  127. }