PageRenderTime 40ms CodeModel.GetById 8ms RepoModel.GetById 0ms app.codeStats 0ms

/register.php

https://bitbucket.org/ryanhowdy/family-connections
PHP | 607 lines | 452 code | 67 blank | 88 comment | 34 complexity | 24628d7039ea62b26d7a8c1f4d35a578 MD5 | raw file
Possible License(s): Apache-2.0, GPL-2.0
  1. <?php
  2. /**
  3. * Register
  4. *
  5. * PHP versions 4 and 5
  6. *
  7. * @category FCMS
  8. * @package FamilyConnections
  9. * @author Ryan Haudenschilt <r.haudenschilt@gmail.com>
  10. * @copyright 2007 Haudenschilt LLC
  11. * @license http://www.gnu.org/licenses/gpl-2.0.html GPLv2
  12. * @link http://www.familycms.com/wiki/
  13. */
  14. session_start();
  15. require 'fcms.php';
  16. load('facebook', 'socialmedia');
  17. control();
  18. exit();
  19. /**
  20. * control
  21. *
  22. * The controlling structure for this page.
  23. *
  24. * @return void
  25. */
  26. function control ()
  27. {
  28. if (!isRegistrationOn())
  29. {
  30. displayClosed();
  31. }
  32. elseif (isset($_GET['ajax'])) {
  33. checkUsername();
  34. }
  35. elseif (isset($_GET['facebook'])) {
  36. handleFacebookRegister();
  37. }
  38. elseif (isset($_POST['submit']))
  39. {
  40. displaySubmit();
  41. }
  42. else
  43. {
  44. displayForm();
  45. }
  46. }
  47. /**
  48. * displayHeader
  49. *
  50. * @return void
  51. */
  52. function displayHeader ()
  53. {
  54. print '
  55. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  56. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="'.T_('lang').'" lang="'.T_('lang').'">
  57. <head>
  58. <title>'.sprintf(T_pgettext('%s is the name of the website', 'Register for %s.'), getSiteName()).'</title>
  59. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  60. <meta name="author" content="Ryan Haudenschilt" />
  61. <link rel="stylesheet" type="text/css" href="ui/fcms-core.css" />
  62. <script type="text/javascript" src="ui/js/prototype.js"></script>
  63. <script type="text/javascript" src="ui/js/livevalidation.js"></script>
  64. <script type="text/javascript">
  65. //<![CDATA[
  66. Event.observe(window, "load", function() {
  67. var u = $("username");
  68. u.focus();
  69. u.onchange = function(){
  70. checkAvailability();
  71. }
  72. });
  73. var url = "register.php";
  74. function checkAvailability() {
  75. new Ajax.Request(url, {
  76. method: "get",
  77. parameters: { ajax: 1, username: $("username").value },
  78. onSuccess: process,
  79. onFailure: function() { alert("'.T_('There was an error with the connection.').'"); }
  80. });
  81. }
  82. function process(transport) {
  83. var response = transport.responseText;
  84. var u = $("username");
  85. var s = document.createElement("span");
  86. if (response == "available") {
  87. s.addClassName("available");
  88. s.appendChild(document.createTextNode("'.T_('Available').'"));
  89. u.insert({"after":s});
  90. } else if (response == "unavailable") {
  91. u.addClassName("LV_invalid_field");
  92. s.addClassName("LV_validation_message LV_invalid");
  93. s.appendChild(document.createTextNode("'.T_('That username has already been taken.').'"));
  94. u.insert({"after":s});
  95. } else {
  96. alert("'.T_('Could not check availability of username.').'");
  97. }
  98. }
  99. //]]>
  100. </script>
  101. </head>
  102. <body>';
  103. }
  104. /**
  105. * displayFooter
  106. *
  107. * @return void
  108. */
  109. function displayFooter ()
  110. {
  111. echo '
  112. </body>
  113. </html>';
  114. }
  115. /**
  116. * displayClosed
  117. *
  118. * @return void
  119. */
  120. function displayClosed ()
  121. {
  122. displayHeader();
  123. echo '
  124. <div id="column"><p class="error-alert">'.T_('Registration is closed.').'</p></div>';
  125. displayFooter();
  126. die();
  127. }
  128. /**
  129. * displaySubmit
  130. *
  131. * @param string $params The params that have been submitted to the form.
  132. *
  133. * @return void
  134. */
  135. function displaySubmit ($params = '')
  136. {
  137. displayHeader();
  138. if ($params == '')
  139. {
  140. $formData = $_POST;
  141. }
  142. else
  143. {
  144. $formData = $params;
  145. }
  146. // Make sure they filled out all required fields
  147. $required_fields = array('username', 'password', 'fname', 'lname', 'email');
  148. foreach ($required_fields as $f)
  149. {
  150. if (strlen($formData[$f]) < 1)
  151. {
  152. displayHtmlForm('<p class="error">'.T_('You forgot to fill out a required field.').'</p>');
  153. displayFooter();
  154. return;
  155. }
  156. }
  157. $email = strip_tags($formData['email']);
  158. $username = strip_tags($formData['username']);
  159. $fname = strip_tags($formData['fname']);
  160. $lname = strip_tags($formData['lname']);
  161. $cleanEmail = escape_string($email);
  162. $cleanUsername = escape_string($username);
  163. $cleanFname = escape_string($fname);
  164. $cleanLname = escape_string($lname);
  165. $password = $formData['password'];
  166. if ($params == '')
  167. {
  168. $password = md5($password);
  169. }
  170. // Is email available?
  171. $result = mysql_query("SELECT `email` FROM `fcms_users` WHERE `email` = '$cleanEmail'");
  172. $email_check = mysql_num_rows($result);
  173. if ($email_check > 0)
  174. {
  175. displayHtmlForm(
  176. '<p class="error">'.T_('The email you have choosen is already in use. Please choose a different email.').' <a href="lostpw.php">'.T_('If you have forgotten your password please reset it').'</a></p>'
  177. );
  178. displayFooter();
  179. return;
  180. }
  181. // Is username availabel?
  182. $result = mysql_query("SELECT `username` FROM `fcms_users` WHERE `username` = '$cleanUsername'");
  183. $username_check = mysql_num_rows($result);
  184. if ($username_check > 0)
  185. {
  186. displayHtmlForm(
  187. '<p class="error">'.T_('Sorry, but that username is already taken. Please choose another username.').'</p>'
  188. );
  189. displayFooter();
  190. return;
  191. }
  192. $sex = 'M';
  193. if (isset($formData['sex']))
  194. {
  195. $sex = $formData['sex'] == 'F' ? 'F' : 'M';
  196. }
  197. // Create new user
  198. $sql = "INSERT INTO `fcms_users`
  199. (`access`, `joindate`, `fname`, `lname`, `sex`, `email`, `username`, `password`)
  200. VALUES (
  201. 3,
  202. NOW(),
  203. '$cleanFname',
  204. '$cleanLname',
  205. '$sex',
  206. '$cleanEmail',
  207. '$cleanUsername',
  208. '$password'
  209. )";
  210. if (!mysql_query($sql))
  211. {
  212. displaySqlError($sql, mysql_error());
  213. displayFooter();
  214. return;
  215. }
  216. $lastid = mysql_insert_id();
  217. $fbAccessToken = isset($formData['accessToken']) ? $formData['accessToken'] : '';
  218. // Create user's settings
  219. $sql = "INSERT INTO `fcms_user_settings`(`user`, `fb_access_token`)
  220. VALUES ($lastid, '$fbAccessToken')";
  221. if (!mysql_query($sql))
  222. {
  223. displaySqlError($sql, mysql_error());
  224. displayFooter();
  225. return;
  226. }
  227. // Create user's address
  228. $sql = "INSERT INTO `fcms_address`(`user`, `updated`)
  229. VALUES ($lastid, NOW())";
  230. if (!mysql_query($sql))
  231. {
  232. displaySqlError($sql, mysql_error());
  233. displayFooter();
  234. return;
  235. }
  236. // Setup some stuff for sending email
  237. $sitename = getSiteName();
  238. $now = gmdate('F j, Y, g:i a'); // TODO: use admin's tz?
  239. $subject = $sitename.' '.T_('Membership');
  240. $message = '';
  241. // Which activation method?
  242. $sql = "SELECT `value` AS 'auto_activate'
  243. FROM `fcms_config`
  244. WHERE `name` = 'auto_activate'";
  245. $result = mysql_query($sql);
  246. if (!$result)
  247. {
  248. displaySqlError($sql, mysql_error());
  249. displayFooter();
  250. return;
  251. }
  252. $row = mysql_fetch_assoc($result);
  253. // Auto activation
  254. if ($row['auto_activate'] == 1)
  255. {
  256. handleAutoActivation($email, $subject, $lastid, $sitename);
  257. }
  258. elseif ($row['auto_activate'] == 0)
  259. {
  260. $message = T_('Dear').' '.$fname.' '.$lname.',
  261. '.sprintf(T_('Thank you for registering at %s'), $sitename).'
  262. '.T_('In order to login and begin using the site, your administrator must activate your account. You will get an email when this has been done.').'
  263. '.T_('After your account is activated you can login using the following information').':
  264. '.T_('Username').': '.$username.'
  265. '.T_('Thanks').',
  266. '.sprintf(T_('The %s Webmaster'), $sitename).'
  267. '.T_('This is an automated response, please do not reply.');
  268. echo '
  269. <div id="msg">
  270. <h1>'.T_('Congratulations and Welcome').'</h1>
  271. <p>
  272. '.sprintf(T_('You have been successfully registered at %s.'), $sitename).'
  273. '.sprintf(T_('Your account information has been emailed to %s.'), $email).'<br/>
  274. <b>'.T_('Please remember your username and password for this site.').'</b>
  275. </p>
  276. <p>'.T_('Unfortunately your account must be activated before you can <a href="index.php">login</a> and begin using the site.').'</p>
  277. </div>';
  278. mail($email, $subject, $message, getEmailHeaders());
  279. }
  280. // Email the admin
  281. $admin_subject = sprintf(T_('New User Registration at %s'), $sitename);
  282. $admin_message = sprintf(T_('A new user has registered at %s'), $sitename).':
  283. '.T_('Time of Registration').': '.$now.'
  284. '.T_('Username').': '.$username.'
  285. '.T_('Name').': '.$fname.' '.$lname;
  286. mail(getContactEmail(), $admin_subject, $admin_message, getEmailHeaders());
  287. }
  288. /**
  289. * displayForm
  290. *
  291. * @return void
  292. */
  293. function displayForm ()
  294. {
  295. displayHeader();
  296. displayHtmlForm();
  297. displayFooter();
  298. }
  299. /**
  300. * displayHtmlForm
  301. *
  302. * @param string $error Any errors from the previous form
  303. *
  304. * @return void
  305. */
  306. function displayHtmlForm ($error = '0')
  307. {
  308. $user = isset($_POST['username']) ? cleanOutput($_POST['username']) : '';
  309. $first = isset($_POST['fname']) ? cleanOutput($_POST['fname']) : '';
  310. $last = isset($_POST['lname']) ? cleanOutput($_POST['lname']) : '';
  311. $email = isset($_POST['email']) ? cleanOutput($_POST['email']) : '';
  312. $fbData = getFacebookConfigData();
  313. $fbUser = null;
  314. $facebook = null;
  315. echo '
  316. <div id="column">
  317. <h1>'.T_('Register').'</h1>';
  318. if ($error !== '0')
  319. {
  320. echo $error;
  321. }
  322. // Print the facebook register button
  323. if (!empty($fbData['fb_app_id']) && !empty($fbData['fb_secret']))
  324. {
  325. $facebook = new Facebook(array(
  326. 'appId' => $fbData['fb_app_id'],
  327. 'secret' => $fbData['fb_secret'],
  328. ));
  329. // Check if the user is logged in and authed
  330. $fbUser = $facebook->getUser();
  331. if ($fbUser)
  332. {
  333. try
  334. {
  335. $fbProfile = $facebook->api('/me');
  336. }
  337. catch (FacebookApiException $e)
  338. {
  339. $fbUser = null;
  340. }
  341. }
  342. }
  343. if ($fbUser && !isset($_GET['normal']))
  344. {
  345. echo '
  346. <p style="text-align:center; padding: 20px 0">
  347. <a class="fbbutton" href="?facebook=1">'.T_('Register with Facebook').'</a><br/><br/><br/>
  348. <small><a style="text-decoration:none" href="register.php?normal=1">'.T_('Cancel').'</a></small>
  349. </p>';
  350. }
  351. if (!$fbUser && $facebook)
  352. {
  353. $params = array('scope' => 'user_about_me,user_birthday,user_location,email,publish_stream,offline_access');
  354. echo '
  355. <p style="text-align:right">
  356. <a class="fbbutton" href="'.$facebook->getLoginUrl($params).'">'.T_('Connect with Facebook').'</a>
  357. </p>';
  358. }
  359. if (!$fbUser || isset($_GET['normal']))
  360. {
  361. echo '
  362. <form id="registerform" name="registerform" action="register.php" method="post">
  363. <div class="field-row">
  364. <div class="field-label"><label for="username"><b>'.T_('Username').'</b> <span class="req">*</span></label></div>
  365. <div class="field-widget">
  366. <input type="text" name="username" id="username" title="'.T_('Used for logging into the site.').'" value="'.$user.'"/>
  367. </div>
  368. </div>
  369. <script type="text/javascript">
  370. var funame = new LiveValidation(\'username\', { onlyOnSubmit: true });
  371. funame.add(Validate.Presence, {failureMessage: "'.T_('Required: Can\' login without one.').'"});
  372. </script>
  373. <div class="field-row">
  374. <div class="field-label"><label for="password"><b>'.T_('Password').'</b> <span class="req">*</span></label></div>
  375. <div class="field-widget">
  376. <input type="password" name="password" id="password" title="'.T_('Used for loggin into the site.').'"/>
  377. </div>
  378. </div>
  379. <script type="text/javascript">
  380. var fpass = new LiveValidation(\'password\', { onlyOnSubmit: true });
  381. fpass.add(Validate.Presence, {failureMessage: "'.T_('Required: Can\'t login without one.').'"});
  382. </script>
  383. <div class="field-row">
  384. <div class="field-label"><label for="fname"><b>'.T_('First Name').'</b> <span class="req">*</span></label></div>
  385. <div class="field-widget">
  386. <input type="text" name="fname" id="fname" title="'.T_('The name your mother gave you.').'" value="'.$first.'"/>
  387. </div>
  388. </div>
  389. <script type="text/javascript">
  390. var ffname = new LiveValidation(\'fname\', { onlyOnSubmit: true });
  391. ffname.add(Validate.Presence, { failureMessage: "'.T_('Required').'" });
  392. </script>
  393. <div class="field-row">
  394. <div class="field-label"><label for="lname"><b>'.T_('Last Name').'</b> <span class="req">*</span></label></div>
  395. <div class="field-widget">
  396. <input type="text" name="lname" id="lname" title="'.T_('Your family name.').'" value="'.$last.'"/>
  397. </div>
  398. </div>
  399. <script type="text/javascript">
  400. var flname = new LiveValidation(\'lname\', { onlyOnSubmit: true });
  401. flname.add(Validate.Presence, {failureMessage: "'.T_('Required').'"});
  402. </script>
  403. <div class="field-row">
  404. <div class="field-label"><label for="email"><b>'.T_('Email Address').'</b> <span class="req">*</span></label></div>
  405. <div class="field-widget">
  406. <input type="text" name="email" id="email" title="'.T_('Where can we send validation and updates?').'" value="'.$email.'"/>
  407. </div>
  408. </div>
  409. <script type="text/javascript">
  410. var femail = new LiveValidation(\'email\', { onlyOnSubmit: true });
  411. femail.add( Validate.Presence, { failureMessage: "'.T_('Required').'" } );
  412. femail.add( Validate.Email, { failureMessage: "'.T_('Invalid Email').'" } );
  413. femail.add( Validate.Length, { minimum: 10 } );
  414. </script>
  415. <p>
  416. <a class="cancel" href="index.php">'.T_('Cancel').'</a>
  417. <input id="submit" name="submit" type="submit" value="'.T_('Submit').'"/>
  418. </p>
  419. <div class="clear"></div>
  420. </form>
  421. </div>';
  422. }
  423. }
  424. /**
  425. * handleAutoActivation
  426. *
  427. * @param string $email email address to send email to
  428. * @param string $subject subject of email
  429. * @param int $id id of user being activated
  430. * @param string $sitename sitename
  431. *
  432. * @return void
  433. */
  434. function handleAutoActivation ($email, $subject, $id, $sitename)
  435. {
  436. $code = uniqid(''); //bug in some versions of php, needs some value here
  437. $sql = "UPDATE `fcms_users`
  438. SET `activate_code` = '$code'
  439. WHERE `id` = '$id'";
  440. if (!mysql_query($sql))
  441. {
  442. displaySqlError($sql, mysql_error());
  443. displayFooter();
  444. die();
  445. }
  446. $message = T_('Please click the following link to activate your account').':
  447. '.getDomainAndDir().'activate.php?uid='.$id.'&code='.$code;
  448. echo '
  449. <div id="msg">
  450. <h1>'.T_('Congratulations and Welcome').'</h1>
  451. <p>
  452. '.sprintf(T_('You have been successfully registered at %s.'), $sitename).'
  453. '.sprintf(T_('Your account information has been emailed to %s.'), $email).'<br/>
  454. <b>'.T_('Please remember your username and password for this site.').'</b>
  455. </p>
  456. <p>'.T_('Unfortunately you must activate your account before you can <a href="index.php">login</a> and begin using the site').'</p>
  457. </div>';
  458. mail($email, $subject, $message, getEmailHeaders());
  459. }
  460. /**
  461. * checkUsername
  462. *
  463. * @return void
  464. */
  465. function checkUsername ()
  466. {
  467. $username = strip_tags($_GET['username']);
  468. $username = escape_string($username);
  469. $result = mysql_query("SELECT `username` FROM `fcms_users` WHERE `username` = '$username'");
  470. $username_check = mysql_num_rows($result);
  471. if ($username_check > 0)
  472. {
  473. echo 'unavailable';
  474. }
  475. else
  476. {
  477. echo 'available';
  478. }
  479. }
  480. /**
  481. * displayFacebookRegister
  482. *
  483. * @return void
  484. */
  485. function handleFacebookRegister ()
  486. {
  487. $fbData = getFacebookConfigData();
  488. $fbProfile = '';
  489. if (empty($fbData['fb_app_id']) && empty($fbData['fb_secret']))
  490. {
  491. displayHeader();
  492. displayHtmlForm(T_('Facebook isn\'t Configured Yet.'));
  493. displayFooter();
  494. return;
  495. }
  496. $facebook = new Facebook(array(
  497. 'appId' => $fbData['fb_app_id'],
  498. 'secret' => $fbData['fb_secret'],
  499. ));
  500. // Check if the user is logged in and authed
  501. $fbUser = $facebook->getUser();
  502. if ($fbUser)
  503. {
  504. try
  505. {
  506. $fbProfile = $facebook->api('/me');
  507. }
  508. catch (FacebookApiException $e)
  509. {
  510. $fbUser = null;
  511. }
  512. }
  513. // the user's auth went away or logged out of fb, send them back to register form
  514. if (!$fbUser)
  515. {
  516. displayForm();
  517. return;
  518. }
  519. // Register new user
  520. $accessToken = $facebook->getAccessToken();
  521. $params = array(
  522. 'fname' => $fbProfile['first_name'],
  523. 'lname' => $fbProfile['last_name'],
  524. 'email' => $fbProfile['email'],
  525. 'sex' => $fbProfile['gender'] == 'male' ? 'M' : 'F',
  526. 'username' => $fbProfile['email'],
  527. 'password' => 'FACEBOOK',
  528. 'accessToken' => $accessToken
  529. );
  530. displaySubmit($params);
  531. }