-
Notifications
You must be signed in to change notification settings - Fork 0
/
domain_registration.module
144 lines (129 loc) · 4.3 KB
/
domain_registration.module
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
<?php
/**
* @file
* Domain Registration module file.
*/
define('DOMAIN_REGISTRATION_ALLOW', 0);
define('DOMAIN_REGISTRATION_DENY', 1);
/**
* Implements hook_config_info().
*/
function domain_registration_config_info() {
$prefixes['domain_registration.settings'] = array(
'label' => t('Settings for Domain Registration module.'),
'group' => t('Configuration'),
);
return $prefixes;
}
/**
* Implements hook_menu().
*/
function domain_registration_menu() {
$items['admin/config/people/domain_registration'] = array(
'title' => 'Domain registration',
'description' => 'Set domains for registration',
'page callback' => 'drupal_get_form',
'page arguments' => array('domain_registration_admin_form'),
'access arguments' => array('administer domain registration'),
);
return $items;
}
/**
* Implements hook_permission().
*/
function domain_registration_permission() {
return array(
'administer domain registration' => array(
'title' => t('Administer domain registration'),
'description' => t('Allows a user to administer the domain registration settings.'),
),
);
}
/**
* Administration form for domain registration.
*/
function domain_registration_admin_form($form, &$form_state) {
$config = config('domain_registration.settings');
$form['#config'] = 'domain_registration.settings';
$options = array(
DOMAIN_REGISTRATION_ALLOW => t('Allow only domains listed below to register'),
DOMAIN_REGISTRATION_DENY => t('Prevent domains listed below from registering'),
);
$form['domain_registration_method'] = array(
'#type' => 'radios',
'#required' => TRUE,
'#options' => $options,
'#title' => t('Restriction Type'),
'#default_value' => $config->get('method'),
'#description' => t('Choose how the domains list operates. Only allow domains listed to register, or prevent domains listed from registering.'),
);
$form['domain_registration'] = array(
'#type' => 'textarea',
'#required' => TRUE,
'#title' => t('Email domains'),
'#default_value' => $config->get('domain_list'),
'#description' => t('Enter email domains to restrict registration, one entry per line. Wildcards are supported to match any subdomain. Examples: <em>something.com</em> or <em>*.something.com</em>'),
);
$form['domain_registration_message'] = array(
'#type' => 'textfield',
'#required' => TRUE,
'#title' => t('Error message'),
'#maxlength' => 512,
'#size' => 120,
'#default_value' => $config->get('message'),
'#description' => t('Error message to display if the email address does not validate.'),
);
return system_settings_form($form);
}
/**
* Implements hook_form_form_id_form_alter().
*/
function domain_registration_form_user_register_form_alter(&$form, &$form_state, $form_id) {
$form['#validate'][] = 'domain_registration_user_register_validate';
}
/**
* Validation handler. Checks if the email domain is on a list of domains.
*/
function domain_registration_user_register_validate(&$form, &$form_state) {
$config = config('domain_registration.settings');
// Ignore validation if mail already has an error.
$errors = form_get_errors();
if (!empty($errors['mail'])) {
return;
}
$mail = explode('@', $form_state['values']['mail']);
$email_domain = $mail[1];
$domain_list = $config->get('domain_list');
$match = FALSE;
// Only attempt to validate if we have a list of domains.
if (!empty($domain_list) && isset($email_domain)) {
$domain_list = explode("\r\n", $domain_list);
foreach ($domain_list as $listed_domain) {
// Determine if we have matches.
$match = domain_registration_wildcard_match($listed_domain, $email_domain);
if ($match) {
break;
}
}
switch ($config->get('method')) {
// Allow only domains listed to register.
case 0:
if (!$match) {
form_set_error('account', $config->get('message'));
}
break;
// Prevent domains listed from registering.
case 1:
if ($match) {
form_set_error('account', $config->get('message'));
}
break;
}
}
}
/**
* Pattern Match wildcard addresses.
*/
function domain_registration_wildcard_match($pattern, $string) {
return preg_match("#^" . strtr(preg_quote($pattern, '#'), array('\*' => '.*', '\?' => '.')) . "$#i", $string);
}