Files
IPB/upload/sources/action_public/register.php
T
2025-12-19 00:24:35 -08:00

2897 lines
101 KiB
PHP

<?php
/*
+--------------------------------------------------------------------------
| Invision Power Board 2.2.2
| =============================================
| by Matthew Mecham
| (c) 2001 - 2006 Invision Power Services, Inc.
| http://www.invisionpower.com
| =============================================
| Web: http://www.invisionboard.com
| http://www.ibresource.ru/products/invisionpowerboard/
| Time: Monday 05th of March 2007 10:10:54 PM
| Release: e3790216629e5a2aaf37070b32237f06
| Licence Info: http://www.invisionboard.com/?license
| http://www.ibresource.ru/license
+---------------------------------------------------------------------------
| INVISION POWER BOARD IS NOT FREE / OPEN SOURCE!
+---------------------------------------------------------------------------
| INVISION POWER BOARD ÍÅ ßÂËßÅÒÑß ÁÅÑÏËÀÒÍÛÌ ÏÐÎÃÐÀÌÌÍÛÌ ÎÁÅÑÏÅ×ÅÍÈÅÌ!
| Ïðàâà íà ÏÎ ïðèíàäëåæàò Invision Power Services
| Ïðàâà íà ïåðåâîä IBResource (http://www.ibresource.ru)
+---------------------------------------------------------------------------
| > $Date: 2006-11-09 15:32:37 -0600 (Thu, 09 Nov 2006) $
| > $Revision: 722 $
| > $Author: bfarber $
+---------------------------------------------------------------------------
|
| > Registration functions
| > Module written by Matt Mecham
| > Date started: 16th February 2002
|
| > Module Version Number: 1.0.0
| > Quality Checked: Wed 15 Sept. 2004
+--------------------------------------------------------------------------
*/
if ( ! defined( 'IN_IPB' ) )
{
print "<h1>Íåêîððåêòíûé àäðåñ</h1>Âû íå èìååòå äîñòóïà ê ýòîìó ôàéëó íàïðÿìóþ. Åñëè âû íåäàâíî îáíîâëÿëè ôîðóì, âû äîëæíû îáíîâèòü âñå ñîîòâåòñòâóþùèå ôàéëû.";
exit();
}
class register {
var $output = "";
var $page_title = "";
var $nav = array();
var $html = "";
var $email = "";
var $modules = "";
function auto_run()
{
//-----------------------------------------
// Require the HTML and language modules
//-----------------------------------------
$this->ipsclass->load_language('lang_register');
$this->ipsclass->load_template('skin_register');
$this->base_url = $this->ipsclass->base_url;
$this->base_url_nosess = "{$this->ipsclass->vars['board_url']}/index.{$this->ipsclass->vars['php_ext']}";
//-----------------------------------------
// Fix up languages
//-----------------------------------------
foreach( array( 'dname_text', 'reg_error_dname_len', 'reg_error_username_none', 'reg_error_no_name', 'user_name_text' ) as $k )
{
$this->ipsclass->lang[ $k ] = sprintf( $this->ipsclass->lang[ $k ], $this->ipsclass->vars['max_user_name_length'] );
}
//-----------------------------------------
// Get the emailer module
//-----------------------------------------
require ROOT_PATH."sources/classes/class_email.php";
$this->email = new emailer();
$this->email->ipsclass =& $this->ipsclass;
$this->email->email_init();
if ( USE_MODULES == 1 )
{
require ROOT_PATH."modules/ipb_member_sync.php";
$this->modules = new ipb_member_sync();
$this->modules->ipsclass =& $this->ipsclass;
}
//-----------------------------------------
// Board offline?
//-----------------------------------------
if ($this->ipsclass->vars['board_offline'] == 1)
{
if ($this->ipsclass->member['g_access_offline'] != 1)
{
$this->ipsclass->vars['no_reg'] = 1;
}
}
//-----------------------------------------
// What to do?
//-----------------------------------------
switch($this->ipsclass->input['CODE'])
{
case '02':
$this->create_account();
break;
case '03':
$this->validate_user();
break;
case '05':
$this->show_manual_form();
break;
case '06':
$this->show_manual_form('lostpass');
break;
case 'lostpassform':
$this->show_manual_form('lostpass');
break;
case '07':
$this->show_manual_form('newemail');
break;
case '10':
$this->lost_password_start();
break;
case '11':
$this->lost_password_end();
break;
case '12':
$this->coppa_perms_form();
break;
case 'coppa_two':
$this->coppa_two();
break;
case 'image':
$this->show_image();
break;
case 'reval':
$this->revalidate_one();
break;
case 'reval2':
$this->revalidate_two();
break;
case 'complete_login':
$this->complete_login_form();
break;
case 'complete_login_do':
$this->complete_login_save();
break;
default:
if ($this->ipsclass->vars['use_coppa'] == 1 and $this->ipsclass->input['coppa_pass'] != 1)
{
$this->coppa_start();
}
else
{
$this->show_reg_form();
}
break;
}
//-----------------------------------------
// If we have any HTML to print, do so...
//-----------------------------------------
$this->ipsclass->print->add_output("$this->output");
$this->ipsclass->print->do_output( array( 'TITLE' => $this->page_title, 'JS' => 0, 'NAV' => $this->nav ) );
}
/*-------------------------------------------------------------------------*/
// Save login information
/*-------------------------------------------------------------------------*/
function complete_login_save()
{
//-----------------------------------------
// INIT
//-----------------------------------------
$mid = intval( $this->ipsclass->input['mid'] );
$key = intval( $this->ipsclass->input['key'] );
$in_email = strtolower( trim($this->ipsclass->input['EmailAddress']) );
$banfilters = array();
$form_errors = array();
$members_display_name = trim( $this->ipsclass->input['members_display_name'] );
$poss_session_id = "";
//-----------------------------------------
// Get DB row
//-----------------------------------------
$reg = $this->ipsclass->DB->build_and_exec_query( array( 'select' => '*', 'from' => 'members_partial', 'where' => "partial_member_id={$mid} AND partial_date={$key}" ) );
$tmp_member = $this->ipsclass->DB->build_and_exec_query( array( 'select' => '*', 'from' => 'members', 'where' => "id={$mid}" ) );
//-----------------------------------------
// Got it?
//-----------------------------------------
if ( ! $reg['partial_id'] OR ! $tmp_member['id'] )
{
$this->ipsclass->Error( array( 'LEVEL' => 1, 'MSG' => 'data_incorrect' ) );
}
//-----------------------------------------
// Load ban filters
//-----------------------------------------
$this->ipsclass->DB->simple_construct( array( 'select' => '*', 'from' => 'banfilters' ) );
$this->ipsclass->DB->simple_exec();
while( $r = $this->ipsclass->DB->fetch_row() )
{
$banfilters[ $r['ban_type'] ][] = $r['ban_content'];
}
//-----------------------------------------
// Check
//-----------------------------------------
/*if ( $this->ipsclass->vars['no_reg'] == 1 )
{
$this->ipsclass->Error( array( 'LEVEL' => 1, 'MSG' => 'reg_off' ) );
}*/
//-----------------------------------------
// Custom profile field stuff
//-----------------------------------------
require_once( ROOT_PATH.'sources/classes/class_custom_fields.php' );
$fields = new custom_fields( $this->ipsclass->DB );
$fields->cache_data = $this->ipsclass->cache['profilefields'];
$fields->init_data();
$fields->parse_to_save( 1 );
//-----------------------------------------
// Check...
//-----------------------------------------
if ( count( $fields->error_fields['empty'] ) )
{
$form_errors['general'][] = $this->ipsclass->lang['err_complete_form'];
}
if ( count( $fields->error_fields['invalid'] ) )
{
$form_errors['general'][] = $this->ipsclass->lang['err_invalid'];
}
if ( count( $fields->error_fields['toobig'] ) )
{
$form_errors['general'][] = $this->ipsclass->lang['err_cf_to_long'];
}
//-----------------------------------------
// Remove 'sneaky' spaces
//-----------------------------------------
if ( $this->ipsclass->vars['strip_space_chr'] )
{
$members_display_name = str_replace( chr(160), ' ', $members_display_name );
$members_display_name = str_replace( chr(173), ' ', $members_display_name );
if ( $this->ipsclass->vars['gb_char_set'] == 'iso-8859-1' ) {
$members_display_name = str_replace( chr(240), ' ', $members_display_name );
}
}
//-----------------------------------------
// Test unicode name too
//-----------------------------------------
$unicode_dname = preg_replace_callback('/&#([0-9]+);/si', create_function( '$matches', 'return chr($matches[1]);' ), $members_display_name);
//-----------------------------------------
// Testing email addresses?
//-----------------------------------------
if ( ! $reg['partial_email_ok'] )
{
//-----------------------------------------
// Check the email address
//-----------------------------------------
$in_email = $this->ipsclass->clean_email($in_email);
//-----------------------------------------
// Test email address
//-----------------------------------------
$this->ipsclass->input['EmailAddress_two'] = strtolower( trim($this->ipsclass->input['EmailAddress_two']) );
if ($this->ipsclass->input['EmailAddress_two'] != $in_email)
{
$form_errors['email'][] = $this->ipsclass->lang['reg_error_email_nm'];
}
//-----------------------------------------
// Are they banned [EMAIL]?
//-----------------------------------------
if ( is_array( $banfilters['email'] ) and count( $banfilters['email'] ) )
{
foreach ( $banfilters['email'] as $email )
{
$email = str_replace( "\*", '.*' , preg_quote($email, "/") );
if ( preg_match( "/^{$email}$/i", $in_email ) )
{
$form_errors['email'][] = $this->ipsclass->lang['reg_error_email_taken'];
break;
}
}
}
//-----------------------------------------
// Is this email addy taken?
//-----------------------------------------
if ( $this->ipsclass->converge->converge_check_for_member_by_email( $in_email ) == TRUE )
{
$form_errors['email'][] = $this->ipsclass->lang['reg_error_email_taken'];
}
}
//-----------------------------------------
// More unicode..
//-----------------------------------------
$len_d = preg_replace("/&#([0-9]+);/", "-", $members_display_name );
//-----------------------------------------
// Test dname
//-----------------------------------------
if ( $this->ipsclass->vars['auth_allow_dnames'] )
{
if ( ! $members_display_name OR strlen($len_d) < 3 OR strlen($len_d) > 32 )
{
$form_errors['dname'][] = $this->ipsclass->lang['reg_error_no_name'];
}
}
//-----------------------------------------
// CHECK 1: Any errors (missing fields, etc)?
//-----------------------------------------
if ( count( $form_errors ) )
{
$this->complete_login_form( $form_errors );
return;
}
if ( $this->ipsclass->vars['auth_allow_dnames'] )
{
//-----------------------------------------
// DNAME: Illegal characters
//-----------------------------------------
if ( preg_match( "#[\[\];,\|]#", $members_display_name ) )
{
$form_errors['dname'][] = $this->ipsclass->lang['reg_error_chars'];
}
//-----------------------------------------
// DNAME: Is this name already taken?
//-----------------------------------------
$this->ipsclass->DB->cache_add_query( 'general_get_by_display_name', array( 'members_display_name' => strtolower($members_display_name) ) );
$this->ipsclass->DB->cache_exec_query();
$name_check = $this->ipsclass->DB->fetch_row();
if ( $name_check['id'] AND $name_check['id'] != $mid )
{
$form_errors['dname'][] = $this->ipsclass->lang['reg_error_taken'];
}
//-----------------------------------------
// DNAME: Special chars?
//-----------------------------------------
if ( $unicode_dname != $members_display_name )
{
$this->ipsclass->DB->cache_add_query( 'general_get_by_display_name', array( 'members_display_name' => $this->ipsclass->DB->add_slashes(strtolower($unicode_dname) ) ));
$this->ipsclass->DB->cache_exec_query();
$name_check = $this->ipsclass->DB->fetch_row();
if ( $name_check['id'] AND $name_check['id'] != $mid )
{
$form_errors['dname'][] = $this->ipsclass->lang['reg_error_taken'];
}
}
//-----------------------------------------
// DNAME: Banned?
//-----------------------------------------
if ( is_array( $banfilters['name'] ) and count( $banfilters['name'] ) )
{
foreach ( $banfilters['name'] as $n )
{
$n = preg_replace( "/\*/", '.*' , preg_quote($n, "/") );
if ( $n AND preg_match( "/^{$n}$/i", $members_display_name ) )
{
$form_errors['dname'][] = $this->ipsclass->lang['reg_error_taken'];
break;
}
}
}
//-----------------------------------------
// DNAME: GUEST
//-----------------------------------------
if (strtolower($members_display_name) == 'guest')
{
$form_errors['dname'][] = $this->ipsclass->lang['reg_error_taken'];
}
}
//-----------------------------------------
// Are they banned [IP]?
//-----------------------------------------
if ( is_array( $banfilters['ip'] ) and count( $banfilters['ip'] ) )
{
foreach ($banfilters['ip'] as $ip)
{
$ip = str_replace( '\*', '.*', preg_quote($ip, "/") );
if ( preg_match( "/^{$ip}/", $this->ipsclass->input['IP_ADDRESS'] ) )
{
$this->ipsclass->Error( array( 'LEVEL' => 1, 'MSG' => 'you_are_banned', 'INIT' => 1 ) );
}
}
}
//-----------------------------------------
// CHECK 2: Any errors (duplicate names, etc)?
//-----------------------------------------
if ( count( $form_errors ) )
{
$this->complete_login_form( $form_errors );
return;
}
//-----------------------------------------
// Update: Members
//-----------------------------------------
$members_display_name = $this->ipsclass->vars['auth_allow_dnames'] ? $members_display_name : $tmp_member['name'];
if ( ! $reg['partial_email_ok'] )
{
$this->ipsclass->DB->do_update( 'members', array( 'email' => $in_email,
'members_display_name' => $members_display_name,
'members_l_display_name' => strtolower( $members_display_name ) ), 'id='.$mid );
//-----------------------------------------
// Update: Converge
//-----------------------------------------
$this->ipsclass->DB->do_update( 'members_converge', array( 'converge_email' => $in_email ), 'converge_id='.$mid );
}
else
{
$this->ipsclass->DB->do_update( 'members', array( 'members_display_name' => $members_display_name,
'members_l_display_name' => strtolower( $members_display_name ) ), 'id='.$mid );
}
//-----------------------------------------
// Delete: Partials row
//-----------------------------------------
$this->ipsclass->DB->do_delete( 'members_partial', 'partial_member_id='.$mid );
//-----------------------------------------
// Update: Profile fields
//-----------------------------------------
if ( is_array($fields->out_fields) and count($fields->out_fields) )
{
$this->ipsclass->DB->do_update( 'pfields_content', $fields->out_fields, 'member_id='.$mid );
}
//-----------------------------------------
// Send out admin email
//-----------------------------------------
if ( $this->ipsclass->vars['new_reg_notify'] )
{
$date = $this->ipsclass->get_date( time(), 'LONG', 1 );
$this->email->get_template("admin_newuser");
$this->email->build_message( array( 'DATE' => $date,
'MEMBER_NAME' => $members_display_name ) );
$this->email->subject = $this->ipsclass->lang['new_registration_email'] . $this->ipsclass->vars['board_name'];
$this->email->to = $this->ipsclass->vars['email_in'];
$this->email->send_mail();
}
//-----------------------------------------
// Set cookies
//-----------------------------------------
$member = $this->ipsclass->DB->build_and_exec_query( array( 'select' => '*',
'from' => 'members',
'where' => "id=$mid"
) );
$this->ipsclass->my_setcookie("member_id" , $member['id'] , 1);
$this->ipsclass->my_setcookie("pass_hash" , $member['member_login_key'], 1);
//-----------------------------------------
// Create / Update session
//-----------------------------------------
if ( $cookie_id = $this->ipsclass->my_getcookie('session_id') )
{
$poss_session_id = $this->ipsclass->my_getcookie('session_id');
}
else if ( $this->ipsclass->input['s'] )
{
$poss_session_id = $this->ipsclass->input['s'];
}
//-----------------------------------------
// Clean...
//-----------------------------------------
$poss_session_id = preg_replace("/([^a-zA-Z0-9])/", "", $poss_session_id);
//-----------------------------------------
// Got a valid session ID...
//-----------------------------------------
if ($poss_session_id)
{
$session_id = $poss_session_id;
//-----------------------------------------
// Delete any old sessions with this users IP
// addy that doesn't match our session ID.
//-----------------------------------------
$this->ipsclass->DB->do_delete( 'sessions', "ip_address='".$this->ipsclass->ip_address."' AND id != '$session_id'" );
$this->ipsclass->DB->do_shutdown_update( 'sessions', array ( 'member_name' => $member['members_display_name'],
'member_id' => $member['id'],
'running_time' => time(),
'member_group' => $member['mgroup'],
'login_type' => $this->ipsclass->input['Privacy'] ? 1 : 0 ), "id='".$session_id."'" );
}
else
{
$session_id = md5( uniqid(microtime()) );
if( $this->ipsclass->vars['match_ipaddress'] )
{
//-----------------------------------------
// Delete any old sessions with this users IP addy.
//-----------------------------------------
$this->ipsclass->DB->do_delete( 'sessions', "ip_address='".$this->ipsclass->ip_address."'" );
}
$this->ipsclass->DB->do_shutdown_insert( 'sessions', array ( 'id' => $session_id,
'member_name' => $member['members_display_name'],
'member_id' => $member['id'],
'running_time' => time(),
'member_group' => $member['mgroup'],
'ip_address' => $this->ipsclass->ip_address,
'browser' => substr($this->ipsclass->clean_value($this->ipsclass->my_getenv('HTTP_USER_AGENT')), 0, 50),
'login_type' => $this->ipsclass->input['Privacy'] ? 1 : 0 ) );
}
$this->ipsclass->member = $member;
$this->ipsclass->session_id = $session_id;
//-----------------------------------------
// Update Stats
//-----------------------------------------
$this->ipsclass->cache['stats']['last_mem_name'] = $this->ipsclass->member['members_display_name'];
$this->ipsclass->cache['stats']['last_mem_id'] = $this->ipsclass->member['id'];
$this->ipsclass->cache['stats']['mem_count'] += 1;
$this->ipsclass->update_cache( array( 'name' => 'stats', 'array' => 1, 'deletefirst' => 0 ) );
//-----------------------------------------
// set cookie
//-----------------------------------------
$this->ipsclass->my_setcookie("session_id", $this->ipsclass->session_id, -1);
//-----------------------------------------
// Go to the board index
//-----------------------------------------
$this->ipsclass->print->redirect_screen( $this->ipsclass->lang['clogin_done'], 'act=idx' );
}
/*-------------------------------------------------------------------------*/
// Show "check revalidate form" er.. form. thing.
/*-------------------------------------------------------------------------*/
function complete_login_form( $form_errors=array() )
{
//-----------------------------------------
// INIT
//-----------------------------------------
$mid = intval( $this->ipsclass->input['mid'] );
$key = intval( $this->ipsclass->input['key'] );
$final_errors = array();
//-----------------------------------------
// Get DB row
//-----------------------------------------
$reg = $this->ipsclass->DB->build_and_exec_query( array( 'select' => '*',
'from' => 'members_partial',
'where' => "partial_member_id={$mid} AND partial_date={$key}" ) );
//-----------------------------------------
// Got it?
//-----------------------------------------
if ( ! $reg['partial_id'] )
{
$this->ipsclass->Error( array( 'LEVEL' => 1, 'MSG' => 'data_incorrect' ) );
}
//-----------------------------------------
// Custom profile fields stuff
//-----------------------------------------
$required_output = "";
require_once( ROOT_PATH.'sources/classes/class_custom_fields.php' );
$fields = new custom_fields( $this->ipsclass->DB );
$fields->cache_data = $this->ipsclass->cache['profilefields'];
$fields->init_data();
$fields->parse_to_register();
foreach( $fields->out_fields as $id => $data )
{
if ( $fields->cache_data[ $id ]['pf_not_null'] == 1 )
{
$ftype = 'required_output';
}
else
{
continue;
}
if ( $fields->cache_data[ $id ]['pf_type'] == 'drop' )
{
$form_element = $this->ipsclass->compiled_templates['skin_register']->field_dropdown( 'field_'.$id, $data );
}
else if ( $fields->cache_data[ $id ]['pf_type'] == 'area' )
{
$data = $this->ipsclass->input['field_'.$id] ? $this->ipsclass->input['field_'.$id] : $data;
$form_element = $this->ipsclass->compiled_templates['skin_register']->field_textarea( 'field_'.$id, $data );
}
else
{
$data = $this->ipsclass->input['field_'.$id] ? $this->ipsclass->input['field_'.$id] : $data;
$form_element = $this->ipsclass->compiled_templates['skin_register']->field_textinput( 'field_'.$id, $data );
}
${$ftype} .= $this->ipsclass->compiled_templates['skin_register']->field_entry( $fields->field_names[ $id ], $fields->field_desc[ $id ], $form_element );
}
//-----------------------------------------
// ERROR CHECK
//-----------------------------------------
if ( is_array( $form_errors['general'] ) AND count( $form_errors['general'] ) )
{
$this->output .= $this->ipsclass->compiled_templates['skin_register']->errors( implode( "<br />", $form_errors['general'] ) );
}
//-----------------------------------------
// Other errors
//-----------------------------------------
foreach( array( 'username', 'dname', 'password', 'email' ) as $thing )
{
if ( is_array( $form_errors[ $thing ] ) AND count( $form_errors[ $thing ] ) )
{
$final_errors[ $thing ] = implode( "<br />", $form_errors[ $thing ] );
}
}
//-----------------------------------------
// No display name?
//-----------------------------------------
if ( ! $this->ipsclass->member['members_display_name'] )
{
$this->ipsclass->member['members_display_name'] = $this->ipsclass->member['email'];
}
//-----------------------------------------
// Show the form (email and display name)
//-----------------------------------------
$this->output .= $this->ipsclass->compiled_templates['skin_register']->reg_complete_login( $mid, $key, $required_output, $final_errors, $reg );
$this->page_title = $this->ipsclass->lang['clogin_title'];
$this->nav = array( $this->ipsclass->lang['clogin_title'] );
}
/*-------------------------------------------------------------------------*/
// Show "check revalidate form" er.. form. thing.
/*-------------------------------------------------------------------------*/
function revalidate_one($errors="")
{
if ($errors != "")
{
$this->output .= $this->ipsclass->compiled_templates['skin_register']->errors( $this->ipsclass->lang[$errors] );
}
$name = $this->ipsclass->member['id'] == "" ? '' :
( $this->ipsclass->vars['ipbli_usertype'] == 'username' ? $this->ipsclass->member['name'] : $this->ipsclass->member['email'] );
$this->output .= $this->ipsclass->compiled_templates['skin_register']->show_revalidate_form($name);
$this->page_title = $this->ipsclass->lang['rv_title'];
$this->nav = array( $this->ipsclass->lang['rv_title'] );
}
/*-------------------------------------------------------------------------*/
// Complete revalidation
/*-------------------------------------------------------------------------*/
function revalidate_two()
{
//-----------------------------------------
// Check in the DB for entered member name
//-----------------------------------------
if ( $_POST['username'] == "" )
{
$this->revalidate_one('err_no_username');
return;
}
$username = $this->ipsclass->input['username'];
if ( $this->ipsclass->vars['ipbli_usertype'] == 'username' )
{
$this->ipsclass->DB->cache_add_query( 'login_getmember', array( 'username' => $username ) );
$this->ipsclass->DB->cache_exec_query();
$member = $this->ipsclass->DB->fetch_row();
//-----------------------------------------
// Got a username?
//-----------------------------------------
if ( ! $member['id'] )
{
$this->revalidate_one('err_no_username');
return;
}
$this->ipsclass->converge->converge_load_member( $member['email'] );
if ( ! $this->ipsclass->converge->member['converge_id'] )
{
$this->revalidate_one('err_no_username');
return;
}
}
//-----------------------------------------
// EMAIL LOG IN
//-----------------------------------------
else
{
$email = $username;
$this->ipsclass->converge->converge_load_member( $email );
if ( $this->ipsclass->converge->member['converge_id'] )
{
$this->ipsclass->DB->build_query( array(
'select' => 'm.*',
'from' => array( 'members' => 'm' ),
'where' => "email='".strtolower($username)."'",
'add_join' => array( 0 => array( 'select' => 'g.*',
'from' => array( 'groups' => 'g' ),
'where' => 'g.g_id=m.mgroup',
'type' => 'inner'
)
)
) );
$this->ipsclass->DB->exec_query();
$member = $this->ipsclass->DB->fetch_row();
if ( ! $member['id'] )
{
$this->revalidate_one('err_no_username');
return;
}
}
else
{
$this->revalidate_one('err_no_username');
return;
}
}
//-----------------------------------------
// Check in the DB for any validations
//-----------------------------------------
$this->ipsclass->DB->simple_construct( array( 'select' => '*', 'from' => 'validating', 'where' => "member_id=".intval($member['id']) ) );
$this->ipsclass->DB->simple_exec();
if ( ! $val = $this->ipsclass->DB->fetch_row() )
{
$this->revalidate_one('err_no_validations');
return;
}
//-----------------------------------------
// Which type is it then?
//-----------------------------------------
if ( $val['lost_pass'] == 1 )
{
$this->email->get_template("lost_pass");
$this->email->build_message( array(
'NAME' => $member['members_display_name'],
'THE_LINK' => $this->base_url_nosess."?act=Reg&CODE=lostpassform&uid=".$member['id']."&aid=".$val['vid'],
'MAN_LINK' => $this->base_url_nosess."?act=Reg&CODE=lostpassform",
'EMAIL' => $member['email'],
'ID' => $member['id'],
'CODE' => $val['vid'],
'IP_ADDRESS' => $this->ipsclass->input['IP_ADDRESS'],
)
);
$this->email->subject = $this->ipsclass->lang['lp_subject'].' '.$this->ipsclass->vars['board_name'];
$this->email->to = $member['email'];
$this->email->send_mail();
}
else if ( $val['new_reg'] == 1 )
{
$this->email->get_template("reg_validate");
$this->email->build_message( array(
'THE_LINK' => $this->base_url_nosess."?act=Reg&CODE=03&uid=".$member['id']."&aid=".$val['vid'],
'NAME' => $member['members_display_name'],
'MAN_LINK' => $this->base_url_nosess."?act=Reg&CODE=05",
'EMAIL' => $member['email'],
'ID' => $member['id'],
'CODE' => $val['vid'],
)
);
$this->email->subject = $this->ipsclass->lang['email_reg_subj']." ".$this->ipsclass->vars['board_name'];
$this->email->to = $member['email'];
$this->email->send_mail();
}
else if ( $val['email_chg'] == 1 )
{
$this->email->get_template("newemail");
$this->email->build_message( array(
'NAME' => $member['members_display_name'],
'THE_LINK' => $this->base_url_nosess."?act=Reg&CODE=03&type=newemail&uid=".$member['id']."&aid=".$val['vid'],
'ID' => $member['id'],
'MAN_LINK' => $this->base_url_nosess."?act=Reg&CODE=07",
'CODE' => $val['vid'],
)
);
$this->email->subject = $this->ipsclass->lang['ne_subject'].' '.$this->ipsclass->vars['board_name'];
$this->email->to = $member['email'];
$this->email->send_mail();
}
else
{
$this->revalidate_one('err_no_validations');
return;
}
$this->output .= $this->ipsclass->compiled_templates['skin_register']->show_revalidated();
$this->page_title = $this->ipsclass->lang['rv_title'];
$this->nav = array( $this->ipsclass->lang['rv_title'] );
}
/*-------------------------------------------------------------------------*/
// Coppa Start
/*-------------------------------------------------------------------------*/
function coppa_perms_form()
{
echo($this->ipsclass->compiled_templates['skin_register']->coppa_form());
exit();
}
/*-------------------------------------------------------------------------*/
// Coppa form
/*-------------------------------------------------------------------------*/
function coppa_start()
{
$coppa_date = date( 'j-F y', mktime(0,0,0,date("m"),date("d"),date("Y")-13) );
$this->ipsclass->lang['coppa_form_text'] = str_replace( "<#FORM_LINK#>", "<a href='{$this->ipsclass->base_url}act=Reg&amp;CODE=12'>{$this->ipsclass->lang['coppa_link_form']}</a>", $this->ipsclass->lang['coppa_form_text']);
$this->output .= $this->ipsclass->compiled_templates['skin_register']->coppa_start($coppa_date);
$this->page_title = $this->ipsclass->lang['coppa_title'];
$this->nav = array( $this->ipsclass->lang['coppa_title'] );
}
/*-------------------------------------------------------------------------*/
// Coppa print
/*-------------------------------------------------------------------------*/
function coppa_two()
{
$this->ipsclass->lang['coppa_form_text'] = str_replace( "<#FORM_LINK#>", "<a href='{$this->ipsclass->base_url}act=Reg&amp;CODE=12'>{$this->ipsclass->lang['coppa_link_form']}</a>", $this->ipsclass->lang['coppa_form_text']);
$this->output .= $this->ipsclass->compiled_templates['skin_register']->coppa_two();
$this->page_title = $this->ipsclass->lang['coppa_title'];
$this->nav = array( $this->ipsclass->lang['coppa_title'] );
}
/*-------------------------------------------------------------------------*/
// lost_password_start
/*-------------------------------------------------------------------------*/
function lost_password_start($errors="")
{
//-----------------------------------------
// Do we have another URL that one needs
// to visit to reset their password?
//-----------------------------------------
$this->login_method = $this->ipsclass->DB->build_and_exec_query( array( 'select' => '*', 'from' => 'login_methods', 'where' => 'login_enabled=1' ) );
if ( $this->login_method['login_maintain_url'] )
{
$this->ipsclass->boink_it( $this->login_method['login_maintain_url'] );
exit();
}
if ($this->ipsclass->vars['bot_antispam'])
{
//-----------------------------------------
// Sort out the security code
//-----------------------------------------
$r_date = time() - (60*60*6);
//-----------------------------------------
// Remove old reg requests from the DB
//-----------------------------------------
$this->ipsclass->DB->do_delete( 'reg_antispam', "ctime < '$r_date'" );
//-----------------------------------------
// Set a new ID for this reg request...
//-----------------------------------------
$regid = md5( uniqid(microtime()) );
if( $this->ipsclass->vars['bot_antispam'] == 'gd' )
{
//-----------------------------------------
// Get 6 random chars
//-----------------------------------------
$reg_code = strtoupper( substr( md5($regid), 0, 6 ) );
}
else
{
//-----------------------------------------
// Set a new 6 character numerical string
//-----------------------------------------
mt_srand ((double) microtime() * 1000000);
$reg_code = mt_rand(100000,999999);
}
//-----------------------------------------
// Insert into the DB
//-----------------------------------------
$this->ipsclass->DB->do_insert( 'reg_antispam', array (
'regid' => $regid,
'regcode' => $reg_code,
'ip_address' => $this->ipsclass->input['IP_ADDRESS'],
'ctime' => time(),
) );
}
$this->page_title = $this->ipsclass->lang['lost_pass_form'];
$this->nav = array( $this->ipsclass->lang['lost_pass_form'] );
if ($errors != "")
{
$this->output .= $this->ipsclass->compiled_templates['skin_register']->errors( $this->ipsclass->lang[$errors]);
}
$this->output .= $this->ipsclass->compiled_templates['skin_register']->lost_pass_form($regid);
if ($this->ipsclass->vars['bot_antispam'] == 'gd')
{
$this->output = str_replace( "<!--{REG.ANTISPAM}-->", $this->ipsclass->compiled_templates['skin_register']->bot_antispam_gd( $regid ), $this->output );
}
else if ($this->ipsclass->vars['bot_antispam'] == 'gif')
{
$this->output = str_replace( "<!--{REG.ANTISPAM}-->", $this->ipsclass->compiled_templates['skin_register']->bot_antispam( $regid ), $this->output );
}
}
/*-------------------------------------------------------------------------*/
// LOST PASSWORD: SEND
/*-------------------------------------------------------------------------*/
function lost_password_end()
{
if ($this->ipsclass->vars['bot_antispam'])
{
//-----------------------------------------
// Security code stuff
//-----------------------------------------
if ($this->ipsclass->input['regid'] == "")
{
$this->lost_password_start('err_reg_code');
return;
}
$this->ipsclass->DB->simple_construct( array( 'select' => '*',
'from' => 'reg_antispam',
'where' => "regid='".trim($this->ipsclass->txt_alphanumerical_clean($this->ipsclass->input['regid']))."'"
) );
$this->ipsclass->DB->simple_exec();
if ( ! $row = $this->ipsclass->DB->fetch_row() )
{
$this->show_reg_form('err_reg_code');
return;
}
if ( trim( $this->ipsclass->txt_alphanumerical_clean($this->ipsclass->input['reg_code']) ) != $row['regcode'] )
{
$this->lost_password_start('err_reg_code');
return;
}
}
//-----------------------------------------
// Back to the usual programming! :o
//-----------------------------------------
if ($_POST['member_name'] == "" AND $_POST['email_addy'] == "")
{
$this->ipsclass->Error( array( 'LEVEL' => 1, 'MSG' => 'no_username' ) );
}
//-----------------------------------------
// Check for input and it's in a valid format.
//-----------------------------------------
$member_name = trim(strtolower($this->ipsclass->input['member_name']));
$email_addy = trim(strtolower($this->ipsclass->input['email_addy']));
if ($member_name == "" AND $email_addy == "" )
{
$this->ipsclass->Error( array( 'LEVEL' => 1, 'MSG' => 'no_username' ) );
}
//-----------------------------------------
// Attempt to get the user details from the DB
//-----------------------------------------
if ( $this->ipsclass->vars['ipbli_usertype'] == 'username' )
{
if( $member_name )
{
$this->ipsclass->DB->simple_construct( array( 'select' => 'members_display_name, name, id, email, mgroup', 'from' => 'members', 'where' => "members_l_username='{$member_name}'" ) );
$this->ipsclass->DB->simple_exec();
}
else if( $email_addy )
{
$this->ipsclass->DB->simple_construct( array( 'select' => 'members_display_name, name, id, email, mgroup', 'from' => 'members', 'where' => "email='{$email_addy}'" ) );
$this->ipsclass->DB->simple_exec();
}
}
else
{
// We don't use the 'email_addy' input if usertype is email
$email_addy = "";
$this->ipsclass->DB->simple_construct( array( 'select' => 'members_display_name, name, id, email, mgroup', 'from' => 'members', 'where' => "email='{$member_name}'" ) );
$this->ipsclass->DB->simple_exec();
}
if ( ! $this->ipsclass->DB->get_num_rows() )
{
$this->ipsclass->Error( array( 'LEVEL' => 1, 'MSG' => 'no_such_user' ) );
}
else
{
$member = $this->ipsclass->DB->fetch_row();
//-----------------------------------------
// Is there a validation key? If so, we'd better not touch it
//-----------------------------------------
if ($member['id'] == "")
{
$this->ipsclass->Error( array( 'LEVEL' => 1, 'MSG' => 'no_such_user' ) );
}
$validate_key = md5( $this->ipsclass->make_password() . uniqid( mt_rand(), TRUE ) );
//-----------------------------------------
// Get rid of old entries for this member
//-----------------------------------------
$this->ipsclass->DB->do_delete( 'validating', "member_id={$member['id']} AND lost_pass=1" );
//-----------------------------------------
// Update the DB for this member.
//-----------------------------------------
$db_str = array(
'vid' => $validate_key,
'member_id' => $member['id'],
#'real_group' => $member['mgroup'],
'temp_group' => $member['mgroup'],
'entry_date' => time(),
'coppa_user' => 0,
'lost_pass' => 1,
'ip_address' => $this->ipsclass->input['IP_ADDRESS'],
);
// Are they already in the validating group?
if( $member['mgroup'] != $this->ipsclass->vars['auth_group'] )
{
$db_str['real_group'] = $member['mgroup'];
}
$this->ipsclass->DB->do_insert( 'validating', $db_str );
//-----------------------------------------
// Send out the email.
//-----------------------------------------
$this->email->get_template("lost_pass");
$this->email->build_message( array(
'NAME' => $member['members_display_name'],
'THE_LINK' => $this->base_url_nosess."?act=Reg&CODE=lostpassform&uid=".$member['id']."&aid=".$validate_key,
'MAN_LINK' => $this->base_url_nosess."?act=Reg&CODE=lostpassform",
'EMAIL' => $member['email'],
'ID' => $member['id'],
'CODE' => $validate_key,
'IP_ADDRESS' => $this->ipsclass->input['IP_ADDRESS'],
)
);
$this->email->subject = $this->ipsclass->lang['lp_subject'].' '.$this->ipsclass->vars['board_name'];
$this->email->to = $member['email'];
$this->email->send_mail();
$this->output = $this->ipsclass->compiled_templates['skin_register']->show_lostpasswait( $member );
}
$this->page_title = $this->ipsclass->lang['lost_pass_form'];
}
/*-------------------------------------------------------------------------*/
// show_reg_form
/*-------------------------------------------------------------------------*/
function show_reg_form($form_errors = array())
{
//-----------------------------------------
// INIT
//-----------------------------------------
$final_errors = array();
if ( $this->ipsclass->vars['no_reg'] == 1 )
{
$this->ipsclass->Error( array( 'LEVEL' => 1, 'MSG' => 'reg_off' ) );
}
$coppa = (isset($this->ipsclass->input['coppa_user']) AND $this->ipsclass->input['coppa_user'] == 1) ? 1 : 0;
$this->ipsclass->vars['username_errormsg'] = str_replace( '{chars}', $this->ipsclass->vars['username_characters'], $this->ipsclass->vars['username_errormsg'] );
//-----------------------------------------
// Read T&Cs yet?
//-----------------------------------------
if ( !isset($this->ipsclass->input['termsread']) OR !$this->ipsclass->input['termsread'] )
{
if ( $this->ipsclass->member['id'] )
{
//-----------------------------------------
// Log member out
//-----------------------------------------
require_once( ROOT_PATH.'sources/action_public/login.php' );
$login = new login();
$login->ipsclass =& $this->ipsclass;
$login->do_log_out( 0 );
}
//-----------------------------------------
// Continue
//-----------------------------------------
$cache = $this->ipsclass->DB->simple_exec_query( array( 'select' => '*', 'from' => 'conf_settings', 'where' => "conf_key='reg_rules'" ) );
$text = $cache['conf_value'] ? $cache['conf_value'] : $cache['conf_default'];
$this->page_title = $this->ipsclass->lang['registration_form'];
$this->nav = array( $this->ipsclass->lang['registration_form'] );
$this->output .= $this->ipsclass->compiled_templates['skin_register']->show_terms( $this->ipsclass->my_nl2br($text), $coppa );
return;
}
else
{
//-----------------------------------------
// Did we agree to the t&c?
//-----------------------------------------
if ( ! $this->ipsclass->input['agree_to_terms'] )
{
$this->ipsclass->Error( array( 'LEVEL' => 1, 'MSG' => 'reg_no_agree', 'EXTRA' => $this->ipsclass->base_url ) );
}
}
//-----------------------------------------
// Do we have another URL that one needs
// to visit to register?
//-----------------------------------------
$this->login_method = $this->ipsclass->DB->build_and_exec_query( array( 'select' => '*', 'from' => 'login_methods', 'where' => 'login_enabled=1' ) );
if ( $this->login_method['login_register_url'] )
{
$this->ipsclass->boink_it( $this->login_method['login_register_url'] );
exit();
}
//-----------------------------------------
// Continue...
//-----------------------------------------
if ( $this->ipsclass->vars['reg_auth_type'] )
{
if ( $this->ipsclass->vars['reg_auth_type'] == 'admin_user' OR $this->ipsclass->vars['reg_auth_type'] == 'user' )
{
$this->ipsclass->lang['std_text'] .= "<br />" . $this->ipsclass->lang['email_validate_text'];
}
//-----------------------------------------
// User then admin?
//-----------------------------------------
if ( $this->ipsclass->vars['reg_auth_type'] == 'admin_user' )
{
$this->ipsclass->lang['std_text'] .= "<br />" . $this->ipsclass->lang['user_admin_validation'];
}
if ( $this->ipsclass->vars['reg_auth_type'] == 'admin' )
{
$this->ipsclass->lang['std_text'] .= "<br />" . $this->ipsclass->lang['just_admin_validation'];
}
}
//-----------------------------------------
// Clean out anti-spam stuffy
//-----------------------------------------
if ($this->ipsclass->vars['bot_antispam'])
{
// Set a new ID for this reg request...
$regid = md5( uniqid(microtime()) );
if( $this->ipsclass->vars['bot_antispam'] == 'gd' )
{
//-----------------------------------------
// Get 6 random chars
//-----------------------------------------
$reg_code = strtoupper( substr( md5($regid), 0, 6 ) );
}
else
{
//-----------------------------------------
// Set a new 6 character numerical string
//-----------------------------------------
mt_srand ((double) microtime() * 1000000);
$reg_code = mt_rand(100000,999999);
}
// Insert into the DB
$this->ipsclass->DB->do_insert( 'reg_antispam', array (
'regid' => $regid,
'regcode' => $reg_code,
'ip_address' => $this->ipsclass->input['IP_ADDRESS'],
'ctime' => time(),
) );
}
//-----------------------------------------
// Custom profile fields stuff
//-----------------------------------------
$required_output = "";
$optional_output = "";
require_once( ROOT_PATH.'sources/classes/class_custom_fields.php' );
$fields = new custom_fields( $this->ipsclass->DB );
$fields->cache_data = $this->ipsclass->cache['profilefields'];
$fields->init_data();
$fields->parse_to_register();
foreach( $fields->out_fields as $id => $data )
{
$error = "";
if ( $fields->cache_data[ $id ]['pf_not_null'] == 1 )
{
$ftype = 'required_output';
}
else
{
$ftype = 'optional_output';
}
if( isset($form_errors['cfield_'.$id]) AND count( $form_errors['cfield_'.$id] ) )
{
$error = implode( "<br />", $form_errors['cfield_'.$id] );
}
if ( $fields->cache_data[ $id ]['pf_type'] == 'drop' )
{
$form_element = $this->ipsclass->compiled_templates['skin_register']->field_dropdown( 'field_'.$id, $data, $error );
}
else if ( $fields->cache_data[ $id ]['pf_type'] == 'area' )
{
$data = $this->ipsclass->input['field_'.$id] ? $this->ipsclass->input['field_'.$id] : $data;
$form_element = $this->ipsclass->compiled_templates['skin_register']->field_textarea( 'field_'.$id, $data, $error );
}
else
{
$data = isset($this->ipsclass->input['field_'.$id]) ? $this->ipsclass->input['field_'.$id] : $data;
$form_element = $this->ipsclass->compiled_templates['skin_register']->field_textinput( 'field_'.$id, $data, $error );
}
${$ftype} .= $this->ipsclass->compiled_templates['skin_register']->field_entry( $fields->field_names[ $id ], $fields->field_desc[ $id ], $form_element, $id, $error );
}
$this->page_title = $this->ipsclass->lang['registration_form'];
$this->nav = array( $this->ipsclass->lang['registration_form'] );
//-----------------------------------------
// ERROR CHECK
//-----------------------------------------
if ( isset($form_errors['general']) AND is_array( $form_errors['general'] ) AND count( $form_errors['general'] ) )
{
$this->output .= $this->ipsclass->compiled_templates['skin_register']->errors( implode( "<br />", $form_errors['general'] ) );
}
//-----------------------------------------
// Other errors
//-----------------------------------------
$final_errors = array( 'username' => NULL, 'dname' => NULL, 'password' => NULL, 'email' => NULL );
foreach( array( 'username', 'dname', 'password', 'email' ) as $thing )
{
if ( isset($form_errors[ $thing ]) AND is_array( $form_errors[ $thing ] ) AND count( $form_errors[ $thing ] ) )
{
$final_errors[ $thing ] = implode( "<br />", $form_errors[ $thing ] );
}
}
$this->ipsclass->input['UserName'] = isset($this->ipsclass->input['UserName']) ? $this->ipsclass->input['UserName'] : '';
$this->ipsclass->input['PassWord'] = isset($this->ipsclass->input['PassWord']) ? $this->ipsclass->input['PassWord'] : '';
$this->ipsclass->input['EmailAddress'] = isset($this->ipsclass->input['EmailAddress']) ? $this->ipsclass->input['EmailAddress'] : '';
$this->ipsclass->input['EmailAddress_two'] = isset($this->ipsclass->input['EmailAddress_two']) ? $this->ipsclass->input['EmailAddress_two'] : '';
$this->ipsclass->input['PassWord_Check'] = isset($this->ipsclass->input['PassWord_Check']) ? $this->ipsclass->input['PassWord_Check'] : '';
$this->ipsclass->input['members_display_name'] = isset($this->ipsclass->input['members_display_name']) ? $this->ipsclass->input['members_display_name'] : '';
$this->ipsclass->input['time_offset'] = isset($this->ipsclass->input['time_offset']) ? $this->ipsclass->input['time_offset'] : '';
$this->ipsclass->input['allow_member_mail'] = isset($this->ipsclass->input['allow_member_mail']) ? $this->ipsclass->input['allow_member_mail'] : '';
$this->ipsclass->input['dst'] = isset($this->ipsclass->input['dst']) ? $this->ipsclass->input['dst'] : '';
$this->output .= $this->ipsclass->compiled_templates['skin_register']->ShowForm( array( 'TEXT' => $this->ipsclass->lang['std_text'], 'coppa_user' => $coppa ), $final_errors );
//-----------------------------------------
// Replace elements
//-----------------------------------------
if ($this->ipsclass->vars['bot_antispam'] == 'gd')
{
$this->output = str_replace( "<!--{REG.ANTISPAM}-->", $this->ipsclass->compiled_templates['skin_register']->bot_antispam_gd( $regid ), $this->output );
}
else if ($this->ipsclass->vars['bot_antispam'] == 'gif')
{
$this->output = str_replace( "<!--{REG.ANTISPAM}-->", $this->ipsclass->compiled_templates['skin_register']->bot_antispam( $regid ), $this->output );
}
if ($required_output != "")
{
$this->output = str_replace( "<!--{REQUIRED.FIELDS}-->", "\n".$required_output, $this->output );
}
if ($optional_output != "")
{
$this->output = str_replace( "<!--{OPTIONAL.FIELDS}-->", $this->ipsclass->compiled_templates['skin_register']->optional_title()."\n".$optional_output, $this->output );
}
//-----------------------------------------
// Time zone...
//-----------------------------------------
$this->ipsclass->load_language('lang_ucp');
$offset = ( $this->ipsclass->input['time_offset'] != "" ) ? $this->ipsclass->input['time_offset'] : $this->ipsclass->vars['time_offset'];
$time_select = "<select name='time_offset' class='forminput'>";
foreach( $this->ipsclass->lang as $off => $words )
{
if (preg_match("/^time_([\d\.\-]+)$/", $off, $match))
{
$time_select .= $match[1] == $offset ? "<option value='{$match[1]}' selected='selected'>$words</option>"
: "<option value='{$match[1]}'>$words</option>";
}
}
$time_select .= "</select>";
$this->output = str_replace( "<!--{TIME_ZONE}-->", "\n".$time_select, $this->output );
//-----------------------------------------
// Boxes checked?
//-----------------------------------------
$admin_checked = 'checked="checked"';
if ( $this->ipsclass->input['CODE'] == '02' )
{
//-----------------------------------------
// Form submitted...
//-----------------------------------------
if ( ! $this->ipsclass->input['allow_admin_mail'] )
{
$admin_checked = '';
}
}
$member_checked = $this->ipsclass->input['allow_member_mail'] ? 'checked="checked"' : '';
$dst_checked = $this->ipsclass->input['dst'] ? 'checked="checked"' : '';
$this->output = str_replace( "<!--[admin.checked]-->" , $admin_checked , $this->output );
$this->output = str_replace( "<!--[member.checked]-->", $member_checked, $this->output );
$this->output = str_replace( "<!--[dst.checked]-->" , $dst_checked , $this->output );
//-----------------------------------------
// Subscribe on register?
//-----------------------------------------
$all_currency = array();
$def_currency = "";
$subs = array();
$subs_output = "";
$desc_output = "";
if ( $this->ipsclass->vars['subsm_show_reg'] )
{
$this->ipsclass->load_language('lang_subscriptions');
//-----------------------------------------
// Get currency buns!
// Ok, we did that joke in another module and it
// wasn't funny then
//-----------------------------------------
$this->ipsclass->DB->simple_construct( array( 'select' => '*', 'from' => 'subscription_currency' ) );
$this->ipsclass->DB->simple_exec();
while ( $c = $this->ipsclass->DB->fetch_row() )
{
$all_currency[ $c['subcurrency_code'] ] = $c;
if ( $c['subcurrency_default'] )
{
$def_currency = $c;
}
}
//-----------------------------------------
// Get subscription packages
//-----------------------------------------
$sub_output = $this->ipsclass->compiled_templates['skin_register']->subsm_start( $def_currency['subcurrency_code'] );
//-----------------------------------------
// Enforcing?
//-----------------------------------------
if ( ! $this->ipsclass->vars['subsm_enforce'] )
{
$sub_output .= $this->ipsclass->compiled_templates['skin_register']->subsm_row( '0', $this->ipsclass->lang['subsm_none'], '0.00', $this->ipsclass->lang['subsm_na'] );
}
$this->ipsclass->DB->simple_construct( array( 'select' => '*', 'from' => 'subscriptions', 'order' => 'sub_cost' ) );
$this->ipsclass->DB->simple_exec();
while ( $row = $this->ipsclass->DB->fetch_row() )
{
$duration = $row['sub_length'];
if ( $duration > 1 )
{
$duration .= ' '.$this->ipsclass->lang[ 'timep_'.$row['sub_unit'] ];
}
else
{
$duration .= ' '.$this->ipsclass->lang[ 'time_'.$row['sub_unit'] ];
}
$duration = ($row['sub_unit'] == 'x') ? $this->ipsclass->lang['no_expire'] : $duration;
$sub_output .= $this->ipsclass->compiled_templates['skin_register']->subsm_row( $row['sub_id'],
$row['sub_title'],
sprintf( "%.2f", $row['sub_cost'] * $def_currency['subcurrency_exchange'] ),
$duration
);
$desc_output .= "\n subdesc[{$row['sub_id']}] = '".str_replace( "'", "\\'", str_replace( "\n", '\n',$row['sub_desc'] ) )."';";
}
$sub_output .= $this->ipsclass->compiled_templates['skin_register']->subsm_end();
//-----------------------------------------
// Parse 'n show
//-----------------------------------------
if ( $sub_output )
{
$this->output = str_replace( '<!--{SUBS.MANAGER}-->', $sub_output , $this->output );
$this->output = str_replace( '<!--{SUBS.JSCRIPT}-->', str_replace( "\r", "", $desc_output ), $this->output );
}
}
if ( USE_MODULES == 1 )
{
$this->modules->register_class($this);
$this->modules->on_register_form();
}
}
/*-------------------------------------------------------------------------*/
// create_account
/*-------------------------------------------------------------------------*/
function create_account()
{
//-----------------------------------------
// INIT
//-----------------------------------------
if( $this->ipsclass->vars['ipbli_usertype'] == 'email' )
{
$this->ipsclass->input['UserName'] = $this->ipsclass->input['members_display_name'];
}
$form_errors = array();
$coppa = ($this->ipsclass->input['coppa_user'] == 1) ? 1 : 0;
$in_username = str_replace( '|', '&#124;' , $this->ipsclass->input['UserName'] );
$in_password = trim($this->ipsclass->input['PassWord']);
$in_email = strtolower( trim($this->ipsclass->input['EmailAddress']) );
$banfilters = array();
$members_display_name = trim( $this->ipsclass->input['members_display_name'] );
//-----------------------------------------
// Load ban filters
//-----------------------------------------
$this->ipsclass->DB->simple_construct( array( 'select' => '*', 'from' => 'banfilters' ) );
$this->ipsclass->DB->simple_exec();
while( $r = $this->ipsclass->DB->fetch_row() )
{
$banfilters[ $r['ban_type'] ][] = $r['ban_content'];
}
//-----------------------------------------
// Check
//-----------------------------------------
if ($_POST['act'] == "")
{
$this->ipsclass->Error( array( 'LEVEL' => 1, 'MSG' => 'complete_form' ) );
}
if ($this->ipsclass->vars['no_reg'] == 1)
{
$this->ipsclass->Error( array( 'LEVEL' => 1, 'MSG' => 'reg_off' ) );
}
//-----------------------------------------
// Custom profile field stuff
//-----------------------------------------
require_once( ROOT_PATH.'sources/classes/class_custom_fields.php' );
$fields = new custom_fields( $this->ipsclass->DB );
$fields->cache_data = $this->ipsclass->cache['profilefields'];
$fields->init_data();
$fields->parse_to_save( 1 );
//-----------------------------------------
// Check...
//-----------------------------------------
if ( count( $fields->error_fields['empty'] ) )
{
foreach( $fields->error_fields['empty'] as $cfield )
{
$form_errors['cfield_'.$cfield['pf_id']][] = $this->ipsclass->lang['err_complete_form'];
}
}
if ( count( $fields->error_fields['invalid'] ) )
{
foreach( $fields->error_fields['invalid'] as $cfield )
{
$form_errors['cfield_'.$cfield['pf_id']][] = $this->ipsclass->lang['err_invalid'];
}
}
if ( count( $fields->error_fields['toobig'] ) )
{
foreach( $fields->error_fields['toobig'] as $cfield )
{
$form_errors['cfield_'.$cfield['pf_id']][] = $this->ipsclass->lang['err_cf_to_long'];
}
}
//-----------------------------------------
// Remove multiple spaces in the username
//-----------------------------------------
$in_username = preg_replace( "/\s{2,}/", " ", $in_username );
//-----------------------------------------
// Remove 'sneaky' spaces
//-----------------------------------------
if ( $this->ipsclass->vars['strip_space_chr'] )
{
// use hexdec to convert between '0xAD' and chr
$in_username = str_replace( chr(160), ' ', $in_username );
$in_username = str_replace( chr(173), ' ', $in_username );
$members_display_name = str_replace( chr(160), ' ', $members_display_name );
$members_display_name = str_replace( chr(173), ' ', $members_display_name );
if ( $this->ipsclass->vars['gb_char_set'] == 'iso-8859-1' )
{
$in_username = str_replace( chr(240), ' ', $in_username );
$members_display_name = str_replace( chr(240), ' ', $members_display_name );
}
}
//-----------------------------------------
// Trim up..
//-----------------------------------------
$in_username = trim($in_username);
//-----------------------------------------
// Test unicode name too
//-----------------------------------------
$unicode_name = preg_replace_callback('/&#([0-9]+);/si', create_function( '$matches', 'return chr($matches[1]);' ), $in_username);
$unicode_name = str_replace( "'" , '&#39;', $unicode_name );
$unicode_name = str_replace( "\\", '&#92;', $unicode_name );
$unicode_dname = preg_replace_callback('/&#([0-9]+);/si', create_function( '$matches', 'return chr($matches[1]);' ), $members_display_name);
$unicode_dname = str_replace( "'" , '&#39;', $unicode_dname );
$unicode_dname = str_replace( "\\", '&#92;', $unicode_dname );
//-----------------------------------------
// Check the email address
//-----------------------------------------
$in_email = $this->ipsclass->clean_email($in_email);
if ( ! $in_email OR strlen($in_email) < 6 )
{
$form_errors['email'][] = $this->ipsclass->lang['err_invalid_email'];
}
//-----------------------------------------
// Test email address
//-----------------------------------------
$this->ipsclass->input['EmailAddress_two'] = strtolower( trim($this->ipsclass->input['EmailAddress_two']) );
$this->ipsclass->input['EmailAddress'] = strtolower( trim($this->ipsclass->input['EmailAddress']) );
if( preg_match( "#[\;\#\n\r\*\'\"<>&\%\!\(\)\{\}\[\]\?\\/\s]#", $this->ipsclass->input['EmailAddress_two']) )
{
$form_errors['email'][] = $this->ipsclass->lang['reg_error_email_invalid'];
}
else
{
if ( $in_email AND $this->ipsclass->input['EmailAddress_two'] != $in_email)
{
$form_errors['email'][] = $this->ipsclass->lang['reg_error_email_nm'];
}
}
//-----------------------------------------
// More unicode..
//-----------------------------------------
$len_u = preg_replace("/&#([0-9]+);/", "-", $in_username );
$len_p = preg_replace("/&#([0-9]+);/", "-", $in_password );
$len_d = preg_replace("/&#([0-9]+);/", "-", $members_display_name );
//-----------------------------------------
// Test dname
//-----------------------------------------
if ( $this->ipsclass->vars['auth_allow_dnames'] )
{
if ( ! $members_display_name OR strlen($len_d) < 3 OR strlen($len_d) > $this->ipsclass->vars['max_user_name_length'] )
{
$form_errors['dname'][] = $this->ipsclass->lang['reg_error_no_name'];
}
}
if( $this->ipsclass->vars['username_characters'] )
{
$check_against = preg_quote( $this->ipsclass->vars['username_characters'], "/" );
if( !preg_match( "/^[".$check_against."]+$/i", $_POST['UserName'] ) && $this->ipsclass->vars['ipbli_usertype'] == 'username' )
{
$form_errors['username'][] = str_replace( '{chars}', $this->ipsclass->vars['username_characters'], $this->ipsclass->vars['username_errormsg'] );
}
if( !preg_match( "/^[".$check_against."]+$/i", $_POST['members_display_name'] ) && $this->ipsclass->vars['auth_allow_dnames'] )
{
$form_errors['dname'][] = str_replace( '{chars}', $this->ipsclass->vars['username_characters'], $this->ipsclass->vars['username_errormsg'] );
}
}
//-----------------------------------------
// Check for errors in the input.
//-----------------------------------------
if ( ! $in_username OR strlen($len_u) < 3 OR strlen($len_u) > $this->ipsclass->vars['max_user_name_length'] )
{
$form_errors['username'][] = $this->ipsclass->lang['reg_error_username_none'];
}
if (! $in_password OR strlen($len_p) < 3 OR strlen($len_p) > $this->ipsclass->vars['max_user_name_length'] )
{
$form_errors['password'][] = $this->ipsclass->lang['reg_error_no_pass'];
}
if ($this->ipsclass->input['PassWord_Check'] != $in_password)
{
$form_errors['password'][] = $this->ipsclass->lang['reg_error_pass_nm'];
}
//-----------------------------------------
// CHECK 1: Any errors (missing fields, etc)?
//-----------------------------------------
if ( count( $form_errors ) )
{
$this->show_reg_form( $form_errors );
return;
}
//-----------------------------------------
// USERNAME: Is this name already taken?
//-----------------------------------------
$this->ipsclass->DB->cache_add_query( 'login_getmember', array( 'username' => strtolower($in_username) ) );
$this->ipsclass->DB->cache_exec_query();
$name_check = $this->ipsclass->DB->fetch_row();
if ( $name_check['id'] )
{
$form_errors['username'][] = $this->ipsclass->lang['reg_error_username_taken'];
}
//-----------------------------------------
// USERNAME: Is this name already taken (display)?
//-----------------------------------------
if ( $this->ipsclass->vars['auth_allow_dnames'] )
{
if ( $this->ipsclass->vars['auth_dnames_nologinname'] )
{
$this->ipsclass->DB->build_query( array( 'select' => "members_display_name, id",
'from' => 'members',
'where' => "members_l_display_name='".strtolower($in_username)."'",
'limit' => array( 0,1 ) ) );
$this->ipsclass->DB->exec_query();
if ( $this->ipsclass->DB->get_num_rows() )
{
$form_errors['username'][] = $this->ipsclass->lang['reg_error_username_taken'];
}
}
}
//-----------------------------------------
// USERNAME: Special chars?
//-----------------------------------------
if ( $unicode_name != $in_username )
{
$this->ipsclass->DB->cache_add_query( 'login_getmember', array( 'username' => $this->ipsclass->DB->add_slashes(strtolower($unicode_name) ) ));
$this->ipsclass->DB->cache_exec_query();
$name_check = $this->ipsclass->DB->fetch_row();
if ($name_check['id'])
{
$form_errors['username'][] = $this->ipsclass->lang['reg_error_username_taken'];
}
}
//-----------------------------------------
// USERNAME: GUEST
//-----------------------------------------
if (strtolower($in_username) == 'guest')
{
$form_errors['username'][] = $this->ipsclass->lang['reg_error_username_taken'];
}
//-----------------------------------------
// USERNAME: Banned?
//-----------------------------------------
if ( is_array( $banfilters['name'] ) and count( $banfilters['name'] ) )
{
foreach ( $banfilters['name'] as $n )
{
$n = preg_replace( "/\*/", '.*' , preg_quote($n, "/") );
if ( $n AND preg_match( "/^{$n}$/i", $in_username ) )
{
$form_errors['username'][] = $this->ipsclass->lang['reg_error_username_taken'];
break;
}
}
}
//-----------------------------------------
// DNAME
//-----------------------------------------
if ( $this->ipsclass->vars['auth_allow_dnames'] )
{
//-----------------------------------------
// Illegal characters
//-----------------------------------------
if ( preg_match( "#[\[\];,\|]#", str_replace('&#39;', "'", str_replace('&amp;', '&', $unicode_dname) ) ) )
{
$form_errors['dname'][] = $this->ipsclass->lang['reg_error_chars'];
}
//-----------------------------------------
// DNAME: Is this name already taken?
//-----------------------------------------
$this->ipsclass->DB->cache_add_query( 'general_get_by_display_name', array( 'members_display_name' => strtolower($members_display_name) ) );
$this->ipsclass->DB->cache_exec_query();
$name_check = $this->ipsclass->DB->fetch_row();
if ( $name_check['id'] )
{
$form_errors['dname'][] = $this->ipsclass->lang['reg_error_taken'];
}
//-----------------------------------------
// DNAME: Check for existing LOG IN name.
//-----------------------------------------
if ( $this->ipsclass->vars['auth_dnames_nologinname'] )
{
$this->ipsclass->DB->build_query( array( 'select' => "members_display_name, id",
'from' => 'members',
'where' => "members_l_username='".strtolower($members_display_name)."'",
'limit' => array( 0,1 ) ) );
$this->ipsclass->DB->exec_query();
if ( $this->ipsclass->DB->get_num_rows() )
{
$form_errors['dname'][] = $this->ipsclass->lang['reg_error_taken'];
}
}
//-----------------------------------------
// DNAME: Special chars?
//-----------------------------------------
if ( $unicode_dname != $members_display_name )
{
$this->ipsclass->DB->cache_add_query( 'general_get_by_display_name', array( 'members_display_name' => $this->ipsclass->DB->add_slashes(strtolower($unicode_dname) ) ));
$this->ipsclass->DB->cache_exec_query();
$name_check = $this->ipsclass->DB->fetch_row();
if ( $name_check['id'] )
{
$form_errors['dname'][] = $this->ipsclass->lang['reg_error_taken'];
}
}
//-----------------------------------------
// DNAME: Banned?
//-----------------------------------------
if ( is_array( $banfilters['name'] ) and count( $banfilters['name'] ) )
{
foreach ( $banfilters['name'] as $n )
{
$n = preg_replace( "/\*/", '.*' , preg_quote($n, "/") );
if ( $n AND preg_match( "/^{$n}$/i", $members_display_name ) )
{
$form_errors['dname'][] = $this->ipsclass->lang['reg_error_taken'];
break;
}
}
}
//-----------------------------------------
// DNAME: GUEST
//-----------------------------------------
if (strtolower($members_display_name) == 'guest')
{
$form_errors['dname'][] = $this->ipsclass->lang['reg_error_taken'];
}
}
//-----------------------------------------
// Is this email addy taken? CONVERGE THIS??
//-----------------------------------------
if ( $this->ipsclass->converge->converge_check_for_member_by_email( $in_email ) == TRUE )
{
$form_errors['email'][] = $this->ipsclass->lang['reg_error_email_taken'];
}
//-----------------------------------------
// Are they banned [IP]?
//-----------------------------------------
if ( is_array( $banfilters['ip'] ) and count( $banfilters['ip'] ) )
{
foreach ($banfilters['ip'] as $ip)
{
$ip = str_replace( '\*', '.*', preg_quote($ip, "/") );
if ( preg_match( "/^{$ip}/", $this->ipsclass->input['IP_ADDRESS'] ) )
{
$this->ipsclass->Error( array( 'LEVEL' => 1, 'MSG' => 'you_are_banned', 'INIT' => 1 ) );
}
}
}
//-----------------------------------------
// Are they banned [EMAIL]?
//-----------------------------------------
if ( is_array( $banfilters['email'] ) and count( $banfilters['email'] ) )
{
foreach ( $banfilters['email'] as $email )
{
$email = str_replace( "\*", '.*' , preg_quote($email, "/") );
if ( preg_match( "/^{$email}$/i", $in_email ) )
{
$form_errors['email'][] = $this->ipsclass->lang['reg_error_email_ban'];
break;
}
}
}
//-----------------------------------------
// Check the reg_code
//-----------------------------------------
if ($this->ipsclass->vars['bot_antispam'])
{
if ( $this->ipsclass->input['regid'] == "" )
{
$form_errors['general'][] = $this->ipsclass->lang['err_reg_code'];
}
$this->ipsclass->DB->build_query( array( 'select' => '*',
'from' => 'reg_antispam',
'where' => "regid='".trim($this->ipsclass->txt_alphanumerical_clean($this->ipsclass->input['regid']))."'"
) );
$this->ipsclass->DB->exec_query();
if ( ! $row = $this->ipsclass->DB->fetch_row() )
{
$form_errors['general'][] = $this->ipsclass->lang['err_reg_code'];
}
if ( trim( $this->ipsclass->txt_alphanumerical_clean($this->ipsclass->input['reg_code']) ) != $row['regcode'] )
{
$form_errors['general'][] = $this->ipsclass->lang['err_reg_code'];
}
$this->ipsclass->DB->do_delete( 'reg_antispam', "regid='".trim($this->ipsclass->txt_alphanumerical_clean($this->ipsclass->input['regid']))."'" );
}
//-----------------------------------------
// CHECK 2: Any errors (duplicate names, etc)?
//-----------------------------------------
if ( count( $form_errors ) )
{
$this->show_reg_form( $form_errors );
return;
}
//-----------------------------------------
// Build up the hashes
//-----------------------------------------
$mem_group = $this->ipsclass->vars['member_group'];
//-----------------------------------------
// Are we asking the member or admin to preview?
//-----------------------------------------
if ( $this->ipsclass->vars['reg_auth_type'] )
{
$mem_group = $this->ipsclass->vars['auth_group'];
}
else if ($coppa == 1)
{
$mem_group = $this->ipsclass->vars['auth_group'];
}
else if ( $this->ipsclass->vars['subsm_enforce'] )
{
$mem_group = $this->ipsclass->vars['subsm_nopkg_group'];
}
$member = array(
'name' => $in_username,
'members_l_username' => strtolower( $in_username ),
'members_display_name' => $this->ipsclass->vars['auth_allow_dnames'] ? $members_display_name : $in_username,
'members_l_display_name' => strtolower( $this->ipsclass->vars['auth_allow_dnames'] ? $members_display_name : $in_username ),
'member_login_key' => $this->ipsclass->converge->generate_auto_log_in_key(),
'email' => $in_email,
'mgroup' => $mem_group,
'posts' => 0,
'joined' => time(),
'ip_address' => $this->ipsclass->input['IP_ADDRESS'],
'time_offset' => $this->ipsclass->input['time_offset'],
'view_sigs' => 1,
'email_pm' => 1,
'view_img' => 1,
'view_avs' => 1,
'restrict_post' => 0,
'view_pop' => 1,
'msg_total' => 0,
'new_msg' => 0,
'coppa_user' => $coppa,
'language' => $this->ipsclass->vars['default_language'],
'members_auto_dst' => 1,
'members_editor_choice' => $this->ipsclass->vars['ips_default_editor'],
'allow_admin_mails' => intval( $this->ipsclass->input['allow_admin_mail'] ),
'hide_email' => $this->ipsclass->input['allow_member_mail'] ? 0 : 1,
'subs_pkg_chosen' => intval( $this->ipsclass->input['subspackage'] )
);
//-----------------------------------------
// Insert: CONVERGE
//-----------------------------------------
$salt = $this->ipsclass->converge->generate_password_salt(5);
$passhash = $this->ipsclass->converge->generate_compiled_passhash( $salt, md5($in_password) );
$converge = array( 'converge_email' => $in_email,
'converge_joined' => time(),
'converge_pass_hash' => $passhash,
'converge_pass_salt' => str_replace( '\\', "\\\\", $salt )
);
$this->ipsclass->DB->do_insert( 'members_converge', $converge );
//-----------------------------------------
// Get converges auto_increment user_id
//-----------------------------------------
$member_id = $this->ipsclass->DB->get_insert_id();
$member['id'] = $member_id;
//-----------------------------------------
// Insert: MEMBERS
//-----------------------------------------
$this->ipsclass->DB->force_data_type = array( 'name' => 'string', 'members_display_name' => 'string' );
$this->ipsclass->DB->do_insert( 'members', $member );
//-----------------------------------------
// Insert: MEMBER EXTRA
//-----------------------------------------
$this->ipsclass->DB->do_insert( 'member_extra', array( 'id' => $member_id,
'vdirs' => 'in:Âõîäÿùèå|sent:Îòïðàâëåííûå',
'interests' => '',
'signature' => '' ) );
//-----------------------------------------
// Insert into the custom profile fields DB
//-----------------------------------------
// Ensure deleted members profile fields are removed.
$this->ipsclass->DB->do_delete( 'pfields_content', 'member_id='.$member['id'] );
$fields->out_fields['member_id'] = $member['id'];
$this->ipsclass->DB->do_insert( 'pfields_content', $fields->out_fields );
//-----------------------------------------
// Use modules?
//-----------------------------------------
if ( USE_MODULES == 1 )
{
$this->modules->register_class($this);
$member['password'] = trim($this->ipsclass->input['PassWord']);
$this->modules->on_create_account($member);
if ( $this->modules->error == 1 )
{
return;
}
$member['password'] = "";
}
//-----------------------------------------
// Validation key
//-----------------------------------------
$validate_key = md5( $this->ipsclass->make_password() . time() );
$time = time();
if ($coppa != 1)
{
if ( ($this->ipsclass->vars['reg_auth_type'] == 'user' ) or
($this->ipsclass->vars['reg_auth_type'] == 'admin') or
($this->ipsclass->vars['reg_auth_type'] == 'admin_user') )
{
//-----------------------------------------
// We want to validate all reg's via email,
// after email verificiation has taken place,
// we restore their previous group and remove the validate_key
//-----------------------------------------
$this->ipsclass->DB->do_insert( 'validating', array (
'vid' => $validate_key,
'member_id' => $member['id'],
'real_group' => $this->ipsclass->vars['subsm_enforce'] ? $this->ipsclass->vars['subsm_nopkg_group'] : $this->ipsclass->vars['member_group'],
'temp_group' => $this->ipsclass->vars['auth_group'],
'entry_date' => $time,
'coppa_user' => $coppa,
'new_reg' => 1,
'ip_address' => $member['ip_address']
) );
if ( $this->ipsclass->vars['reg_auth_type'] == 'user' OR $this->ipsclass->vars['reg_auth_type'] == 'admin_user' )
{
$this->email->get_template("reg_validate");
$this->email->build_message( array(
'THE_LINK' => $this->base_url_nosess."?act=Reg&CODE=03&uid=".urlencode($member_id)."&aid=".urlencode($validate_key),
'NAME' => $member['members_display_name'],
'MAN_LINK' => $this->base_url_nosess."?act=Reg&CODE=05",
'EMAIL' => $member['email'],
'ID' => $member_id,
'CODE' => $validate_key,
)
);
$this->email->subject = $this->ipsclass->lang['new_registration_email'].$this->ipsclass->vars['board_name'];
$this->email->to = $member['email'];
$this->email->send_mail();
$this->output = $this->ipsclass->compiled_templates['skin_register']->show_authorise( $member );
}
else if ( $this->ipsclass->vars['reg_auth_type'] == 'admin' )
{
$this->output = $this->ipsclass->compiled_templates['skin_register']->show_preview( $member );
}
if ($this->ipsclass->vars['new_reg_notify'])
{
$date = $this->ipsclass->get_date( time(), 'LONG', 1 );
$this->email->get_template("admin_newuser");
$this->email->build_message( array(
'DATE' => $date,
'MEMBER_NAME' => $member['members_display_name'],
)
);
$this->email->subject = $this->ipsclass->lang['new_registration_email1'].$this->ipsclass->vars['board_name'];
$this->email->to = $this->ipsclass->vars['email_in'];
$this->email->send_mail();
}
$this->page_title = $this->ipsclass->lang['reg_success'];
$this->nav = array( $this->ipsclass->lang['nav_reg'] );
}
else
{
//-----------------------------------------
// We don't want to preview, or get them to validate via email.
//-----------------------------------------
$this->ipsclass->cache['stats']['last_mem_name'] = $member['members_display_name'];
$this->ipsclass->cache['stats']['last_mem_id'] = $member['id'];
$this->ipsclass->cache['stats']['mem_count'] += 1;
$this->ipsclass->update_cache( array( 'name' => 'stats', 'array' => 1, 'deletefirst' => 0 ) );
if ($this->ipsclass->vars['new_reg_notify'])
{
$date = $this->ipsclass->get_date( time(), 'LONG', 1 );
$this->email->get_template("admin_newuser");
$this->email->build_message( array(
'DATE' => $date,
'MEMBER_NAME' => $member['members_display_name'],
)
);
$this->email->subject = $this->ipsclass->lang['new_registration_email1'].$this->ipsclass->vars['board_name'];
$this->email->to = $this->ipsclass->vars['email_in'];
$this->email->send_mail();
}
$this->ipsclass->my_setcookie("member_id" , $member['id'] , 1);
$this->ipsclass->my_setcookie("pass_hash" , $member['member_login_key'], 1);
$this->ipsclass->boink_it($this->ipsclass->base_url.'&act=login&CODE=autologin&fromreg=1');
}
}
else
{
// This is a COPPA user, so lets tell them they registered OK and redirect to the form.
$this->ipsclass->DB->do_insert( 'validating', array (
'vid' => $validate_key,
'member_id' => $member['id'],
'real_group' => $this->ipsclass->vars['member_group'],
'temp_group' => $this->ipsclass->vars['auth_group'],
'entry_date' => $time,
'coppa_user' => $coppa,
'new_reg' => 1,
'ip_address' => $member['ip_address']
) );
$this->ipsclass->print->redirect_screen( $this->ipsclass->lang['cp_success'], 'act=Reg&amp;CODE=12' );
}
}
/*-------------------------------------------------------------------------*/
// validate_user
/*-------------------------------------------------------------------------*/
function validate_user()
{
//-----------------------------------------
// Check for input and it's in a valid format.
//-----------------------------------------
$in_user_id = intval(trim(urldecode($this->ipsclass->input['uid'])));
$in_validate_key = trim(urldecode($this->ipsclass->input['aid']));
$in_type = trim($this->ipsclass->input['type']);
if ($in_type == "")
{
$in_type = 'reg';
}
//-----------------------------------------
// check input
//-----------------------------------------
if (! preg_match( "/^(?:[\d\w]){32}$/", $in_validate_key ) )
{
$this->ipsclass->Error( array( 'LEVEL' => 1, 'MSG' => 'data_incorrect' ) );
}
if (! preg_match( "/^(?:\d){1,}$/", $in_user_id ) )
{
$this->ipsclass->Error( array( 'LEVEL' => 1, 'MSG' => 'data_incorrect' ) );
}
//-----------------------------------------
// Attempt to get the profile of the requesting user
//-----------------------------------------
$member = $this->ipsclass->DB->simple_exec_query( array( 'select' => '*', 'from' => 'members', 'where' => 'id='.$in_user_id ) );
if ( ! $member['id'] )
{
$this->ipsclass->Error( array( 'LEVEL' => 1, 'MSG' => 'auth_no_mem' ) );
}
//-----------------------------------------
// Get validating info..
//-----------------------------------------
if ( $in_type == 'lostpass' )
{
$validate = $this->ipsclass->DB->simple_exec_query( array( 'select' => '*', 'from' => 'validating', 'where' => 'member_id='.$in_user_id.' and lost_pass=1' ) );
}
else if ( $in_type == 'newemail' )
{
$validate = $this->ipsclass->DB->simple_exec_query( array( 'select' => '*', 'from' => 'validating', 'where' => 'member_id='.$in_user_id.' and email_chg=1' ) );
}
else
{
$validate = $this->ipsclass->DB->simple_exec_query( array( 'select' => '*', 'from' => 'validating', 'where' => 'member_id='.$in_user_id ) );
}
if ( ! $validate['member_id'] )
{
$this->ipsclass->Error( array( 'LEVEL' => 1, 'MSG' => 'auth_no_key' ) );
}
if ( ($validate['new_reg'] == 1) && ($this->ipsclass->vars['reg_auth_type'] == "admin" ) )
{
$this->ipsclass->Error( array( 'LEVEL' => 1, 'MSG' => 'auth_no_key_not_allow' ) );
}
if ($validate['vid'] != $in_validate_key)
{
$this->ipsclass->Error( array( 'LEVEL' => 1, 'MSG' => 'auth_key_wrong' ) );
}
else
{
//-----------------------------------------
// REGISTER VALIDATE
//-----------------------------------------
if ($in_type == 'reg')
{
if ( $validate['new_reg'] != 1 )
{
$this->ipsclass->Error( array( 'LEVEL' => 1, 'MSG' => 'auth_no_key' ) );
}
if ( empty($validate['real_group']) )
{
$validate['real_group'] = $this->ipsclass->vars['member_group'];
}
//-----------------------------------------
// SELF-VERIFICATION...
//-----------------------------------------
if ( $this->ipsclass->vars['reg_auth_type'] != 'admin_user' )
{
$this->ipsclass->DB->do_update( 'members', array( 'mgroup' => intval($validate['real_group']) ), 'id='.intval($member['id']) );
if ( USE_MODULES == 1 )
{
$this->modules->register_class($this);
$this->modules->on_group_change( $member['id'], $validate['real_group'] );
}
//-----------------------------------------
// Update the stats...
//-----------------------------------------
$this->ipsclass->cache['stats']['last_mem_name'] = $member['members_display_name'];
$this->ipsclass->cache['stats']['last_mem_id'] = $member['id'];
$this->ipsclass->cache['stats']['mem_count'] += 1;
$this->ipsclass->update_cache( array( 'name' => 'stats', 'array' => 1, 'deletefirst' => 0 ) );
$this->ipsclass->my_setcookie("member_id" , $member['id'] , 1);
$this->ipsclass->my_setcookie("pass_hash" , $member['member_login_key'], 1);
//-----------------------------------------
// Remove "dead" validation
//-----------------------------------------
$this->ipsclass->DB->do_delete( 'validating', "vid='".$validate['vid']."' OR (member_id={$member['id']} AND new_reg=1)" );
$this->ipsclass->boink_it($this->ipsclass->base_url.'&act=login&CODE=autologin&fromreg=1');
}
//-----------------------------------------
// ADMIN-VERIFICATION...
//-----------------------------------------
else
{
//-----------------------------------------
// Update DB row...
//-----------------------------------------
$this->ipsclass->DB->do_update( 'validating', array( 'user_verified' => 1 ), "vid='".$validate['vid']."'" );
//-----------------------------------------
// Print message
//-----------------------------------------
$this->output = $this->ipsclass->compiled_templates['skin_register']->show_preview( $member );
}
}
//-----------------------------------------
// LOST PASS VALIDATE
//-----------------------------------------
else if ($in_type == 'lostpass')
{
//-----------------------------------------
// On the same page?
//-----------------------------------------
if ($validate['lost_pass'] != 1)
{
$this->ipsclass->Error( array( 'LEVEL' => 1, 'MSG' => 'lp_no_pass' ) );
}
//-----------------------------------------
// Test GD image
//-----------------------------------------
if ( $this->ipsclass->vars['bot_antispam'] != 0 AND $this->ipsclass->input['regid'] != "" )
{
$this->ipsclass->DB->simple_construct( array( 'select' => '*',
'from' => 'reg_antispam',
'where' => "regid='".trim($this->ipsclass->txt_alphanumerical_clean($this->ipsclass->input['regid']))."'"
) );
$this->ipsclass->DB->simple_exec();
if ( ! $row = $this->ipsclass->DB->fetch_row() )
{
$this->show_manual_form( 'lostpass', 'err_reg_code' );
return;
}
if ( trim( $this->ipsclass->txt_alphanumerical_clean($this->ipsclass->input['reg_code']) ) != $row['regcode'] )
{
$this->show_manual_form( 'lostpass', 'err_reg_code' );
return;
}
}
//-----------------------------------------
// Send a new random password?
//-----------------------------------------
if ( $this->ipsclass->vars['lp_method'] == 'random' )
{
//-----------------------------------------
// INIT
//-----------------------------------------
$save_array = array();
//-----------------------------------------
// Generate a new random password
//-----------------------------------------
$new_pass = $this->ipsclass->make_password();
//-----------------------------------------
// Generate a new salt
//-----------------------------------------
$salt = $this->ipsclass->converge->generate_password_salt(5);
$salt = str_replace( '\\', "\\\\", $salt );
//-----------------------------------------
// New log in key
//-----------------------------------------
$key = $this->ipsclass->converge->generate_auto_log_in_key();
//-----------------------------------------
// Update...
//-----------------------------------------
$save_array['converge_pass_salt'] = $salt;
$save_array['converge_pass_hash'] = md5( md5($salt) . md5( $new_pass ) );
$this->ipsclass->DB->do_update( 'members_converge', $save_array , 'converge_id='.intval( $member['id'] ) );
$this->ipsclass->DB->do_update( 'members' , array( 'member_login_key' => $key ), 'id='.intval( $member['id'] ) );
//-----------------------------------------
// Send out the email...
//-----------------------------------------
$this->email->get_template("lost_pass_email_pass");
$this->email->build_message( array(
'NAME' => $member['members_display_name'],
'THE_LINK' => $this->base_url_nosess."?act=usercp&CODE=28",
'PASSWORD' => $new_pass,
'LOGIN' => $this->base_url_nosess."?act=login",
'USERNAME' => $member['name'],
'EMAIL' => $member['email'],
'ID' => $member['id'],
)
);
$this->email->subject = $this->ipsclass->lang['lp_random_pass_subject'].' '.$this->ipsclass->vars['board_name'];
$this->email->to = $member['email'];
$this->email->send_mail();
$this->output = $this->ipsclass->compiled_templates['skin_register']->show_lostpasswait_random( $member );
}
//-----------------------------------------
// Allow user to choose...
//-----------------------------------------
else
{
if ( $_POST['pass1'] == "" )
{
$this->ipsclass->Error( array( LEVEL => 1, MSG => 'pass_blank' ) );
}
if ( $_POST['pass2'] == "" )
{
$this->ipsclass->Error( array( LEVEL => 1, MSG => 'pass_blank' ) );
}
if ($this->ipsclass->input['regid'] == "" AND $this->ipsclass->vars['bot_antispam'] != 0)
{
$this->show_manual_form( 'lostpass', 'err_reg_code' );
return;
}
$pass_a = trim($this->ipsclass->input['pass1']);
$pass_b = trim($this->ipsclass->input['pass2']);
if ( strlen($pass_a) < 3 )
{
$this->ipsclass->Error( array( LEVEL => 1, MSG => 'pass_too_short' ) );
}
if ( $pass_a != $pass_b )
{
$this->ipsclass->Error( array( LEVEL => 1, MSG => 'pass_no_match' ) );
}
$new_pass = md5($pass_a);
$this->ipsclass->converge->converge_update_password( $new_pass, $member['email'] );
$this->ipsclass->my_setcookie("member_id" , $member['id'] , 1);
$this->ipsclass->my_setcookie("pass_hash" , $member['member_login_key'], 1);
//-----------------------------------------
// Remove "dead" validation
//-----------------------------------------
$this->ipsclass->DB->do_delete( 'validating', "vid='".$validate['vid']."' OR (member_id={$member['id']} AND lost_pass=1)" );
$this->ipsclass->DB->do_delete( 'reg_antispam', "regid='".trim($this->ipsclass->txt_alphanumerical_clean($this->ipsclass->input['regid']))."'" );
$this->ipsclass->boink_it($this->ipsclass->base_url.'&act=login&CODE=autologin&frompass=1');
}
}
//-----------------------------------------
// EMAIL ADDY CHANGE
//-----------------------------------------
else if ($in_type == 'newemail')
{
if ( $validate['email_chg'] != 1 )
{
$this->ipsclass->Error( array( 'LEVEL' => 1, 'MSG' => 'auth_no_key' ) );
}
if (empty($validate['real_group']))
{
$validate['real_group'] = $this->ipsclass->vars['member_group'];
}
$this->ipsclass->DB->do_update( 'members', array( 'mgroup' => intval($validate['real_group']) ), 'id='.intval($member['id']) );
if ( USE_MODULES == 1 )
{
$this->modules->register_class($this);
$this->modules->on_group_change($member['id'], $validate['real_group']);
}
$this->ipsclass->my_setcookie("member_id" , $member['id'] , 1);
$this->ipsclass->my_setcookie("pass_hash" , $member['member_login_key'], 1);
//-----------------------------------------
// Remove "dead" validation
//-----------------------------------------
$this->ipsclass->DB->do_delete( 'validating', "vid='".$validate['vid']."' OR (member_id={$member['id']} AND email_chg=1)" );
$this->ipsclass->boink_it($this->ipsclass->base_url.'&act=login&CODE=autologin&fromemail=1');
}
}
}
/*-------------------------------------------------------------------------*/
// Manual Lost Password Form
/*-------------------------------------------------------------------------*/
function show_manual_form($type='reg', $errors="")
{
if ( $type == 'lostpass' )
{
if ($errors != "")
{
$this->output .= $this->ipsclass->compiled_templates['skin_register']->errors( $this->ipsclass->lang[$errors]);
}
$this->output .= $this->ipsclass->compiled_templates['skin_register']->show_lostpass_form();
//-----------------------------------------
// Check for input and it's in a valid format.
//-----------------------------------------
if ( $this->ipsclass->input['uid'] AND $this->ipsclass->input['aid'] )
{
$in_user_id = intval(trim(urldecode($this->ipsclass->input['uid'])));
$in_validate_key = trim(urldecode($this->ipsclass->input['aid']));
$in_type = trim($this->ipsclass->input['type']);
if ($in_type == "")
{
$in_type = 'reg';
}
//-----------------------------------------
// Check and test input
//-----------------------------------------
if (! preg_match( "/^(?:[\d\w]){32}$/", $in_validate_key ) )
{
$this->ipsclass->Error( array( 'LEVEL' => 1, 'MSG' => 'data_incorrect' ) );
}
if (! preg_match( "/^(?:\d){1,}$/", $in_user_id ) )
{
$this->ipsclass->Error( array( 'LEVEL' => 1, 'MSG' => 'data_incorrect' ) );
}
//-----------------------------------------
// Attempt to get the profile of the requesting user
//-----------------------------------------
$this->ipsclass->DB->simple_construct( array( 'select' => '*', 'from' => 'members', 'where' => "id=$in_user_id" ) );
$this->ipsclass->DB->simple_exec();
if ( ! $member = $this->ipsclass->DB->fetch_row() )
{
$this->ipsclass->Error( array( 'LEVEL' => 1, 'MSG' => 'auth_no_mem' ) );
}
//-----------------------------------------
// Get validating info..
//-----------------------------------------
$validate = $this->ipsclass->DB->simple_exec_query( array( 'select' => '*', 'from' => 'validating', 'where' => "member_id=$in_user_id and vid='$in_validate_key' and lost_pass=1" ) );
if ( ! $validate['member_id'] )
{
$this->ipsclass->Error( array( 'LEVEL' => 1, 'MSG' => 'auth_no_key' ) );
}
$this->output = str_replace( "<!--IBF.INPUT_TYPE-->", $this->ipsclass->compiled_templates['skin_register']->show_lostpass_form_auto($in_validate_key, $in_user_id), $this->output );
}
else
{
$this->output = str_replace( "<!--IBF.INPUT_TYPE-->", $this->ipsclass->compiled_templates['skin_register']->show_lostpass_form_manual(), $this->output );
}
if ($this->ipsclass->vars['bot_antispam'])
{
// Set a new ID for this reg request...
$regid = md5( uniqid(microtime()) );
if( $this->ipsclass->vars['bot_antispam'] == 'gd' )
{
//-----------------------------------------
// Get 6 random chars
//-----------------------------------------
$reg_code = strtoupper( substr( md5($regid), 0, 6 ) );
}
else
{
//-----------------------------------------
// Set a new 6 character numerical string
//-----------------------------------------
mt_srand ((double) microtime() * 1000000);
$reg_code = mt_rand(100000,999999);
}
// Insert into the DB
$this->ipsclass->DB->do_insert( 'reg_antispam', array (
'regid' => $regid,
'regcode' => $reg_code,
'ip_address' => $this->ipsclass->input['IP_ADDRESS'],
'ctime' => time(),
) );
}
if ($this->ipsclass->vars['bot_antispam'] == 'gd')
{
$this->output = str_replace( "<!--{REG.ANTISPAM}-->", $this->ipsclass->compiled_templates['skin_register']->bot_antispam_gd( $regid ), $this->output );
}
else if ($this->ipsclass->vars['bot_antispam'] == 'gif')
{
$this->output = str_replace( "<!--{REG.ANTISPAM}-->", $this->ipsclass->compiled_templates['skin_register']->bot_antispam( $regid ), $this->output );
}
}
else
{
$this->output = $this->ipsclass->compiled_templates['skin_register']->show_dumb_form($type);
}
$this->page_title = $this->ipsclass->lang['activation_form'];
$this->nav = array( $this->ipsclass->lang['activation_form'] );
}
/*-------------------------------------------------------------------------*/
// Show reg image
/*-------------------------------------------------------------------------*/
function show_image()
{
if ( $this->ipsclass->input['rc'] == "" )
{
return false;
}
// Get the info from the db
$this->ipsclass->DB->simple_construct( array( 'select' => '*',
'from' => 'reg_antispam',
'where' => "regid='".trim($this->ipsclass->txt_alphanumerical_clean($this->ipsclass->input['rc']))."'"
) );
$this->ipsclass->DB->simple_exec();
if ( ! $row = $this->ipsclass->DB->fetch_row() )
{
return false;
}
//-----------------------------------------
// Using GD?
//-----------------------------------------
if ( $this->ipsclass->vars['bot_antispam'] == 'gd' )
{
$this->ipsclass->show_gd_img($row['regcode']);
}
else
{
//-----------------------------------------
// Using normal then, check for "p"
//-----------------------------------------
if ( $this->ipsclass->input['p'] == "" )
{
return false;
}
$p = intval($this->ipsclass->input['p']) - 1; //substr starts from 0, not 1 :p
$this_number = substr( $row['regcode'], $p, 1 );
$this->ipsclass->show_gif_img($this_number);
}
}
}
?>