Tip: Click lines to highlight, hold ctrl/cmd to multi-select

includes/ucp/ucp_register.php (26-Jan @ 13:04)

Stop spambot registations on phpBB3.04 by replacing your old file with this one. Does not work on phpBB3.0. It adds a required, What is 5+2 question on your registration form.

desbest.myopenid.com

Syntax Highlighted Code

  1. <?php
  2. /**
  3. *
  4. * @package ucp
  5. * @version $Id: ucp_register.php 8782 2008-08-23 17:20:55Z acydburn $
  6. * @copyright (c) 2005 phpBB Group
  7. * @license http://opensource.org/licenses/gpl-license.php GNU Public License
  8. *
  9. */
  10.  
  11. /**
  12. * @ignore
  13. */
  14. if (!defined('IN_PHPBB'))
  15. {
  16.     exit;
  17. }
  18.  
  19. /**
  20. * ucp_register
  21. * Board registration
  22. * @package ucp
  23. */
  24. class ucp_register
  25. {
  26.     var $u_action;
  27.  
  28.     function main($id, $mode)
  29.     {
  30.         global $config, $db, $user, $auth, $template, $phpbb_root_path, $phpEx;
  31.  
  32.         //
  33.         if ($config['require_activation'] == USER_ACTIVATION_DISABLE)
  34.         {
  35.             trigger_error('UCP_REGISTER_DISABLE');
  36.         }
  37.  
  38.         include($phpbb_root_path . 'includes/functions_profile_fields.' . $phpEx);
  39.  
  40.         $confirm_id        = request_var('confirm_id', '');
  41.         $coppa            = (isset($_REQUEST['coppa'])) ? ((!empty($_REQUEST['coppa'])) ? 1 : 0) : false;
  42.         $agreed            = (!empty($_POST['agreed'])) ? 1 : 0;
  43.         $submit            = (isset($_POST['submit'])) ? true : false;
  44.         $change_lang    = request_var('change_lang', '');
  45.         $user_lang        = request_var('lang', $user->lang_name);
  46.  
  47.         if ($agreed)
  48.         {
  49.             add_form_key('ucp_register');
  50.         }
  51.         else
  52.         {
  53.             add_form_key('ucp_register_terms');
  54.         }
  55.  
  56.  
  57.         if ($change_lang || $user_lang != $config['default_lang'])
  58.         {
  59.             $use_lang = ($change_lang) ? basename($change_lang) : basename($user_lang);
  60.  
  61.             if (file_exists($user->lang_path . $use_lang . '/'))
  62.             {
  63.                 if ($change_lang)
  64.                 {
  65.                     $submit = false;
  66.  
  67.                     // Setting back agreed to let the user view the agreement in his/her language
  68.                     $agreed = (empty($_GET['change_lang'])) ? 0 : $agreed;
  69.                 }
  70.  
  71.                 $user->lang_name = $lang = $use_lang;
  72.                 $user->lang = array();
  73.                 $user->add_lang(array('common', 'ucp'));
  74.             }
  75.             else
  76.             {
  77.                 $change_lang = '';
  78.                 $user_lang = $user->lang_name;
  79.             }
  80.         }
  81.  
  82.         $cp = new custom_profile();
  83.  
  84.         $error = $cp_data = $cp_error = array();
  85.  
  86.  
  87.         if (!$agreed || ($coppa === false && $config['coppa_enable']) || ($coppa && !$config['coppa_enable']))
  88.         {
  89.             $add_lang = ($change_lang) ? '&change_lang=' . urlencode($change_lang) : '';
  90.             $add_coppa = ($coppa !== false) ? '&coppa=' . $coppa : '';
  91.  
  92.             $s_hidden_fields = ($confirm_id) ? array('confirm_id' => $confirm_id) : array();
  93.  
  94.             // If we change the language, we want to pass on some more possible parameter.
  95.             if ($change_lang)
  96.             {
  97.                 // We do not include the password
  98.                 $s_hidden_fields = array_merge($s_hidden_fields, array(
  99.                     'username'            => utf8_normalize_nfc(request_var('username', '', true)),
  100.                     'email'                => strtolower(request_var('email', '')),
  101.                     'email_confirm'        => strtolower(request_var('email_confirm', '')),
  102.                     'confirm_code'        => request_var('confirm_code', ''),
  103.                     'confirm_id'        => request_var('confirm_id', ''),
  104.                     'lang'                => $user->lang_name,
  105.                     'tz'                => request_var('tz', (float) $config['board_timezone']),
  106.                 ));
  107.             }
  108.  
  109.             if ($coppa === false && $config['coppa_enable'])
  110.             {
  111.                 $now = getdate();
  112.                 $coppa_birthday = $user->format_date(mktime($now['hours'] + $user->data['user_dst'], $now['minutes'], $now['seconds'], $now['mon'], $now['mday'] - 1, $now['year'] - 13), $user->lang['DATE_FORMAT']);
  113.                 unset($now);
  114.  
  115.                 $template->assign_vars(array(
  116.                     'L_COPPA_NO'        => sprintf($user->lang['UCP_COPPA_BEFORE'], $coppa_birthday),
  117.                     'L_COPPA_YES'        => sprintf($user->lang['UCP_COPPA_ON_AFTER'], $coppa_birthday),
  118.  
  119.                     'U_COPPA_NO'        => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=register&coppa=0' . $add_lang),
  120.                     'U_COPPA_YES'        => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=register&coppa=1' . $add_lang),
  121.  
  122.                     'S_SHOW_COPPA'        => true,
  123.                     'S_HIDDEN_FIELDS'    => build_hidden_fields($s_hidden_fields),
  124.                     'S_UCP_ACTION'        => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=register' . $add_lang),
  125.                 ));
  126.             }
  127.             else
  128.             {
  129.                 $template->assign_vars(array(
  130.                     'L_TERMS_OF_USE'    => sprintf($user->lang['TERMS_OF_USE_CONTENT'], $config['sitename'], generate_board_url()),
  131.  
  132.                     'S_SHOW_COPPA'        => false,
  133.                     'S_REGISTRATION'    => true,
  134.                     'S_HIDDEN_FIELDS'    => build_hidden_fields($s_hidden_fields),
  135.                     'S_UCP_ACTION'        => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=register' . $add_lang . $add_coppa),
  136.                     )
  137.                 );
  138.             }
  139.  
  140.             $this->tpl_name = 'ucp_agreement';
  141.             return;
  142.         }
  143.  
  144.  
  145.         // Try to manually determine the timezone and adjust the dst if the server date/time complies with the default setting +/- 1
  146.         $timezone = date('Z') / 3600;
  147.         $is_dst = date('I');
  148.  
  149.         if ($config['board_timezone'] == $timezone || $config['board_timezone'] == ($timezone - 1))
  150.         {
  151.             $timezone = ($is_dst) ? $timezone - 1 : $timezone;
  152.  
  153.             if (!isset($user->lang['tz_zones'][(string) $timezone]))
  154.             {
  155.                 $timezone = $config['board_timezone'];
  156.             }
  157.         }
  158.         else
  159.         {
  160.             $is_dst = $config['board_dst'];
  161.             $timezone = $config['board_timezone'];
  162.         }
  163.  
  164.         //desbest edit: (look for math_question as that is the added edit)
  165.         $data = array(
  166.             'username'            => utf8_normalize_nfc(request_var('username', '', true)),
  167.             'math_question'            => request_var('math_question', '', true),
  168.             'new_password'        => request_var('new_password', '', true),
  169.             'password_confirm'    => request_var('password_confirm', '', true),
  170.             'email'                => strtolower(request_var('email', '')),
  171.             'email_confirm'        => strtolower(request_var('email_confirm', '')),
  172.             'confirm_code'        => request_var('confirm_code', ''),
  173.             'lang'                => basename(request_var('lang', $user->lang_name)),
  174.             'tz'                => request_var('tz', (float) $timezone),
  175.         );
  176.  
  177.         // Check and initialize some variables if needed
  178.         if ($submit)
  179.         {
  180.             $error = validate_data($data, array(
  181.                 'username'            => array(
  182.                     array('string', false, $config['min_name_chars'], $config['max_name_chars']),
  183.                     array('username', '')),
  184.                 'new_password'        => array(
  185.                     array('string', false, $config['min_pass_chars'], $config['max_pass_chars']),
  186.                     array('password')),
  187.                 'password_confirm'    => array('string', false, $config['min_pass_chars'], $config['max_pass_chars']),
  188.                 'email'                => array(
  189.                     array('string', false, 6, 60),
  190.                     array('email')),
  191.                 'email_confirm'        => array('string', false, 6, 60),
  192.                 'confirm_code'        => array('string', !$config['enable_confirm'], 5, 8),
  193.                 'tz'                => array('num', false, -14, 14),
  194.                 'lang'                => array('match', false, '#^[a-z_\-]{2,}$#i'),
  195.             ));
  196.             if (!check_form_key('ucp_register'))
  197.             {
  198.                 $error[] = $user->lang['FORM_INVALID'];
  199.             }
  200.            
  201.             //desbest edit starts
  202.             if ($data['math_question'] != "7")
  203.             {
  204.                 $error[] = "You silly spambot failed to get the question right";
  205.                 //echo "<h1>".$data['math_question']."question is wrong</h1>";
  206.                 //$error[] = $user->lang['MATH_QUESTION_ERROR'];
  207.             }
  208.             //desbest edit ends
  209.  
  210.             // Replace "error" strings with their real, localised form
  211.             $error = preg_replace('#^([A-Z_]+)$#e', "(!empty(\$user->lang['\\1'])) ? \$user->lang['\\1'] : '\\1'", $error);
  212.  
  213.             // DNSBL check
  214.             if ($config['check_dnsbl'])
  215.             {
  216.                 if (($dnsbl = $user->check_dnsbl('register')) !== false)
  217.                 {
  218.                     $error[] = sprintf($user->lang['IP_BLACKLISTED'], $user->ip, $dnsbl[1]);
  219.                 }
  220.             }
  221.  
  222.             // validate custom profile fields
  223.             $cp->submit_cp_field('register', $user->get_iso_lang_id(), $cp_data, $error);
  224.            
  225.            
  226.             }
  227.            
  228.  
  229.             //desbest edit: validation begins
  230.             // Visual Confirmation handling
  231.             $wrong_confirm = false;
  232.             if ($config['enable_confirm'])
  233.             {
  234.                 if (!$confirm_id)
  235.                 {
  236.                     $error[] = $user->lang['CONFIRM_CODE_WRONG'];
  237.                     $wrong_confirm = true;
  238.                 }
  239.                 else
  240.                 {
  241.                     $sql = 'SELECT code
  242.                        FROM ' . CONFIRM_TABLE . "
  243.                        WHERE confirm_id = '" . $db->sql_escape($confirm_id) . "'
  244.                            AND session_id = '" . $db->sql_escape($user->session_id) . "'
  245.                            AND confirm_type = " . CONFIRM_REG;
  246.                     $result = $db->sql_query($sql);
  247.                     $row = $db->sql_fetchrow($result);
  248.                     $db->sql_freeresult($result);
  249.  
  250.                     if ($row)
  251.                     {
  252.                         if (strcasecmp($row['code'], $data['confirm_code']) === 0)
  253.                         {
  254.                             $sql = 'DELETE FROM ' . CONFIRM_TABLE . "
  255.                                WHERE confirm_id = '" . $db->sql_escape($confirm_id) . "'
  256.                                    AND session_id = '" . $db->sql_escape($user->session_id) . "'
  257.                                    AND confirm_type = " . CONFIRM_REG;
  258.                             $db->sql_query($sql);
  259.                         }
  260.                         else
  261.                         {
  262.                             $error[] = $user->lang['CONFIRM_CODE_WRONG'];
  263.                             $wrong_confirm = true;
  264.                         }
  265.                     }
  266.                     else
  267.                     {
  268.                         $error[] = $user->lang['CONFIRM_CODE_WRONG'];
  269.                         $wrong_confirm = true;
  270.                     }
  271.                 }
  272.             }
  273.                 //desbest edit
  274.                 //$damath = $user->lang['MATH_QUESTION_ERROR']; /* print_r($user->lang); */ exit();
  275.                
  276.                
  277.                                                
  278.             if (!sizeof($error))
  279.             {
  280.                 if ($data['new_password'] != $data['password_confirm'])
  281.                 {
  282.                     $error[] = $user->lang['NEW_PASSWORD_ERROR'];
  283.                 }
  284.  
  285.                 if ($data['email'] != $data['email_confirm'])
  286.                 {
  287.                     $error[] = $user->lang['NEW_EMAIL_ERROR'];
  288.                 }
  289.            
  290.            
  291.            
  292.  
  293.  
  294.             if (!sizeof($error))
  295.             {
  296.                 $server_url = generate_board_url();
  297.  
  298.                 // Which group by default?
  299.                 $group_name = ($coppa) ? 'REGISTERED_COPPA' : 'REGISTERED';
  300.  
  301.                 $sql = 'SELECT group_id
  302.                    FROM ' . GROUPS_TABLE . "
  303.                    WHERE group_name = '" . $db->sql_escape($group_name) . "'
  304.                        AND group_type = " . GROUP_SPECIAL;
  305.                 $result = $db->sql_query($sql);
  306.                 $row = $db->sql_fetchrow($result);
  307.                 $db->sql_freeresult($result);
  308.  
  309.                 if (!$row)
  310.                 {
  311.                     trigger_error('NO_GROUP');
  312.                 }
  313.  
  314.                 $group_id = $row['group_id'];
  315.  
  316.                 if (($coppa ||
  317.                     $config['require_activation'] == USER_ACTIVATION_SELF ||
  318.                     $config['require_activation'] == USER_ACTIVATION_ADMIN) && $config['email_enable'])
  319.                 {
  320.                     $user_actkey = gen_rand_string(10);
  321.                     $key_len = 54 - (strlen($server_url));
  322.                     $key_len = ($key_len < 6) ? 6 : $key_len;
  323.                     $user_actkey = substr($user_actkey, 0, $key_len);
  324.  
  325.                     $user_type = USER_INACTIVE;
  326.                     $user_inactive_reason = INACTIVE_REGISTER;
  327.                     $user_inactive_time = time();
  328.                 }
  329.                 else
  330.                 {
  331.                     $user_type = USER_NORMAL;
  332.                     $user_actkey = '';
  333.                     $user_inactive_reason = 0;
  334.                     $user_inactive_time = 0;
  335.                 }
  336.  
  337.                 $user_row = array(
  338.                     'username'                => $data['username'],
  339.                     'user_password'            => phpbb_hash($data['new_password']),
  340.                     'user_email'            => $data['email'],
  341.                     'group_id'                => (int) $group_id,
  342.                     'user_timezone'            => (float) $data['tz'],
  343.                     'user_dst'                => $is_dst,
  344.                     'user_lang'                => $data['lang'],
  345.                     'user_type'                => $user_type,
  346.                     'user_actkey'            => $user_actkey,
  347.                     'user_ip'                => $user->ip,
  348.                     'user_regdate'            => time(),
  349.                     'user_inactive_reason'    => $user_inactive_reason,
  350.                     'user_inactive_time'    => $user_inactive_time,
  351.                 );
  352.  
  353.                 // Register user...
  354.                 $user_id = user_add($user_row, $cp_data);
  355.  
  356.                 // This should not happen, because the required variables are listed above...
  357.                 if ($user_id === false)
  358.                 {
  359.                     trigger_error('NO_USER', E_USER_ERROR);
  360.                 }
  361.  
  362.                 if ($coppa && $config['email_enable'])
  363.                 {
  364.                     $message = $user->lang['ACCOUNT_COPPA'];
  365.                     $email_template = 'coppa_welcome_inactive';
  366.                 }
  367.                 else if ($config['require_activation'] == USER_ACTIVATION_SELF && $config['email_enable'])
  368.                 {
  369.                     $message = $user->lang['ACCOUNT_INACTIVE'];
  370.                     $email_template = 'user_welcome_inactive';
  371.                 }
  372.                 else if ($config['require_activation'] == USER_ACTIVATION_ADMIN && $config['email_enable'])
  373.                 {
  374.                     $message = $user->lang['ACCOUNT_INACTIVE_ADMIN'];
  375.                     $email_template = 'admin_welcome_inactive';
  376.                 }
  377.                 else
  378.                 {
  379.                     $message = $user->lang['ACCOUNT_ADDED'];
  380.                     $email_template = 'user_welcome';
  381.                 }
  382.  
  383.                 if ($config['email_enable'])
  384.                 {
  385.                     include_once($phpbb_root_path . 'includes/functions_messenger.' . $phpEx);
  386.  
  387.                     $messenger = new messenger(false);
  388.  
  389.                     $messenger->template($email_template, $data['lang']);
  390.  
  391.                     $messenger->to($data['email'], $data['username']);
  392.  
  393.                     $messenger->headers('X-AntiAbuse: Board servername - ' . $config['server_name']);
  394.                     $messenger->headers('X-AntiAbuse: User_id - ' . $user->data['user_id']);
  395.                     $messenger->headers('X-AntiAbuse: Username - ' . $user->data['username']);
  396.                     $messenger->headers('X-AntiAbuse: User IP - ' . $user->ip);
  397.  
  398.                     $messenger->assign_vars(array(
  399.                         'WELCOME_MSG'    => htmlspecialchars_decode(sprintf($user->lang['WELCOME_SUBJECT'], $config['sitename'])),
  400.                         'USERNAME'        => htmlspecialchars_decode($data['username']),
  401.                         'PASSWORD'        => htmlspecialchars_decode($data['new_password']),
  402.                         'U_ACTIVATE'    => "$server_url/ucp.$phpEx?mode=activate&u=$user_id&k=$user_actkey")
  403.                     );
  404.  
  405.                     if ($coppa)
  406.                     {
  407.                         $messenger->assign_vars(array(
  408.                             'FAX_INFO'        => $config['coppa_fax'],
  409.                             'MAIL_INFO'        => $config['coppa_mail'],
  410.                             'EMAIL_ADDRESS'    => $data['email'])
  411.                         );
  412.                     }
  413.  
  414.                     $messenger->send(NOTIFY_EMAIL);
  415.  
  416.                     if ($config['require_activation'] == USER_ACTIVATION_ADMIN)
  417.                     {
  418.                         // Grab an array of user_id's with a_user permissions ... these users can activate a user
  419.                         $admin_ary = $auth->acl_get_list(false, 'a_user', false);
  420.                         $admin_ary = (!empty($admin_ary[0]['a_user'])) ? $admin_ary[0]['a_user'] : array();
  421.  
  422.                         // Also include founders
  423.                         $where_sql = ' WHERE user_type = ' . USER_FOUNDER;
  424.  
  425.                         if (sizeof($admin_ary))
  426.                         {
  427.                             $where_sql .= ' OR ' . $db->sql_in_set('user_id', $admin_ary);
  428.                         }
  429.  
  430.                         $sql = 'SELECT user_id, username, user_email, user_lang, user_jabber, user_notify_type
  431.                            FROM ' . USERS_TABLE . ' ' .
  432.                             $where_sql;
  433.                         $result = $db->sql_query($sql);
  434.  
  435.                         while ($row = $db->sql_fetchrow($result))
  436.                         {
  437.                             $messenger->template('admin_activate', $row['user_lang']);
  438.                             $messenger->to($row['user_email'], $row['username']);
  439.                             $messenger->im($row['user_jabber'], $row['username']);
  440.  
  441.                             $messenger->assign_vars(array(
  442.                                 'USERNAME'            => htmlspecialchars_decode($data['username']),
  443.                                 'U_USER_DETAILS'    => "$server_url/memberlist.$phpEx?mode=viewprofile&u=$user_id",
  444.                                 'U_ACTIVATE'        => "$server_url/ucp.$phpEx?mode=activate&u=$user_id&k=$user_actkey")
  445.                             );
  446.  
  447.                             $messenger->send($row['user_notify_type']);
  448.                         }
  449.                         $db->sql_freeresult($result);
  450.                     }
  451.                 }
  452.  
  453.                 $message = $message . '<br /><br />' . sprintf($user->lang['RETURN_INDEX'], '<a href="' . append_sid("{$phpbb_root_path}index.$phpEx") . '">', '</a>');
  454.                 trigger_error($message);
  455.             }
  456.         }
  457.  
  458.         $s_hidden_fields = array(
  459.             'agreed'        => 'true',
  460.             'change_lang'    => 0,
  461.         );
  462.  
  463.         if ($config['coppa_enable'])
  464.         {
  465.             $s_hidden_fields['coppa'] = $coppa;
  466.         }
  467.         $s_hidden_fields = build_hidden_fields($s_hidden_fields);
  468.  
  469.         $confirm_image = '';
  470.  
  471.         // Visual Confirmation - Show images
  472.  
  473.         if ($config['enable_confirm'])
  474.         {
  475.             if ($change_lang)
  476.             {
  477.                 $str = '&change_lang=' . $change_lang;
  478.                 $sql = 'SELECT code
  479.                        FROM ' . CONFIRM_TABLE . "
  480.                        WHERE confirm_id = '" . $db->sql_escape($confirm_id) . "'
  481.                            AND session_id = '" . $db->sql_escape($user->session_id) . "'
  482.                            AND confirm_type = " . CONFIRM_REG;
  483.                 $result = $db->sql_query($sql);
  484.                 if (!$row = $db->sql_fetchrow($result))
  485.                 {
  486.                     $confirm_id = '';
  487.                 }
  488.                 $db->sql_freeresult($result);
  489.             }
  490.             else
  491.             {
  492.                 $str = '';
  493.             }
  494.             if (!$change_lang || !$confirm_id)
  495.             {
  496.                 $user->confirm_gc(CONFIRM_REG);
  497.  
  498.                 $sql = 'SELECT COUNT(session_id) AS attempts
  499.                    FROM ' . CONFIRM_TABLE . "
  500.                    WHERE session_id = '" . $db->sql_escape($user->session_id) . "'
  501.                        AND confirm_type = " . CONFIRM_REG;
  502.                 $result = $db->sql_query($sql);
  503.                 $attempts = (int) $db->sql_fetchfield('attempts');
  504.                 $db->sql_freeresult($result);
  505.  
  506.                 if ($config['max_reg_attempts'] && $attempts > $config['max_reg_attempts'])
  507.                 {
  508.                     trigger_error('TOO_MANY_REGISTERS');
  509.                 }
  510.  
  511.                 $code = gen_rand_string(mt_rand(5, 8));
  512.                 $confirm_id = md5(unique_id($user->ip));
  513.                 $seed = hexdec(substr(unique_id(), 4, 10));
  514.  
  515.                 // compute $seed % 0x7fffffff
  516.                 $seed -= 0x7fffffff * floor($seed / 0x7fffffff);
  517.  
  518.                 $sql = 'INSERT INTO ' . CONFIRM_TABLE . ' ' . $db->sql_build_array('INSERT', array(
  519.                     'confirm_id'    => (string) $confirm_id,
  520.                     'session_id'    => (string) $user->session_id,
  521.                     'confirm_type'    => (int) CONFIRM_REG,
  522.                     'code'            => (string) $code,
  523.                     'seed'            => (int) $seed)
  524.                 );
  525.                 $db->sql_query($sql);
  526.             }
  527.             $confirm_image = '<img src="' . append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=confirm&id=' . $confirm_id . '&type=' . CONFIRM_REG . $str) . '" alt="" title="" />';
  528.             $s_hidden_fields .= '<input type="hidden" name="confirm_id" value="' . $confirm_id . '" />';
  529.         }
  530.  
  531.         //
  532.         $l_reg_cond = '';
  533.         switch ($config['require_activation'])
  534.         {
  535.             case USER_ACTIVATION_SELF:
  536.                 $l_reg_cond = $user->lang['UCP_EMAIL_ACTIVATE'];
  537.             break;
  538.  
  539.             case USER_ACTIVATION_ADMIN:
  540.                 $l_reg_cond = $user->lang['UCP_ADMIN_ACTIVATE'];
  541.             break;
  542.         }
  543.  
  544.         $template->assign_vars(array(
  545.             'ERROR'                => (sizeof($error)) ? implode('<br />', $error) : '',
  546.             'USERNAME'            => $data['username'],
  547.             'PASSWORD'            => $data['new_password'],
  548.             'MATH_QUESTION'            => $data['math_question'],
  549.             'PASSWORD_CONFIRM'    => $data['password_confirm'],
  550.             'EMAIL'                => $data['email'],
  551.             'EMAIL_CONFIRM'        => $data['email_confirm'],
  552.             'CONFIRM_IMG'        => $confirm_image,
  553.  
  554.             'L_CONFIRM_EXPLAIN'            => sprintf($user->lang['CONFIRM_EXPLAIN'], '<a href="mailto:' . htmlspecialchars($config['board_contact']) . '">', '</a>'),
  555.             'L_REG_COND'                => $l_reg_cond,
  556.             'L_USERNAME_EXPLAIN'        => sprintf($user->lang[$config['allow_name_chars'] . '_EXPLAIN'], $config['min_name_chars'], $config['max_name_chars']),
  557.             'L_PASSWORD_EXPLAIN'        => sprintf($user->lang[$config['pass_complex'] . '_EXPLAIN'], $config['min_pass_chars'], $config['max_pass_chars']),
  558.  
  559.             'S_LANG_OPTIONS'    => language_select($data['lang']),
  560.             'S_TZ_OPTIONS'        => tz_select($data['tz']),
  561.             'S_CONFIRM_CODE'    => ($config['enable_confirm']) ? true : false,
  562.             'S_COPPA'            => $coppa,
  563.             'S_HIDDEN_FIELDS'    => $s_hidden_fields,
  564.             'S_UCP_ACTION'        => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=register'),
  565.             )
  566.         );
  567.  
  568.         //
  569.         $user->profile_fields = array();
  570.  
  571.         // Generate profile fields -> Template Block Variable profile_fields
  572.         $cp->generate_profile_fields('register', $user->get_iso_lang_id());
  573.  
  574.         //
  575.         $this->tpl_name = 'ucp_register';
  576.         $this->page_title = 'UCP_REGISTRATION';
  577.     }
  578. }
  579.  
  580. ?>

