4 // Account registration and verification form. This form can be called
7 // 1. ?first_name=FIRST_NAME&last_name=LAST_NAME&email=EMAIL...
9 // Called by the form at the bottom of the page to register a new
10 // account. If any required fields are missing, AddPerson() will fault
11 // and the specified fields will be highlighted. Otherwise, the
12 // account is registered (but not enabled), and VerifyPerson() sends
13 // the user a link back to this page.
15 // 2. ?id=PERSON_ID&key=VERIFICATION_KEY...
17 // Sent to the specified user by VerifyPerson(). If the user receives
18 // the message, then the registered e-mail address is considered
19 // valid, and registration can continue. VerifyPerson() is called
20 // again, and sends the current PI(s) (and support if the user is
21 // requesting a PI role) a link to the user's Account Details page to
22 // enable the account.
24 // Mark Huang <mlhuang@cs.princeton.edu>
25 // Copyright (C) 2007 The Trustees of Princeton University
30 // Get session and API handles
31 require_once 'plc_session.php';
32 global $plc, $api, $adm;
35 require_once 'plc_drupal.php';
36 include 'plc_header.php';
38 require_once 'plc_functions.php';
39 require_once 'nifty.php';
40 require_once 'details.php';
42 drupal_set_title('Account Registration');
44 // Drupalish, but does not use Drupal itself to generate the form
47 $person_form = array();
48 $person_form['first_name'] = array('title' => 'First name', 'required' => TRUE,
49 'maxlength' => 60, 'size' => 15);
50 $person_form['last_name'] = array('title' => 'Last name', 'required' => TRUE,
51 'maxlength' => 60, 'size' => 15);
52 $person_form['title'] = array('title' => 'Title', 'required' => FALSE,
53 'maxlength' => 60, 'size' => 5);
54 $person_form['phone'] = array('title' => 'Telephone', 'required' => FALSE,
55 'maxlength' => 60, 'size' => 20);
56 $person_form['email'] = array('title' => 'E-mail', 'required' => TRUE,
57 'maxlength' => 60, 'size' => 30);
58 $person_form['password'] = array('title' => 'Password', 'required' => TRUE,
59 'maxlength' => 60, 'size' => 20);
60 $person_form['site_ids'] = array('title' => 'Site', 'required' => TRUE);
62 $person_form['roles'] = array('title' => 'Additional Roles', 'required' => FALSE);
64 //////////////////// additional messages
65 $person_form['email']['comment'] = <<< EOF
66 Your <b>E-mail</b> address must be able to receive e-mail and will be
67 used as your $PLC_NAME username
71 // dirty hack feb 2018; if this file can be found,
72 // its contents is used instead of the hard-wired message
73 // it is searched along php's include path, so it should be
74 // allright to save it as /etc/planetlab/php/person-registration.txt
75 // of course html tags like <code> and <br /> are OK
76 global $message_filename;
77 $message_filename = "person-registration.txt";
80 $person_form['site_ids']['comment'] = file_get_contents($message_filename, TRUE);
81 } catch (Exception $e) {
82 $person_form['site_ids']['comment'] = "Select the site where you belong";
86 $person_form['roles']['comment'] = <<< EOF
87 Do not select the <b>Principal Investigator</b> or <b>Technical
88 Contact</b> roles unless you have spoken with the current PI of your
89 site, and you intend to assume either or both of these roles.
90 <br> Use Command-Clic to unselect or for multiple selection
93 //////////////////// parse form values and store in $person
96 foreach ($person_form as $name => $item) {
97 if (!empty($_REQUEST[$name])) {
98 $person[$name] = $_REQUEST[$name];
102 // Filter out "Select a site"
103 if (!empty($person['site_ids'])) {
104 $person['site_ids'] = array_filter($person['site_ids'],
105 create_function('$site_id', 'return intval($site_id) > 0;'));
108 //////////////////// minimal checking
109 function check_form ($person) {
113 // Look for missing/blank entries
115 foreach ($person_form as $name => $item) {
116 if ($item['required'] && empty($person[$name])) {
117 $missing[] = $item['title'];
122 if (!empty($missing)) {
124 foreach ($missing as $field) $warnings []= "$field field is required.";
125 print html_div(plc_itemize($warnings),"messages error");
129 // check that the email address is not already used on this peer
130 $email=$person['email'];
131 $already = $adm->GetPersons ( array('email'=>$person['email'],'peer_id'=>NULL) );
132 if ( ! empty ($already) ) {
133 print html_div(plc_itemize(array("Email $email already used !")),"messages error");
140 //////////////////// perform api calls
141 function register_person ($person) {
145 $errors = errors_init ();
147 // jan-2013 with improvements in plcapi-5.1-6 about managing persons and tags,
148 // AddPerson has gone more picky and we need to remove some fields
149 // that no longer are silently ignored by AddPerson
150 $site_ids=$person['site_ids'];
151 unset ($person['site_ids']);
152 $roles=$person['roles'];
153 unset ($person['roles']);
155 $person_id = $adm->AddPerson($person);
156 $errors = errors_record ($adm,$errors);
158 if (empty($errors)) {
161 // Add person to requested sites
162 foreach ($site_ids as $site_id) {
163 $adm->AddPersonToSite($person_id, intval($site_id));
164 $adm->SetPersonPrimarySite($person_id, intval($site_id));
167 // Add requested roles. Always add the user role.
168 $adm->AddRoleToPerson('user', $person_id);
169 if (!empty($roles)) {
170 foreach ($roles as $role) {
171 $adm->AddRoleToPerson($role, $person_id);
175 // Send an e-mail containing a link back to this page, which will
176 // verify the given e-mail address as valid. PIs can still create
177 // and enable accounts on behalf of their users, they just have to
178 // find and enable the accounts manually after registering them.
179 $adm->VerifyPerson($person_id);
181 // Disable submit button
182 $person['person_id'] = $person_id;
185 $errors = errors_record ($adm,$errors);
188 if (!empty($errors)) {
189 errors_display($errors);
191 $email=$person['email'];
192 $text="Your registration request has been received. An e-mail has been sent to $email with further instructions.";
193 print html_div($text,"messages status");
198 if (!empty($person) && check_form ($person))
199 register_person($person);
201 $PLC_NAME = htmlspecialchars(PLC_NAME);
203 // E-mail address verified, go ahead and notify the PI (and possibly
204 // support if a PI role was requested) that a registration request was
206 if (!empty($_REQUEST['id']) && !empty($_REQUEST['key'])) {
207 $person_id = intval($_REQUEST['id']);
208 if ($adm->VerifyPerson($person_id, $_REQUEST['key']) != 1) {
209 plc_error($adm->error());
211 $persons = $adm->GetPersons(array($person_id));
212 $person = $persons[0];
214 // Remove the password field from the form so that it is not
215 // highlighted as missing.
216 unset($person_form['password']);
219 $messages []= 'Your e-mail address has been verified. ';
220 $messages []= 'The PI(s) at your site have been notified of your account registration ';
222 if (! in_array('pi', $person['roles'])) {
223 $messages []= 'They are responsible for enabling your account.';
225 $support = PLC_MAIL_SUPPORT_ADDRESS;
226 $messages []= "They should contact <a href=\"mailto:$support\">$PLC_NAME Support <$support></a>. ";
227 $messages []= "$PLC_NAME Support will enable your account once authorized by your PI(s).";
230 plc_itemize($messages,"messages status");
237 // cannot register with foreign site
238 // we also hide sites that are created by sfa
239 // as well as the ones that have a disabled_registration tag set
240 $adm->GetSites(array('is_public' => TRUE, 'peer_id' => NULL,
241 'sfa_created' => NULL,
242 'disabled_registration' => NULL,
244 array('site_id', 'name', 'enabled', 'peer_id',
245 'sfa_created', 'disabled_registration'));
249 list($sites, $roles) = $adm->commit();
251 // Prepend invalid site to beginning of list to force user to select a site
252 $sites = array_merge(array(array('site_id' => -1, 'name' => 'Select a site', 'enabled' => TRUE)), $sites);
254 // Drop down selection box for each site
255 function site_option($site) {
258 $site_id = $site['site_id'];
260 if (!empty($person['site_ids']) && in_array($site_id, $person['site_ids'])) {
261 $selected = 'selected="selected"';
266 $option = "<option value='$site_id' $selected";
267 if ( ! $site['enabled'] )
268 $option .= " disabled='disabled'";
270 $option .= htmlspecialchars($site['name']);
271 # Safari/IE do not implement disabled correctly
272 if ( ! $site['enabled'] )
273 $option .= " (disabled, or pending registration)";
274 $option .= "</option>";
277 $site_options = implode("\n", array_map('site_option', $sites));
279 // Do not tempt users to register for the admin role. Administrators
280 // should register normally, then be granted the admin role by another
281 // admin. Also, all accounts should have the user role (see above).
282 foreach ($roles as $i => $role) {
283 if ($role['name'] == 'admin' || $role['name'] == 'user') {
289 global $standard_roles;
290 $standard_roles = array('user' => 'User',
291 'pi' => 'Principal Investigator',
292 'tech' => 'Technical Contact',
293 'admin' => 'Administrator');
295 // Drop down selection box for each role
296 function role_option($role) {
297 global $standard_roles, $selected_roles;
299 $name = $role['name'];
301 if (!empty($person['roles']) && in_array($name, $person['roles'])) {
302 $selected = 'selected="selected"';
307 $display = array_key_exists($name, $standard_roles) ? $standard_roles[$name] : $name;
309 $option = "<option value=\"$name\" $selected>";
310 $option .= htmlspecialchars($display);
311 $option .= "</option>";
314 $role_options = implode("\n", array_map('role_option', $roles));
317 $nifty=new PlekitNifty ('register','person-register','medium');
319 $details = new PlekitDetails(TRUE);
321 $details->form_start(l_person_register(),array());
323 // Do not allow resubmits
324 $register_button="<input type='submit' name='op' value='Register' class='form-submit' />";
325 if (empty($person['person_id'])) {
326 $details->tr($register_button,'center');
330 foreach ($person_form as $name => $item) {
332 if ( ! empty($item['comment'])) {
334 $details->tr($item['comment'] . ":");
337 $title = $item['title'];
338 $required = $item['required'] ? '<span class="form-required" title="This field is required.">*</span>' : "";
339 $class = $item['required'] ? "required" : "";
340 if ($item['required'] && !empty($person) && empty($person[$name])) {
345 $left_part = "<label class='$class' for='edit-$name'>$title: $required</label>";
351 $right_part= "<select name='site_ids[]' id='edit-site_ids' class='form-select $class'> $site_options </select>";
356 if (0) { /* Not letting users select PI or Tech any more. Its only lead to confusion and abuse. */
357 $right_part = "<select name='roles[]' multiple='multiple' id='edit-roles' class='form-select $class'> $role_options </select>";
362 $maxlength = $item['maxlength'];
363 $size = $item['size'];
364 $value = !empty($person[$name]) ? $person[$name] : "";
365 $type = $name == 'password' ? "password" : "text";
366 $right_part = "<input type='$type' maxlength='$maxlength' name='$name' id='edit-$name' size='$size' value='$value' class='form-text $class'>";
370 $details->th_td($left_part,$right_part);
373 // Do not allow resubmits
374 if (empty($person['person_id'])) {
376 $details->tr($register_button,'center');
379 $details->form_end();
383 include 'plc_footer.php';