Plain Code

<?php
/**
*
* @package ucp
* @version $Id: ucp_register.php 8782 2008-08-23 17:20:55Z acydburn $
* @copyright (c) 2005 phpBB Group
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*
*/

/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
    exit;
}

/**
* ucp_register
* Board registration
* @package ucp
*/
class ucp_register
{
    var $u_action;

    function main($id, $mode)
    {
        global $config, $db, $user, $auth, $template, $phpbb_root_path, $phpEx;

        //
        if ($config['require_activation'] == USER_ACTIVATION_DISABLE)
        {
            trigger_error('UCP_REGISTER_DISABLE');
        }

        include($phpbb_root_path . 'includes/functions_profile_fields.' . $phpEx);

        $confirm_id        = request_var('confirm_id', '');
        $coppa            = (isset($_REQUEST['coppa'])) ? ((!empty($_REQUEST['coppa'])) ? 1 : 0) : false;
        $agreed            = (!empty($_POST['agreed'])) ? 1 : 0;
        $submit            = (isset($_POST['submit'])) ? true : false;
        $change_lang    = request_var('change_lang', '');
        $user_lang        = request_var('lang', $user->lang_name);

        if ($agreed)
        {
            add_form_key('ucp_register');
        }
        else
        {
            add_form_key('ucp_register_terms');
        }


        if ($change_lang || $user_lang != $config['default_lang'])
        {
            $use_lang = ($change_lang) ? basename($change_lang) : basename($user_lang);

            if (file_exists($user->lang_path . $use_lang . '/'))
            {
                if ($change_lang)
                {
                    $submit = false;

                    // Setting back agreed to let the user view the agreement in his/her language
                    $agreed = (empty($_GET['change_lang'])) ? 0 : $agreed;
                }

                $user->lang_name = $lang = $use_lang;
                $user->lang = array();
                $user->add_lang(array('common', 'ucp'));
            }
            else
            {
                $change_lang = '';
                $user_lang = $user->lang_name;
            }
        }

        $cp = new custom_profile();

        $error = $cp_data = $cp_error = array();


        if (!$agreed || ($coppa === false && $config['coppa_enable']) || ($coppa && !$config['coppa_enable']))
        {
            $add_lang = ($change_lang) ? '&change_lang=' . urlencode($change_lang) : '';
            $add_coppa = ($coppa !== false) ? '&coppa=' . $coppa : '';

            $s_hidden_fields = ($confirm_id) ? array('confirm_id' => $confirm_id) : array();

            // If we change the language, we want to pass on some more possible parameter.
            if ($change_lang)
            {
                // We do not include the password
                $s_hidden_fields = array_merge($s_hidden_fields, array(
                    'username'            => utf8_normalize_nfc(request_var('username', '', true)),
                    'email'                => strtolower(request_var('email', '')),
                    'email_confirm'        => strtolower(request_var('email_confirm', '')),
                    'confirm_code'        => request_var('confirm_code', ''),
                    'confirm_id'        => request_var('confirm_id', ''),
                    'lang'                => $user->lang_name,
                    'tz'                => request_var('tz', (float) $config['board_timezone']),
                ));
            }

            if ($coppa === false && $config['coppa_enable'])
            {
                $now = getdate();
                $coppa_birthday = $user->format_date(mktime($now['hours'] + $user->data['user_dst'], $now['minutes'], $now['seconds'], $now['mon'], $now['mday'] - 1, $now['year'] - 13), $user->lang['DATE_FORMAT']);
                unset($now);

                $template->assign_vars(array(
                    'L_COPPA_NO'        => sprintf($user->lang['UCP_COPPA_BEFORE'], $coppa_birthday),
                    'L_COPPA_YES'        => sprintf($user->lang['UCP_COPPA_ON_AFTER'], $coppa_birthday),

                    'U_COPPA_NO'        => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=register&coppa=0' . $add_lang),
                    'U_COPPA_YES'        => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=register&coppa=1' . $add_lang),

                    'S_SHOW_COPPA'        => true,
                    'S_HIDDEN_FIELDS'    => build_hidden_fields($s_hidden_fields),
                    'S_UCP_ACTION'        => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=register' . $add_lang),
                ));
            }
            else
            {
                $template->assign_vars(array(
                    'L_TERMS_OF_USE'    => sprintf($user->lang['TERMS_OF_USE_CONTENT'], $config['sitename'], generate_board_url()),

                    'S_SHOW_COPPA'        => false,
                    'S_REGISTRATION'    => true,
                    'S_HIDDEN_FIELDS'    => build_hidden_fields($s_hidden_fields),
                    'S_UCP_ACTION'        => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=register' . $add_lang . $add_coppa),
                    )
                );
            }

            $this->tpl_name = 'ucp_agreement';
            return;
        }


        // Try to manually determine the timezone and adjust the dst if the server date/time complies with the default setting +/- 1
        $timezone = date('Z') / 3600;
        $is_dst = date('I');

        if ($config['board_timezone'] == $timezone || $config['board_timezone'] == ($timezone - 1))
        {
            $timezone = ($is_dst) ? $timezone - 1 : $timezone;

            if (!isset($user->lang['tz_zones'][(string) $timezone]))
            {
                $timezone = $config['board_timezone'];
            }
        }
        else
        {
            $is_dst = $config['board_dst'];
            $timezone = $config['board_timezone'];
        }

        //desbest edit: (look for math_question as that is the added edit)
        $data = array(
            'username'            => utf8_normalize_nfc(request_var('username', '', true)),
            'math_question'            => request_var('math_question', '', true),
            'new_password'        => request_var('new_password', '', true),
            'password_confirm'    => request_var('password_confirm', '', true),
            'email'                => strtolower(request_var('email', '')),
            'email_confirm'        => strtolower(request_var('email_confirm', '')),
            'confirm_code'        => request_var('confirm_code', ''),
            'lang'                => basename(request_var('lang', $user->lang_name)),
            'tz'                => request_var('tz', (float) $timezone),
        );

        // Check and initialize some variables if needed
        if ($submit)
        {
            $error = validate_data($data, array(
                'username'            => array(
                    array('string', false, $config['min_name_chars'], $config['max_name_chars']),
                    array('username', '')),
                'new_password'        => array(
                    array('string', false, $config['min_pass_chars'], $config['max_pass_chars']),
                    array('password')),
                'password_confirm'    => array('string', false, $config['min_pass_chars'], $config['max_pass_chars']),
                'email'                => array(
                    array('string', false, 6, 60),
                    array('email')),
                'email_confirm'        => array('string', false, 6, 60),
                'confirm_code'        => array('string', !$config['enable_confirm'], 5, 8),
                'tz'                => array('num', false, -14, 14),
                'lang'                => array('match', false, '#^[a-z_\-]{2,}$#i'),
            ));
            if (!check_form_key('ucp_register'))
            {
                $error[] = $user->lang['FORM_INVALID'];
            }
            
            //desbest edit starts
            if ($data['math_question'] != "7")
            {
                $error[] = "You silly spambot failed to get the question right";
                //echo "<h1>".$data['math_question']."question is wrong</h1>";
                //$error[] = $user->lang['MATH_QUESTION_ERROR'];
            }
            //desbest edit ends

            // Replace "error" strings with their real, localised form
            $error = preg_replace('#^([A-Z_]+)$#e', "(!empty(\$user->lang['\\1'])) ? \$user->lang['\\1'] : '\\1'", $error);

            // DNSBL check
            if ($config['check_dnsbl'])
            {
                if (($dnsbl = $user->check_dnsbl('register')) !== false)
                {
                    $error[] = sprintf($user->lang['IP_BLACKLISTED'], $user->ip, $dnsbl[1]);
                }
            }

            // validate custom profile fields
            $cp->submit_cp_field('register', $user->get_iso_lang_id(), $cp_data, $error);
            
            
            }
            

            //desbest edit: validation begins
            // Visual Confirmation handling
            $wrong_confirm = false;
            if ($config['enable_confirm'])
            {
                if (!$confirm_id)
                {
                    $error[] = $user->lang['CONFIRM_CODE_WRONG'];
                    $wrong_confirm = true;
                }
                else
                {
                    $sql = 'SELECT code
                        FROM ' . CONFIRM_TABLE . "
                        WHERE confirm_id = '" . $db->sql_escape($confirm_id) . "'
                            AND session_id = '" . $db->sql_escape($user->session_id) . "'
                            AND confirm_type = " . CONFIRM_REG;
                    $result = $db->sql_query($sql);
                    $row = $db->sql_fetchrow($result);
                    $db->sql_freeresult($result);

                    if ($row)
                    {
                        if (strcasecmp($row['code'], $data['confirm_code']) === 0)
                        {
                            $sql = 'DELETE FROM ' . CONFIRM_TABLE . "
                                WHERE confirm_id = '" . $db->sql_escape($confirm_id) . "'
                                    AND session_id = '" . $db->sql_escape($user->session_id) . "'
                                    AND confirm_type = " . CONFIRM_REG;
                            $db->sql_query($sql);
                        }
                        else
                        {
                            $error[] = $user->lang['CONFIRM_CODE_WRONG'];
                            $wrong_confirm = true;
                        }
                    }
                    else
                    {
                        $error[] = $user->lang['CONFIRM_CODE_WRONG'];
                        $wrong_confirm = true;
                    }
                }
            }
                //desbest edit
                //$damath = $user->lang['MATH_QUESTION_ERROR']; /* print_r($user->lang); */ exit();
                
                
                                                
            if (!sizeof($error))
            {
                if ($data['new_password'] != $data['password_confirm'])
                {
                    $error[] = $user->lang['NEW_PASSWORD_ERROR'];
                }

                if ($data['email'] != $data['email_confirm'])
                {
                    $error[] = $user->lang['NEW_EMAIL_ERROR'];
                }
            
            
            


            if (!sizeof($error))
            {
                $server_url = generate_board_url();

                // Which group by default?
                $group_name = ($coppa) ? 'REGISTERED_COPPA' : 'REGISTERED';

                $sql = 'SELECT group_id
                    FROM ' . GROUPS_TABLE . "
                    WHERE group_name = '" . $db->sql_escape($group_name) . "'
                        AND group_type = " . GROUP_SPECIAL;
                $result = $db->sql_query($sql);
                $row = $db->sql_fetchrow($result);
                $db->sql_freeresult($result);

                if (!$row)
                {
                    trigger_error('NO_GROUP');
                }

                $group_id = $row['group_id'];

                if (($coppa ||
                    $config['require_activation'] == USER_ACTIVATION_SELF ||
                    $config['require_activation'] == USER_ACTIVATION_ADMIN) && $config['email_enable'])
                {
                    $user_actkey = gen_rand_string(10);
                    $key_len = 54 - (strlen($server_url));
                    $key_len = ($key_len < 6) ? 6 : $key_len;
                    $user_actkey = substr($user_actkey, 0, $key_len);

                    $user_type = USER_INACTIVE;
                    $user_inactive_reason = INACTIVE_REGISTER;
                    $user_inactive_time = time();
                }
                else
                {
                    $user_type = USER_NORMAL;
                    $user_actkey = '';
                    $user_inactive_reason = 0;
                    $user_inactive_time = 0;
                }

                $user_row = array(
                    'username'                => $data['username'],
                    'user_password'            => phpbb_hash($data['new_password']),
                    'user_email'            => $data['email'],
                    'group_id'                => (int) $group_id,
                    'user_timezone'            => (float) $data['tz'],
                    'user_dst'                => $is_dst,
                    'user_lang'                => $data['lang'],
                    'user_type'                => $user_type,
                    'user_actkey'            => $user_actkey,
                    'user_ip'                => $user->ip,
                    'user_regdate'            => time(),
                    'user_inactive_reason'    => $user_inactive_reason,
                    'user_inactive_time'    => $user_inactive_time,
                );

                // Register user...
                $user_id = user_add($user_row, $cp_data);

                // This should not happen, because the required variables are listed above...
                if ($user_id === false)
                {
                    trigger_error('NO_USER', E_USER_ERROR);
                }

                if ($coppa && $config['email_enable'])
                {
                    $message = $user->lang['ACCOUNT_COPPA'];
                    $email_template = 'coppa_welcome_inactive';
                }
                else if ($config['require_activation'] == USER_ACTIVATION_SELF && $config['email_enable'])
                {
                    $message = $user->lang['ACCOUNT_INACTIVE'];
                    $email_template = 'user_welcome_inactive';
                }
                else if ($config['require_activation'] == USER_ACTIVATION_ADMIN && $config['email_enable'])
                {
                    $message = $user->lang['ACCOUNT_INACTIVE_ADMIN'];
                    $email_template = 'admin_welcome_inactive';
                }
                else
                {
                    $message = $user->lang['ACCOUNT_ADDED'];
                    $email_template = 'user_welcome';
                }

                if ($config['email_enable'])
                {
                    include_once($phpbb_root_path . 'includes/functions_messenger.' . $phpEx);

                    $messenger = new messenger(false);

                    $messenger->template($email_template, $data['lang']);

                    $messenger->to($data['email'], $data['username']);

                    $messenger->headers('X-AntiAbuse: Board servername - ' . $config['server_name']);
                    $messenger->headers('X-AntiAbuse: User_id - ' . $user->data['user_id']);
                    $messenger->headers('X-AntiAbuse: Username - ' . $user->data['username']);
                    $messenger->headers('X-AntiAbuse: User IP - ' . $user->ip);

                    $messenger->assign_vars(array(
                        'WELCOME_MSG'    => htmlspecialchars_decode(sprintf($user->lang['WELCOME_SUBJECT'], $config['sitename'])),
                        'USERNAME'        => htmlspecialchars_decode($data['username']),
                        'PASSWORD'        => htmlspecialchars_decode($data['new_password']),
                        'U_ACTIVATE'    => "$server_url/ucp.$phpEx?mode=activate&u=$user_id&k=$user_actkey")
                    );

                    if ($coppa)
                    {
                        $messenger->assign_vars(array(
                            'FAX_INFO'        => $config['coppa_fax'],
                            'MAIL_INFO'        => $config['coppa_mail'],
                            'EMAIL_ADDRESS'    => $data['email'])
                        );
                    }

                    $messenger->send(NOTIFY_EMAIL);

                    if ($config['require_activation'] == USER_ACTIVATION_ADMIN)
                    {
                        // Grab an array of user_id's with a_user permissions ... these users can activate a user
                        $admin_ary = $auth->acl_get_list(false, 'a_user', false);
                        $admin_ary = (!empty($admin_ary[0]['a_user'])) ? $admin_ary[0]['a_user'] : array();

                        // Also include founders
                        $where_sql = ' WHERE user_type = ' . USER_FOUNDER;

                        if (sizeof($admin_ary))
                        {
                            $where_sql .= ' OR ' . $db->sql_in_set('user_id', $admin_ary);
                        }

                        $sql = 'SELECT user_id, username, user_email, user_lang, user_jabber, user_notify_type
                            FROM ' . USERS_TABLE . ' ' .
                            $where_sql;
                        $result = $db->sql_query($sql);

                        while ($row = $db->sql_fetchrow($result))
                        {
                            $messenger->template('admin_activate', $row['user_lang']);
                            $messenger->to($row['user_email'], $row['username']);
                            $messenger->im($row['user_jabber'], $row['username']);

                            $messenger->assign_vars(array(
                                'USERNAME'            => htmlspecialchars_decode($data['username']),
                                'U_USER_DETAILS'    => "$server_url/memberlist.$phpEx?mode=viewprofile&u=$user_id",
                                'U_ACTIVATE'        => "$server_url/ucp.$phpEx?mode=activate&u=$user_id&k=$user_actkey")
                            );

                            $messenger->send($row['user_notify_type']);
                        }
                        $db->sql_freeresult($result);
                    }
                }

                $message = $message . '<br /><br />' . sprintf($user->lang['RETURN_INDEX'], '<a href="' . append_sid("{$phpbb_root_path}index.$phpEx") . '">', '</a>');
                trigger_error($message);
            }
        }

        $s_hidden_fields = array(
            'agreed'        => 'true',
            'change_lang'    => 0,
        );

        if ($config['coppa_enable'])
        {
            $s_hidden_fields['coppa'] = $coppa;
        }
        $s_hidden_fields = build_hidden_fields($s_hidden_fields);

        $confirm_image = '';

        // Visual Confirmation - Show images

        if ($config['enable_confirm'])
        {
            if ($change_lang)
            {
                $str = '&change_lang=' . $change_lang;
                $sql = 'SELECT code
                        FROM ' . CONFIRM_TABLE . "
                        WHERE confirm_id = '" . $db->sql_escape($confirm_id) . "'
                            AND session_id = '" . $db->sql_escape($user->session_id) . "'
                            AND confirm_type = " . CONFIRM_REG;
                $result = $db->sql_query($sql);
                if (!$row = $db->sql_fetchrow($result))
                {
                    $confirm_id = '';
                }
                $db->sql_freeresult($result);
            }
            else
            {
                $str = '';
            }
            if (!$change_lang || !$confirm_id)
            {
                $user->confirm_gc(CONFIRM_REG);

                $sql = 'SELECT COUNT(session_id) AS attempts
                    FROM ' . CONFIRM_TABLE . "
                    WHERE session_id = '" . $db->sql_escape($user->session_id) . "'
                        AND confirm_type = " . CONFIRM_REG;
                $result = $db->sql_query($sql);
                $attempts = (int) $db->sql_fetchfield('attempts');
                $db->sql_freeresult($result);

                if ($config['max_reg_attempts'] && $attempts > $config['max_reg_attempts'])
                {
                    trigger_error('TOO_MANY_REGISTERS');
                }

                $code = gen_rand_string(mt_rand(5, 8));
                $confirm_id = md5(unique_id($user->ip));
                $seed = hexdec(substr(unique_id(), 4, 10));

                // compute $seed % 0x7fffffff
                $seed -= 0x7fffffff * floor($seed / 0x7fffffff);

                $sql = 'INSERT INTO ' . CONFIRM_TABLE . ' ' . $db->sql_build_array('INSERT', array(
                    'confirm_id'    => (string) $confirm_id,
                    'session_id'    => (string) $user->session_id,
                    'confirm_type'    => (int) CONFIRM_REG,
                    'code'            => (string) $code,
                    'seed'            => (int) $seed)
                );
                $db->sql_query($sql);
            }
            $confirm_image = '<img src="' . append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=confirm&id=' . $confirm_id . '&type=' . CONFIRM_REG . $str) . '" alt="" title="" />';
            $s_hidden_fields .= '<input type="hidden" name="confirm_id" value="' . $confirm_id . '" />';
        }

        //
        $l_reg_cond = '';
        switch ($config['require_activation'])
        {
            case USER_ACTIVATION_SELF:
                $l_reg_cond = $user->lang['UCP_EMAIL_ACTIVATE'];
            break;

            case USER_ACTIVATION_ADMIN:
                $l_reg_cond = $user->lang['UCP_ADMIN_ACTIVATE'];
            break;
        }

        $template->assign_vars(array(
            'ERROR'                => (sizeof($error)) ? implode('<br />', $error) : '',
            'USERNAME'            => $data['username'],
            'PASSWORD'            => $data['new_password'],
            'MATH_QUESTION'            => $data['math_question'],
            'PASSWORD_CONFIRM'    => $data['password_confirm'],
            'EMAIL'                => $data['email'],
            'EMAIL_CONFIRM'        => $data['email_confirm'],
            'CONFIRM_IMG'        => $confirm_image,

            'L_CONFIRM_EXPLAIN'            => sprintf($user->lang['CONFIRM_EXPLAIN'], '<a href="mailto:' . htmlspecialchars($config['board_contact']) . '">', '</a>'),
            'L_REG_COND'                => $l_reg_cond,
            'L_USERNAME_EXPLAIN'        => sprintf($user->lang[$config['allow_name_chars'] . '_EXPLAIN'], $config['min_name_chars'], $config['max_name_chars']),
            'L_PASSWORD_EXPLAIN'        => sprintf($user->lang[$config['pass_complex'] . '_EXPLAIN'], $config['min_pass_chars'], $config['max_pass_chars']),

            'S_LANG_OPTIONS'    => language_select($data['lang']),
            'S_TZ_OPTIONS'        => tz_select($data['tz']),
            'S_CONFIRM_CODE'    => ($config['enable_confirm']) ? true : false,
            'S_COPPA'            => $coppa,
            'S_HIDDEN_FIELDS'    => $s_hidden_fields,
            'S_UCP_ACTION'        => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=register'),
            )
        );

        //
        $user->profile_fields = array();

        // Generate profile fields -> Template Block Variable profile_fields
        $cp->generate_profile_fields('register', $user->get_iso_lang_id());

        //
        $this->tpl_name = 'ucp_register';
        $this->page_title = 'UCP_REGISTRATION';
    }
}

?>

Permalink: http://codedumper.com/includesucpucp_registerphp