Exemple #1
0
 /**
  * Create admin account
  *
  * @access	public
  * @return	@e void
  */
 public static function createAdminAccount()
 {
     /* Build Entry */
     $_mke_time = ipsRegistry::$settings['login_key_expire'] ? time() + intval(ipsRegistry::$settings['login_key_expire']) * 86400 : 0;
     $salt = IPSMember::generatePasswordSalt(5);
     $passhash = IPSMember::generateCompiledPasshash($salt, md5(IPSSetUp::getSavedData('admin_pass')));
     $_dname = IPSSetUp::getSavedData('admin_user');
     $member = array('name' => $_dname, 'members_l_username' => strtolower($_dname), 'members_display_name' => $_dname, 'members_l_display_name' => strtolower($_dname), 'members_seo_name' => IPSText::makeSeoTitle($_dname), 'member_login_key' => IPSMember::generateAutoLoginKey(), 'member_login_key_expire' => $_mke_time, 'title' => 'Administrator', 'email' => IPSSetUp::getSavedData('admin_email'), 'member_group_id' => 4, 'posts' => 1, 'joined' => time(), 'last_visit' => time(), 'last_activity' => time(), 'ip_address' => my_getenv('REMOTE_ADDR'), 'view_sigs' => 1, 'restrict_post' => 0, 'msg_show_notification' => 1, 'msg_count_total' => 0, 'msg_count_new' => 0, 'coppa_user' => 0, 'language' => IPSLib::getDefaultLanguage(), 'members_auto_dst' => 1, 'member_uploader' => 'flash', 'allow_admin_mails' => 0, 'members_pass_hash' => $passhash, 'members_pass_salt' => $salt, 'has_blog' => '', 'fb_token' => '', 'ignored_users' => '', 'members_cache' => '', 'failed_logins' => '', 'bday_day' => 0, 'bday_month' => 0, 'bday_year' => 0);
     /* Insert: MEMBERS */
     ipsRegistry::DB()->setDataType(array('name', 'members_display_name', 'members_l_username', 'members_l_display_name'), 'string');
     ipsRegistry::DB()->insert('members', $member);
     $member_id = ipsRegistry::DB()->getInsertId();
     $member['member_id'] = $member_id;
     /* Insert into the custom profile fields DB */
     ipsRegistry::DB()->insert('pfields_content', array('member_id' => $member_id));
     /* Insert into pp */
     ipsRegistry::DB()->insert('profile_portal', array('pp_member_id' => $member_id, 'pp_setting_count_friends' => 1, 'signature' => '', 'pconversation_filters' => '', 'pp_setting_count_comments' => 1, 'pp_setting_count_visitors' => 1));
 }
 /**
  * Create new member
  * Very basic functionality at this point.
  *
  * @access	public
  * @param	array 	Fields to save in the following format: array( 'members'      => array( 'email'     => '*****@*****.**',
  *																				         'joined'   => time() ),
  *															   'extendedProfile' => array( 'signature' => 'My signature' ) );
  *					Tables: members, pfields_content, profile_portal.
  *					You can also use the aliases: 'core [members]', 'extendedProfile [profile_portal]', and 'customFields [pfields_content]'
  * @param	bool	Flag to attempt to auto create a name if the desired is taken
  * @param	bool	Bypass custom field saving (if using the sso session integration this is required as member object isn't ready yet)
  * @return	array 	Final member Data including member_id
  *
  * EXCEPTION CODES
  * CUSTOM_FIELDS_EMPTY    - Custom fields were not populated
  * CUSTOM_FIELDS_INVALID  - Custom fields were invalid
  * CUSTOM_FIELDS_TOOBIG   - Custom fields too big
  */
 public static function create($tables = array(), $autoCreateName = FALSE, $bypassCfields = FALSE)
 {
     //-----------------------------------------
     // INIT
     //-----------------------------------------
     $finalTables = array();
     $password = '';
     $bitWiseFields = ipsRegistry::fetchBitWiseOptions('global');
     //-----------------------------------------
     // Remap tables if required
     //-----------------------------------------
     foreach ($tables as $table => $data) {
         $_name = isset(self::$remap[$table]) ? self::$remap[$table] : $table;
         if ($_name == 'members') {
             /* Magic password field */
             $password = isset($data['password']) ? trim($data['password']) : IPSLib::makePassword();
             $md_5_password = md5($password);
             unset($data['password']);
         }
         $finalTables[$_name] = $data;
     }
     //-----------------------------------------
     // Custom profile field stuff
     //-----------------------------------------
     if (!$bypassCfields) {
         require_once IPS_ROOT_PATH . 'sources/classes/customfields/profileFields.php';
         $fields = new customProfileFields();
         if (is_array($finalTables['pfields_content']) and count($finalTables['pfields_content'])) {
             $fields->member_data = $finalTables['pfields_content'];
         }
         $_cfieldMode = 'normal';
         $fields->initData('edit');
         $fields->parseToSave($finalTables['pfields_content'], 'register');
         /* Check */
         if (count($fields->error_fields['empty'])) {
             //throw new Exception( 'CUSTOM_FIELDS_EMPTY' );
         }
         if (count($fields->error_fields['invalid'])) {
             //throw new Exception( 'CUSTOM_FIELDS_INVALID' );
         }
         if (count($fields->error_fields['toobig'])) {
             //throw new Exception( 'CUSTOM_FIELDS_TOOBIG' );
         }
     }
     //-----------------------------------------
     // Make sure the account doesn't exist
     //-----------------------------------------
     if ($finalTables['members']['email']) {
         $existing = IPSMember::load($finalTables['members']['email'], 'all');
         if ($existing['member_id']) {
             $existing['full'] = true;
             $existing['timenow'] = time();
             return $existing;
         }
     }
     //-----------------------------------------
     // Fix up usernames and display names
     //-----------------------------------------
     /* Ensure we have a display name */
     $finalTables['members']['members_display_name'] = $finalTables['members']['members_display_name'] ? $finalTables['members']['members_display_name'] : $finalTables['members']['name'];
     //-----------------------------------------
     // Clean up characters
     //-----------------------------------------
     if ($finalTables['members']['name']) {
         $userName = IPSMember::getFunction()->cleanAndCheckName($finalTables['members']['name'], array(), 'name');
         if ($userName['errors']) {
             $finalTables['members']['name'] = '';
         } else {
             $finalTables['members']['name'] = $userName['username'];
         }
     }
     if ($finalTables['members']['members_display_name']) {
         $displayName = IPSMember::getFunction()->cleanAndCheckName($finalTables['members']['members_display_name']);
         if ($displayName['errors']) {
             $finalTables['members']['members_display_name'] = '';
         } else {
             $finalTables['members']['members_display_name'] = $displayName['members_display_name'];
         }
     }
     //-----------------------------------------
     // Remove some basic HTML tags
     //-----------------------------------------
     $finalTables['members']['members_display_name'] = str_replace(array('<', '>', '"'), '', $finalTables['members']['members_display_name']);
     $finalTables['members']['name'] = str_replace(array('<', '>', '"'), '', $finalTables['members']['name']);
     //-----------------------------------------
     // Make sure the names are unique
     //-----------------------------------------
     if ($finalTables['members']['members_display_name']) {
         try {
             if (IPSMember::getFunction()->checkNameExists($finalTables['members']['members_display_name'], array(), 'members_display_name', true) === true) {
                 if ($autoCreateName === TRUE) {
                     /* Now, make sure we have a unique display name */
                     $max = ipsRegistry::DB()->buildAndFetch(array('select' => 'MAX(member_id) as max', 'from' => 'members', 'where' => "members_l_display_name LIKE '" . $this->DB->addSlashes(strtolower($finalTables['members']['members_display_name'])) . "%'"));
                     if ($max['max']) {
                         $_num = $max['max'] + 1;
                         $finalTables['members']['members_display_name'] = $finalTables['members']['members_display_name'] . '_' . $_num;
                     }
                 } else {
                     $finalTables['members']['members_display_name'] = '';
                 }
             }
         } catch (Exception $e) {
         }
     }
     if ($finalTables['members']['name']) {
         try {
             if (IPSMember::getFunction()->checkNameExists($finalTables['members']['name'], array(), 'name', true) === true) {
                 if ($autoCreateName === TRUE) {
                     /* Now, make sure we have a unique username */
                     $max = ipsRegistry::DB()->buildAndFetch(array('select' => 'MAX(member_id) as max', 'from' => 'members', 'where' => "members_l_username LIKE '" . $this->DB->addSlashes(strtolower($finalTables['members']['name'])) . "%'"));
                     if ($max['max']) {
                         $_num = $max['max'] + 1;
                         $finalTables['members']['name'] = $finalTables['members']['name'] . '_' . $_num;
                     }
                 } else {
                     $finalTables['members']['name'] = '';
                 }
             }
         } catch (Exception $e) {
         }
     }
     //-----------------------------------------
     // Populate member table(s)
     //-----------------------------------------
     $finalTables['members']['members_l_username'] = isset($finalTables['members']['name']) ? strtolower($finalTables['members']['name']) : '';
     $finalTables['members']['joined'] = $finalTables['members']['joined'] ? $finalTables['members']['joined'] : time();
     $finalTables['members']['email'] = $finalTables['members']['email'] ? $finalTables['members']['email'] : $finalTables['members']['name'] . '@' . $finalTables['members']['joined'];
     $finalTables['members']['member_group_id'] = $finalTables['members']['member_group_id'] ? $finalTables['members']['member_group_id'] : ipsRegistry::$settings['member_group'];
     $finalTables['members']['ip_address'] = $finalTables['members']['ip_address'] ? $finalTables['members']['ip_address'] : ipsRegistry::member()->ip_address;
     $finalTables['members']['members_created_remote'] = intval($finalTables['members']['members_created_remote']);
     $finalTables['members']['member_login_key'] = IPSMember::generateAutoLoginKey();
     $finalTables['members']['member_login_key_expire'] = ipsRegistry::$settings['login_key_expire'] ? time() + intval(ipsRegistry::$settings['login_key_expire']) * 86400 : 0;
     $finalTables['members']['view_sigs'] = 1;
     $finalTables['members']['email_pm'] = 1;
     $finalTables['members']['view_img'] = 1;
     $finalTables['members']['view_avs'] = 1;
     $finalTables['members']['restrict_post'] = intval($finalTables['members']['restrict_post']);
     $finalTables['members']['view_pop'] = 1;
     $finalTables['members']['msg_count_total'] = 0;
     $finalTables['members']['msg_count_new'] = 0;
     $finalTables['members']['msg_show_notification'] = 1;
     $finalTables['members']['coppa_user'] = 0;
     $finalTables['members']['auto_track'] = intval($finalTables['members']['auto_track']);
     $finalTables['members']['last_visit'] = $finalTables['members']['last_visit'] ? $finalTables['members']['last_visit'] : time();
     $finalTables['members']['last_activity'] = $finalTables['members']['last_activity'] ? $finalTables['members']['last_activity'] : time();
     $finalTables['members']['language'] = IPSLib::getDefaultLanguage();
     $finalTables['members']['members_editor_choice'] = ipsRegistry::$settings['ips_default_editor'];
     $finalTables['members']['members_pass_salt'] = IPSMember::generatePasswordSalt(5);
     $finalTables['members']['members_pass_hash'] = IPSMember::generateCompiledPasshash($finalTables['members']['members_pass_salt'], $md_5_password);
     $finalTables['members']['members_display_name'] = isset($finalTables['members']['members_display_name']) ? $finalTables['members']['members_display_name'] : '';
     $finalTables['members']['members_l_display_name'] = isset($finalTables['members']['members_display_name']) ? strtolower($finalTables['members']['members_display_name']) : '';
     $finalTables['members']['fb_uid'] = isset($finalTables['members']['fb_uid']) ? $finalTables['members']['fb_uid'] : 0;
     $finalTables['members']['fb_emailhash'] = isset($finalTables['members']['fb_emailhash']) ? strtolower($finalTables['members']['fb_emailhash']) : '';
     $finalTables['members']['members_seo_name'] = IPSText::makeSeoTitle($finalTables['members']['members_display_name']);
     $finalTables['members']['bw_is_spammer'] = intval($finalTables['members']['bw_is_spammer']);
     //-----------------------------------------
     // Insert: MEMBERS
     //-----------------------------------------
     ipsRegistry::DB()->force_data_type = array('name' => 'string', 'members_l_username' => 'string', 'members_display_name' => 'string', 'members_l_display_name' => 'string', 'members_seo_name' => 'string', 'email' => 'string');
     /* Bitwise options */
     if (is_array($bitWiseFields['members'])) {
         $_freeze = array();
         foreach ($bitWiseFields['members'] as $field) {
             if (isset($finalTables['members'][$field])) {
                 /* Add to freezeable array */
                 $_freeze[$field] = $finalTables['members'][$field];
                 /* Remove it from the fields to save to DB */
                 unset($finalTables['members'][$field]);
             }
         }
         if (count($_freeze)) {
             $finalTables['members']['members_bitoptions'] = IPSBWOptions::freeze($_freeze, 'members', 'global');
         }
     }
     ipsRegistry::DB()->insert('members', $finalTables['members']);
     //-----------------------------------------
     // Get the member id
     //-----------------------------------------
     $finalTables['members']['member_id'] = ipsRegistry::DB()->getInsertId();
     //-----------------------------------------
     // Insert: PROFILE PORTAL
     //-----------------------------------------
     $finalTables['profile_portal']['pp_member_id'] = $finalTables['members']['member_id'];
     $finalTables['profile_portal']['pp_setting_count_friends'] = 1;
     $finalTables['profile_portal']['pp_setting_count_comments'] = 1;
     ipsRegistry::DB()->insert('profile_portal', $finalTables['profile_portal']);
     //-----------------------------------------
     // Insert into the custom profile fields DB
     //-----------------------------------------
     if (!$bypassCfields) {
         $fields->out_fields['member_id'] = $finalTables['members']['member_id'];
         ipsRegistry::DB()->delete('pfields_content', 'member_id=' . $finalTables['members']['member_id']);
         ipsRegistry::DB()->insert('pfields_content', $fields->out_fields);
     } else {
         ipsRegistry::DB()->delete('pfields_content', 'member_id=' . $finalTables['members']['member_id']);
         ipsRegistry::DB()->insert('pfields_content', array('member_id' => $finalTables['members']['member_id']));
     }
     //-----------------------------------------
     // Insert into partial ID table
     //-----------------------------------------
     $full_account = false;
     if ($finalTables['members']['members_display_name'] and $finalTables['members']['name'] and $finalTables['members']['email'] != $finalTables['members']['name'] . '@' . $finalTables['members']['joined']) {
         $full_account = true;
     }
     if (!$full_account) {
         ipsRegistry::DB()->insert('members_partial', array('partial_member_id' => $finalTables['members']['member_id'], 'partial_date' => $finalTables['members']['joined'], 'partial_email_ok' => $finalTables['members']['email'] == $finalTables['members']['name'] . '@' . $finalTables['members']['joined'] ? 0 : 1));
     }
     //IPSMember::updateSearchIndex( $finalTables['members']['member_id'] );
     IPSLib::runMemberSync('onCreateAccount', $finalTables['members']);
     return array_merge($finalTables['members'], $finalTables['profile_portal'], !$bypassCfields ? $fields->out_fields : array(), array('timenow' => $finalTables['members']['joined'], 'full' => $full_account));
 }
Exemple #3
0
 /**
  * Convert a member
  *
  * @access	public
  * @param 	array		Basic data (id number, username, email, group, joined date, password)
  * @param 	array 		Data to insert to members table
  * @param 	array 		Data to insert to profile table
  * @param 	array 		Data to insert to custom profile fields table
  * @param 	string 		Path to avatars folder
  * @param 	string 		Path to profile pictures folder
  * @return 	boolean		Success or fail
  **/
 public function convertMember($info, $members, $profile, $custom, $pic_path = '', $groupLink = TRUE)
 {
     //-----------------------------------------
     // Make sure we have everything we need
     //-----------------------------------------
     if (!$info['id']) {
         $this->logError($info['id'], 'No ID number provided');
         return false;
     }
     if (!$info['username']) {
         $this->logError($info['id'], 'No username provided');
         return false;
     }
     if (!$info['email']) {
         // See Tracker Report #28874 for reasons why this got changed.
         $info['email'] = $info['id'] . '@' . time() . '.com';
         //$info['email'] = rand(1, 100).'@'.time().'.com';
         $this->logError($info['id'], 'No email address provided - member converted with ' . $info['email']);
     }
     // Check profile photo
     if (!is_writeable($this->settings['upload_dir'] . '/profile')) {
         $this->error($this->settings['upload_dir'] . '/profile is not writeable, cannot continue');
         return false;
     }
     //-----------------------------------------
     // Set some needed variables
     //-----------------------------------------
     $now = time();
     $joined = $info['joined'] ? $info['joined'] : $now;
     if ($info['md5pass']) {
         $salt = IPSMember::generatePasswordSalt(5);
         $hash = IPSMember::generateCompiledPasshash($salt, $info['md5pass']);
     } elseif ($info['plainpass']) {
         $salt = IPSMember::generatePasswordSalt(5);
         $hash = IPSMember::generateCompiledPasshash($salt, md5($info['plainpass']));
     } elseif ($info['pass_hash']) {
         $salt = $info['pass_salt'];
         $hash = $info['pass_hash'];
     } elseif ($info['password'] !== NULL) {
         $members['conv_password'] = $info['password'];
     } else {
         // give em a random pass, let's stop those posts by these users being lost and assigned to guests.
         $randPass = IPSMember::makePassword();
         $salt = IPSMember::generatePasswordSalt(5);
         $hash = IPSMember::generateCompiledPasshash($salt, $randPass);
         $this->logError($info['id'], 'No password provided. Member has still been converted with password: '******'email'], 'all');
     if ($duplicateMember['member_id']) {
         $this->logError($info['id'], "Duplicate member found. {$info['username']} has been merged with the account email {$duplicateMember['username']}");
         $this->addLink($duplicateMember['member_id'], $info['id'], 'members');
         $this->DB->update('conv_link', array('duplicate' => '1'), "type = 'members' AND app={$this->app['app_id']} AND foreign_id='{$info['id']}'");
         if ($info['posts'] > 0) {
             $this->DB->update('members', array('posts' => "posts+'{$info['posts']}'"), "member_id='{$duplicateMember['member_id']}'");
         }
         // we have a customavatar and the one we have on file does not match what we've been given, time to update it.
         if ($profile['photo_type'] == 'custom' and $duplicateMember['pp_main_photo'] != $profile['pp_main_photo']) {
             if ($profile['photo_data']) {
                 // open file for writing
                 if (!($handle = fopen($this->settings['upload_dir'] . '/profile/photo-' . $profile['pp_member_id'] . '.png', 'w'))) {
                     $this->logError($info['id'], 'Could not write to file.');
                 }
                 // Write image to our opened file.
                 if (fwrite($handle, $profile['photo_data']) === FALSE) {
                     $this->logError($info['id'], 'Could not write to file.');
                 }
                 // log it all into DB
                 $profile['pp_main_photo'] = 'profile/photo-' . $profile['pp_member_id'] . '.png';
             }
         }
         return TRUE;
     }
     //-----------------------------------------
     // Handle Names
     //-----------------------------------------
     // Apostrophe is an allowed character but needs converting
     $info['username'] = str_replace("'", '&#39;', $info['username']);
     $info['username'] = str_replace("!", '&#33;', $info['username']);
     // as is an excalamation point.
     $nameCheck = IPSMember::getFunction()->cleanAndCheckName($info['username'], array(), 'name');
     // Check for illegal characters
     if ($nameCheck['errors']['username'] == ipsRegistry::getClass('class_localization')->words['reg_error_chars']) {
         // Illegal characters exist, clean them out with dashes
         $nameCheckMap['disallowed'] = array("'", "\"", "&#34;", "<", ">", "\\", "&#92;", "\$", "&#036;", "]", "[", ",", "|");
         $nameCheckMap['replace'] = array('&#39;', '&#quot;', '&#quot;', '&#lt;', '&#gt;', '-', '-', '-', '-', '-', '-', '-', '-');
         $nameCheck['members_display_name'] = str_replace($nameCheckMap['disallowed'], $nameCheckMap['replace'], $nameCheck['username']);
         $this->logError($info['id'], "{$nameCheck['errors']['username']} with name {$info['username']}. Member has still been created but with username as {$nameCheck['username']}");
         // Now check for duplicate username.
         try {
             if (IPSMember::getFunction()->checkNameExists($nameCheck['username'], array(), 'name', true, true)) {
                 $t = time();
                 $this->logError($info['id'], ipsRegistry::getClass('class_localization')->words['reg_error_username_taken'] . " with name {$nameCheck['username']}. Member has still been created but with username as {$nameCheck['username']}{$t}");
                 $nameCheck['username'] = $nameCheck['username'] . $t;
             }
         } catch (Exception $e) {
             //-----------------------------------------
             // Name exists, let's return appropriately
             //-----------------------------------------
             switch ($e->getMessage()) {
                 default:
                     $this->logError($info['id'], "Unexpected error with name: {$info['username']}. Member was skipped.");
                     return false;
             }
         }
     } elseif ($nameCheck['errors']['username'] == 'reg_error_username_taken') {
         $nameCheck['username'] = $nameCheck['username'] . time();
         $this->logError($info['id'], "{$nameCheck['errors']['username']} with name: {$info['username']}. Member has still been created but with username as {$nameCheck['username']}");
     }
     $username = $displayname = $nameCheck['username'];
     // Begin check and clean for display name if provided.
     if (isset($info['displayname'])) {
         // Apostrophe is an allowed character but needs converting
         $info['displayname'] = str_replace("'", '&#39;', $info['displayname']);
         $displayname = NULL;
         $nameCheck = IPSMember::getFunction()->cleanAndCheckName($info['displayname'], array(), 'members_display_name');
         if ($nameCheck['errors']['dname'] == str_replace('{chars}', ipsRegistry::$settings['username_characters'], ipsRegistry::$settings['username_errormsg'])) {
             $nameCheckMap['disallowed'] = array("'", "\"", "&#34;", "<", ">", "\\", "&#92;", "\$", "&#036;", "]", "[", ",", "|");
             $nameCheckMap['replace'] = array('&#39;', '&#quot;', '&#quot;', '&#lt;', '&#gt;', '-', '-', '-', '-', '-', '-', '-', '-');
             $nameCheck['members_display_name'] = str_replace($nameCheckMap['disallowed'], $nameCheckMap['replace'], $nameCheck['members_display_name']);
             $this->logError($info['id'], "{$nameCheck['errors']['dname']} with name: {$info['displayname']}. Member has still been created but with display name as {$nameCheck['members_display_name']}");
             // Now check for duplicate display name.
             try {
                 if (IPSMember::getFunction()->checkNameExists($nameCheck['members_display_name'], array(), 'members_display_name', true, true)) {
                     $t = time();
                     $this->logError($info['id'], ipsRegistry::getClass('class_localization')->words['reg_error_username_taken'] . " with name {$nameCheck['members_display_name']}. Member has still been created but with display name as {$nameCheck['members_display_name']}{$t}");
                     $nameCheck['members_display_name'] = $nameCheck['members_display_name'] . $t;
                 }
             } catch (Exception $e) {
                 //-----------------------------------------
                 // Name exists, let's return appropriately
                 //-----------------------------------------
                 switch ($e->getMessage()) {
                     default:
                         $this->logError($info['id'], "Unexpected error with display name: {$info['displayname']}. Member was skipped.");
                         return false;
                 }
             }
         } elseif ($nameCheck['errors']['dname'] == 'reg_error_username_taken') {
             $nameCheck['members_display_name'] = $nameCheck['members_display_name'] . time();
             $this->logError($info['id'], "{$nameCheck['errors']['dname']} with name: {$info['displayname']}. Member has still been created but with display name as {$nameCheck['members_display_name']}");
         }
         $displayname = $nameCheck['members_display_name'];
     }
     // Check we have a path
     if (!$this->settings['upload_dir']) {
         $this->logError($info['id'], 'Your IP.Board uploads path has not been configured');
         return false;
     }
     //-----------------------------------------
     // Insert
     //-----------------------------------------
     $members['title'] = str_replace("'", '&#39;', $members['title']);
     //$members['member_id']				= $info['id'];
     $members['name'] = $username;
     $members['last_post'] = intval($members['last_post']);
     if (empty($info['member_group_id'])) {
         $members['member_group_id'] = $info['group'] ? $groupLink === TRUE ? $this->getLink($info['group'], 'groups') : $info['group'] : $this->settings['member_group'];
     } else {
         $members['member_group_id'] = $info['member_group_id'];
     }
     $members['email'] = $info['email'];
     $members['joined'] = $joined;
     $members['member_login_key'] = IPSMember::generateAutoLoginKey();
     $members['member_login_key_expire'] = ipsRegistry::$settings['login_key_expire'] ? time() + intval(ipsRegistry::$settings['login_key_expire']) * 86400 : 0;
     $members['members_display_name'] = $displayname;
     $members['members_seo_name'] = IPSText::makeSeoTitle($displayname);
     $members['members_l_display_name'] = IPSText::mbstrtolower($displayname);
     $members['members_l_username'] = IPSText::mbstrtolower($username);
     $members['members_pass_hash'] = $hash;
     $members['members_pass_salt'] = $salt;
     $members['posts'] = $members['posts'] ? $members['posts'] : 0;
     $members['warn_level'] = (int) $members['warn_level'];
     // Sort out secondary groups
     if (!empty($info['secondary_groups'])) {
         // explode so we can loop through for the getLink
         $secondary_groups = explode(",", $info['secondary_groups']);
         $_secondary = array();
         if (!empty($secondary_groups)) {
             foreach ($secondary_groups as $group) {
                 if (!empty($group)) {
                     $newGroup = $this->getLink($group, 'groups', true);
                     if ($newGroup) {
                         $_secondary[] = $newGroup;
                     }
                 }
                 /**else
                 			{
                 				$this->logError($info['id'] .' - '. $group, 'empty secondary group id');
                 			}**/
             }
         }
         $members['mgroup_others'] = implode(",", $_secondary);
     }
     // Sneaky hack with the comments and friends
     if (!in_array('pp_setting_count_comments', $profile)) {
         $profile['pp_setting_count_comments'] = 1;
     }
     if (!in_array('pp_setting_count_friends', $profile)) {
         $profile['pp_setting_count_friends'] = 1;
     }
     // We better turn on allow_admin_mails if it isn't set
     $members['allow_admin_mails'] = isset($members['allow_admin_mails']) ? $members['allow_admin_mails'] : 1;
     // Fix up the birthday since STRICT complains..
     $members['bday_day'] = intval($members['bday_day']);
     $members['bday_month'] = intval($members['bday_month']);
     $members['bday_year'] = intval($members['bday_year']);
     // No idea why birthdays are messing up.., so I'll just hack this bit. - Alex
     // #020372 tracker
     if ($members['bday_year'] < 1900) {
         // Don't think we can really be this old ya know.
         $members['bday_day'] = 0;
         $members['bday_month'] = 0;
         $members['bday_year'] = 0;
     }
     // 3.1.3 dropped columns
     unset($members['email_pm']);
     // 3.2.0 Dropped columns
     unset($members['hide_email']);
     unset($members['view_avs']);
     // 3.3.0 Dropped columns
     unset($members['members_editor_choice']);
     // First member?
     if ($info['id'] != $this->memberData['member_id']) {
         if ($this->usingExtendedInserts) {
             // Add it to the extended insert array which runs on next()
             $this->extendedInserts['members'][] = $this->DB->compileInsertString($members);
             //$memberId = $members['member_id'];
             $memberId = $info['id'];
         } else {
             //unset( $members['member_id'] );
             $this->DB->insert('members', $members);
             $memberId = $this->DB->getInsertId();
             // Add a link
             $this->addLink($memberId, $info['id'], 'members');
         }
     } else {
         if ($this->usingExtendedInserts) {
             // Unset important information to stop locking us out
             $unset = array('member_id', 'members_pass_salt', 'members_pass_hash', 'name', 'members_l_username', 'members_display_name', 'members_l_display_name', 'members_seo_name', 'member_banned', 'conv_password', 'email', 'member_group_id');
             foreach ($unset as $k) {
                 unset($members[$k]);
             }
             $this->DB->update('members', $members, "member_id=" . $this->memberData['member_id']);
             $memberId = $this->memberData['member_id'];
             $this->logError($memberId, "<strong><span style='size: 1.15em;'>{$username} has been merged with {$this->memberData['members_display_name']}. This is because you are logged in as {$this->memberData['members_display_name']} and due to both members sharing the same ID. You are not running the conversion in 'merge' mode and therefore you WILL have to manually update this members name, email address, AND member group.</span></strong><br /><ul><li>Username: {$username}</li><li>Email Address: {$info['email']}</li></ul>");
         } else {
             //unset( $members['member_id'] );
             $this->DB->insert('members', $members);
             $memberId = $this->DB->getInsertId();
             // Add a link
             $this->addLink($memberId, $info['id'], 'members');
         }
     }
     // If user group is the auth group, add them to validating table.
     if ($members['member_group_id'] == $this->settings['auth_group'] && ($this->settings['reg_auth_type'] == 'user' || $this->settings['reg_auth_type'] == 'admin' || $this->settings['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
         //-----------------------------------------
         $validating = array('vid' => md5(uniqid()), 'member_id' => $memberId, 'real_group' => $this->settings['member_group'], 'temp_group' => $this->settings['auth_group'], 'entry_date' => time(), 'coppa_user' => 0, 'new_reg' => 1, 'ip_address' => $members['ip_address'], 'spam_flag' => 0);
         if ($this->usingExtendedInserts) {
             $this->extendedInserts['validating'][] = $this->DB->compileInsertString($validating);
         } else {
             $this->DB->insert('validating', $validating);
         }
     }
     $profile['pp_member_id'] = $memberId;
     // Defaults if not specified (prevents "Column Count Mismatches" in MySQL)
     $profile['pp_thumb_photo'] = $profile['pp_thumb_photo'] ? $profile['pp_thumb_photo'] : '';
     $profile['pp_main_photo'] = $profile['pp_main_photo'] ? $profile['pp_main_photo'] : '';
     $profile['pp_main_width'] = $profile['pp_main_width'] ? $profile['pp_main_width'] : 0;
     $profile['pp_main_height'] = $profile['pp_main_height'] ? $profile['pp_main_height'] : 0;
     $profile['pp_thumb_width'] = $profile['pp_thumb_width'] ? $profile['pp_thumb_width'] : 0;
     $profile['pp_thumb_height'] = $profile['pp_thumb_height'] ? $profile['pp_thumb_height'] : 0;
     //-----------------------------------------
     // Sort out uploaded avatars / photos
     //-----------------------------------------
     // we send profile_type of custom if we have a photo at all
     if ($profile['photo_type'] == 'custom') {
         if ($profile['photo_data']) {
             // open file for writing
             if (!($handle = fopen($this->settings['upload_dir'] . '/profile/photo-' . $profile['pp_member_id'] . '.png', 'w'))) {
                 $this->logError($info['id'], 'Could not write to file.');
             }
             // Write image to our opened file.
             if (fwrite($handle, $profile['photo_data']) === FALSE) {
                 $this->logError($info['id'], 'Could not write to file.');
             }
             // log it all into DB
             $profile['pp_main_photo'] = 'profile/photo-' . $profile['pp_member_id'] . '.png';
         }
     }
     if ($profile['photo_type'] == 'url') {
         // Make an attempt at fetching the remote pic. If not, log an error.
         $profile['pp_main_photo'] = '';
         if ($remote = @file_get_contents($profile['photo_location'])) {
             $image_dims = @getimagesize($profile['photo_location']);
             if ($image_dims[0]) {
                 $profile['photo_data'] = $remote;
                 $profile['photo_type'] = 'custom';
                 $profile['pp_main_photo'] = $profile['photo_location'];
                 if (!isset($profile['photo_filesize'])) {
                     $profile['photo_filesize'] = strlen($remote);
                 }
             } else {
                 $this->logError($info['id'], 'Remote picture file does not appear to be an image.');
             }
         } else {
             $this->logError($info['id'], 'Could not fetch remote picture file.');
         }
     }
     // Oops... I screwed up... workaround for now... will fix properly soon.
     if ($profile['photo_type'] != 'url' and $profile['photo_location'] and !$profile['pp_main_photo']) {
         $profile['pp_main_photo'] = $profile['photo_location'];
     }
     if (!is_dir($pic_path) and $profile['pp_main_photo'] and !$profile['photo_data']) {
         $this->logError($info['id'], 'Incorrect profile pictures path');
         //return false;
     }
     // Move em or create em
     if ($profile['pp_main_photo']) {
         //-----------------------------------------
         // Already a dir?
         //-----------------------------------------
         $upload_path = $this->settings['upload_dir'];
         $upload_dir;
         if (!file_exists($upload_path . "/profile")) {
             if (@mkdir($upload_path . "/profile", 0777)) {
                 @file_put_contents($upload_path . '/profile/index.html', '');
                 @chmod($upload_path . "/profile", 0777);
                 # Set path and dir correct
                 $upload_path .= "/profile";
                 $upload_dir = "profile/";
             } else {
                 # Set path and dir correct
                 $upload_dir = "";
             }
         } else {
             # Set path and dir correct
             $upload_path .= "/profile";
             $upload_dir = "profile/";
         }
         // What's the extension?
         $e = explode('.', $profile['pp_main_photo']);
         $extension = array_pop($e);
         // There's an issue with profile photo thumbnail rebuilds. Waiting on the deal with that issue before adjusting this.
         // For now, we'll just set the thumbnail the same as the main photo.
         $profile['pp_thumb_photo'] = "{$upload_dir}photo-{$memberId}.{$extension}";
         if ($profile['photo_data']) {
             //$this->createFile($profile['pp_main_photo'], $profile['photo_data'], $profile['photo_filesize'], $this->settings['upload_dir']);
             $this->createFile("photo-{$memberId}.{$extension}", $profile['photo_data'], $profile['photo_filesize'], $upload_path);
             $profile['pp_main_photo'] = "{$upload_dir}photo-{$memberId}.{$extension}";
         } else {
             //$this->moveFiles(array($profile['pp_main_photo']), $profile_path, $this->settings['upload_dir']);
             $this->moveFiles(array($profile['pp_main_photo']), $pic_path, $upload_path);
             if ($upload_dir != '' && @rename($upload_path . "/{$profile['pp_main_photo']}", $upload_path . "/photo-{$memberId}.{$extension}")) {
                 $profile['pp_main_photo'] = "{$upload_dir}photo-{$memberId}.{$extension}";
             }
         }
         // Try and get width and height.
         $dimensions = @getimagesize($upload_dir . 'photo-' . $memberId . '.' . $extension);
         // Add some triple checks.
         $profile['pp_main_width'] = $dimensions[0] ? $dimensions[0] : 1;
         $profile['pp_main_height'] = $dimensions[1] ? $dimensions[1] : 1;
         $profile['pp_thumb_width'] = $dimensions[0] ? $dimensions[0] : 1;
         $profile['pp_thumb_height'] = $dimensions[1] ? $dimensions[1] : 1;
     }
     $profile['pp_photo_type'] = $profile['photo_type'];
     unset($profile['avatar_data']);
     unset($profile['photo_data']);
     unset($profile['photo_filesize']);
     unset($profile['avatar_filesize']);
     unset($profile['photo_type']);
     unset($profile['photo_location']);
     unset($profile['notes']);
     // need to stop fields which have been added by hooks getting through. See ticket 854980 as to why this is needed.
     if (is_array($profile)) {
         // set the fields we're allowed (I can't think of a better way of populating this array unfortunately)
         $allowedFields = array('pp_member_id', 'pp_last_visitors', 'pp_rating_hits', 'pp_rating_value', 'pp_rating_real', 'pp_main_photo', 'pp_main_width', 'pp_main_height', 'pp_thumb_photo', 'pp_thumb_width', 'pp_thumb_height', 'pp_setting_moderate_comments', 'pp_setting_moderate_friends', 'pp_setting_count_friends', 'pp_setting_count_comments', 'pp_setting_count_visitors', 'pp_about_me', 'pp_reputation_points', 'pp_gravatar', 'pp_photo_type', 'signature', 'avatar_location', 'avatar_size', 'avatar_type', 'pconversation_filters', 'fb_photo', 'fb_photo_thumb', 'fb_bwoptions', 'tc_last_sid_import', 'tc_photo', 'tc_bwoptions', 'pp_customization', 'pp_profile_update');
         foreach ($profile as $k => $v) {
             // not in allowed array? unset. (this stops fields from hooks making it through)
             if (!in_array($k, $allowedFields)) {
                 unset($profile[$k]);
             }
         }
     }
     // check if we passed in custom..
     $profileFields = array();
     $profileFields['member_id'] = $memberId;
     if (!empty($custom)) {
         $profileFields = array_merge($profileFields, $custom);
     }
     // First member?
     if ($info['id'] != $this->memberData['member_id']) {
         if ($this->usingExtendedInserts) {
             // Add it to the extended insert array which runs on next()
             $this->extendedInserts['profile_portal'][] = $this->DB->compileInsertString($profile);
             // Custom profile fields
             $this->extendedInserts['pfields_content'][] = $this->DB->compileInsertString($profileFields);
         } else {
             $this->DB->insert('profile_portal', $profile);
             $this->DB->insert('pfields_content', $profileFields);
         }
     } else {
         if ($this->usingExtendedInserts) {
             unset($profileFields['member_id']);
             unset($profile['pp_member_id']);
             $this->DB->update('profile_portal', $profile, "pp_member_id=" . $this->memberData['member_id']);
             $this->DB->update('pfields_content', $profileFields, "member_id=" . $this->memberData['member_id']);
         } else {
             $this->DB->insert('profile_portal', $profile);
             $this->DB->insert('pfields_content', $profileFields);
         }
     }
     // Conversion cycle complete
     return true;
 }
 /**
  * Create new member
  * Very basic functionality at this point.
  *
  * @param	array 	Fields to save in the following format: array( 'members'      => array( 'email'     => '*****@*****.**',
  *																				         'joined'   => time() ),
  *															   'extendedProfile' => array( 'signature' => 'My signature' ) );
  *					Tables: members, pfields_content, profile_portal.
  *					You can also use the aliases: 'core [members]', 'extendedProfile [profile_portal]', and 'customFields [pfields_content]'
  * @param	bool	Flag to attempt to auto create a name if the desired is taken
  * @param	bool	Bypass custom field saving (if using the sso session integration this is required as member object isn't ready yet)
  * @param	bool	Whether or not to recache the stats so as to update the board's last member data
  * @return	array 	Final member Data including member_id
  *
  * EXCEPTION CODES
  * CUSTOM_FIELDS_EMPTY    - Custom fields were not populated
  * CUSTOM_FIELDS_INVALID  - Custom fields were invalid
  * CUSTOM_FIELDS_TOOBIG   - Custom fields too big
  */
 public static function create($tables = array(), $autoCreateName = FALSE, $bypassCfields = FALSE, $doStatsRecache = TRUE)
 {
     //-----------------------------------------
     // INIT
     //-----------------------------------------
     $finalTables = array();
     $password = '';
     $plainPassword = '';
     $bitWiseFields = ipsRegistry::fetchBitWiseOptions('global');
     $md_5_password = '';
     //-----------------------------------------
     // Remap tables if required
     //-----------------------------------------
     foreach ($tables as $table => $data) {
         $_name = isset(self::$remap[$table]) ? self::$remap[$table] : $table;
         if ($_name == 'members') {
             /* Magic password field */
             if (!empty($data['md5_hash_password'])) {
                 $md_5_password = trim($data['md5_hash_password']);
                 $plainPassword = null;
                 unset($data['md5_hash_password']);
             } else {
                 $password = isset($data['password']) ? trim($data['password']) : self::makePassword();
                 $plainPassword = $password;
                 $md_5_password = md5($password);
                 unset($data['password']);
             }
         }
         $finalTables[$_name] = $data;
     }
     //-----------------------------------------
     // Custom profile field stuff
     //-----------------------------------------
     if (!$bypassCfields) {
         $classToLoad = IPSLib::loadLibrary(IPS_ROOT_PATH . 'sources/classes/customfields/profileFields.php', 'customProfileFields');
         $fields = new $classToLoad();
         if (is_array($finalTables['pfields_content']) and count($finalTables['pfields_content'])) {
             $fields->member_data = $finalTables['pfields_content'];
         }
         $fields->initData('edit');
         $fields->parseToSave($finalTables['pfields_content'], 'register');
         /* Check */
         /*if( count( $fields->error_fields['empty'] ) )
         		{
         			throw new Exception( 'CUSTOM_FIELDS_EMPTY' );
         		}
         		
         		if( count( $fields->error_fields['invalid'] ) )
         		{
         			throw new Exception( 'CUSTOM_FIELDS_INVALID' );
         		}
         		
         		if( count( $fields->error_fields['toobig'] ) )
         		{
         			throw new Exception( 'CUSTOM_FIELDS_TOOBIG' );
         		}*/
     }
     //-----------------------------------------
     // Make sure the account doesn't exist
     //-----------------------------------------
     if ($finalTables['members']['email']) {
         if (IPSText::mbstrlen($finalTables['members']['email']) > 150 or strstr($finalTables['members']['email'], ' ')) {
             /* Allow it to be auto created */
             $finalTables['members']['email'] = false;
         } else {
             $existing = IPSMember::load($finalTables['members']['email'], 'all');
             if ($existing['member_id']) {
                 $existing['full'] = true;
                 $existing['timenow'] = time();
                 return $existing;
             }
         }
     }
     //-----------------------------------------
     // Fix up usernames and display names
     //-----------------------------------------
     /* Ensure we have a display name */
     if ($autoCreateName and $finalTables['members']['members_display_name'] !== FALSE) {
         $finalTables['members']['members_display_name'] = $finalTables['members']['members_display_name'] ? $finalTables['members']['members_display_name'] : $finalTables['members']['name'];
     }
     //-----------------------------------------
     // Remove some basic HTML tags
     //-----------------------------------------
     if ($finalTables['members']['members_display_name']) {
         if (IPSText::mbstrlen($finalTables['members']['members_display_name']) > 255) {
             $finalTables['members']['members_display_name'] = false;
         }
         $finalTables['members']['members_display_name'] = str_replace(array('<', '>', '"'), '', $finalTables['members']['members_display_name']);
     }
     if ($finalTables['members']['name']) {
         if (IPSText::mbstrlen($finalTables['members']['name']) > 255) {
             $finalTables['members']['name'] = false;
         }
         $finalTables['members']['name'] = str_replace(array('<', '>', '"'), '', $finalTables['members']['name']);
     }
     //-----------------------------------------
     // Make sure the names are unique
     //-----------------------------------------
     /* Can specify display name of FALSE to force no entry to force partial member */
     if ($finalTables['members']['members_display_name'] !== FALSE) {
         try {
             if (IPSMember::getFunction()->checkNameExists($finalTables['members']['members_display_name'], array(), 'members_display_name', true) === true) {
                 if ($autoCreateName === TRUE) {
                     /* Now, make sure we have a unique display name */
                     $max = ipsRegistry::DB()->buildAndFetch(array('select' => 'MAX(member_id) as max', 'from' => 'members', 'where' => "members_l_display_name LIKE '" . ipsRegistry::DB()->addSlashes(strtolower($finalTables['members']['members_display_name'])) . "%'"));
                     if ($max['max']) {
                         $_num = $max['max'] + 1;
                         $finalTables['members']['members_display_name'] = $finalTables['members']['members_display_name'] . '_' . $_num;
                     }
                 } else {
                     $finalTables['members']['members_display_name'] = '';
                 }
             }
         } catch (Exception $e) {
         }
     }
     if ($finalTables['members']['name']) {
         try {
             if (IPSMember::getFunction()->checkNameExists($finalTables['members']['name'], array(), 'name', true) === true) {
                 if ($autoCreateName === TRUE) {
                     /* Now, make sure we have a unique username */
                     $max = ipsRegistry::DB()->buildAndFetch(array('select' => 'MAX(member_id) as max', 'from' => 'members', 'where' => "members_l_username LIKE '" . ipsRegistry::DB()->addSlashes(strtolower($finalTables['members']['name'])) . "%'"));
                     if ($max['max']) {
                         $_num = $max['max'] + 1;
                         $finalTables['members']['name'] = $finalTables['members']['name'] . '_' . $_num;
                     }
                 } else {
                     $finalTables['members']['name'] = '';
                 }
             }
         } catch (Exception $e) {
         }
     }
     //-----------------------------------------
     // Clean up characters
     //-----------------------------------------
     if ($finalTables['members']['name']) {
         $userName = IPSMember::getFunction()->cleanAndCheckName($finalTables['members']['name'], array(), 'name');
         if ($userName['errors']) {
             $finalTables['members']['name'] = $finalTables['members']['email'];
         } else {
             $finalTables['members']['name'] = $userName['username'];
         }
     }
     if ($finalTables['members']['members_display_name']) {
         $displayName = IPSMember::getFunction()->cleanAndCheckName($finalTables['members']['members_display_name']);
         if ($displayName['errors']) {
             $finalTables['members']['members_display_name'] = '';
         } else {
             $finalTables['members']['members_display_name'] = $displayName['members_display_name'];
         }
     }
     //-----------------------------------------
     // Populate member table(s)
     //-----------------------------------------
     $finalTables['members']['members_l_username'] = isset($finalTables['members']['name']) ? strtolower($finalTables['members']['name']) : '';
     $finalTables['members']['joined'] = $finalTables['members']['joined'] ? $finalTables['members']['joined'] : time();
     $finalTables['members']['email'] = $finalTables['members']['email'] ? $finalTables['members']['email'] : $finalTables['members']['name'] . '@' . $finalTables['members']['joined'];
     $finalTables['members']['member_group_id'] = $finalTables['members']['member_group_id'] ? $finalTables['members']['member_group_id'] : ipsRegistry::$settings['member_group'];
     $finalTables['members']['ip_address'] = $finalTables['members']['ip_address'] ? $finalTables['members']['ip_address'] : ipsRegistry::member()->ip_address;
     $finalTables['members']['members_created_remote'] = intval($finalTables['members']['members_created_remote']);
     $finalTables['members']['member_login_key'] = IPSMember::generateAutoLoginKey();
     $finalTables['members']['member_login_key_expire'] = ipsRegistry::$settings['login_key_expire'] ? time() + intval(ipsRegistry::$settings['login_key_expire']) * 86400 : 0;
     $finalTables['members']['view_sigs'] = 1;
     $finalTables['members']['bday_day'] = intval($finalTables['members']['bday_day']);
     $finalTables['members']['bday_month'] = intval($finalTables['members']['bday_month']);
     $finalTables['members']['bday_year'] = intval($finalTables['members']['bday_year']);
     $finalTables['members']['restrict_post'] = intval($finalTables['members']['restrict_post']);
     $finalTables['members']['auto_track'] = $finalTables['members']['auto_track'] ? $finalTables['members']['auto_track'] : ipsRegistry::$settings['auto_track_method'];
     $finalTables['members']['msg_count_total'] = 0;
     $finalTables['members']['msg_count_new'] = 0;
     $finalTables['members']['msg_show_notification'] = 1;
     $finalTables['members']['coppa_user'] = 0;
     $finalTables['members']['auto_track'] = substr($finalTables['members']['auto_track'], 0, 50);
     $finalTables['members']['last_visit'] = $finalTables['members']['last_visit'] ? $finalTables['members']['last_visit'] : time();
     $finalTables['members']['last_activity'] = $finalTables['members']['last_activity'] ? $finalTables['members']['last_activity'] : time();
     $finalTables['members']['language'] = $finalTables['members']['language'] ? $finalTables['members']['language'] : IPSLib::getDefaultLanguage();
     $finalTables['members']['member_uploader'] = ipsRegistry::$settings['uploadFormType'] ? 'flash' : 'default';
     $finalTables['members']['members_pass_salt'] = IPSMember::generatePasswordSalt(5);
     $finalTables['members']['members_pass_hash'] = IPSMember::generateCompiledPasshash($finalTables['members']['members_pass_salt'], $md_5_password);
     $finalTables['members']['members_display_name'] = isset($finalTables['members']['members_display_name']) ? $finalTables['members']['members_display_name'] : '';
     $finalTables['members']['members_l_display_name'] = isset($finalTables['members']['members_display_name']) ? strtolower($finalTables['members']['members_display_name']) : '';
     $finalTables['members']['fb_uid'] = isset($finalTables['members']['fb_uid']) ? $finalTables['members']['fb_uid'] : 0;
     $finalTables['members']['fb_emailhash'] = isset($finalTables['members']['fb_emailhash']) ? strtolower($finalTables['members']['fb_emailhash']) : '';
     $finalTables['members']['members_seo_name'] = IPSText::makeSeoTitle($finalTables['members']['members_display_name']);
     $finalTables['members']['bw_is_spammer'] = intval($finalTables['members']['bw_is_spammer']);
     //-----------------------------------------
     // Insert: MEMBERS
     //-----------------------------------------
     ipsRegistry::DB()->setDataType(array('name', 'members_l_username', 'members_display_name', 'members_l_display_name', 'members_seo_name', 'email'), 'string');
     /* Bitwise options */
     if (is_array($bitWiseFields['members'])) {
         $_freeze = array();
         foreach ($bitWiseFields['members'] as $field) {
             if (isset($finalTables['members'][$field])) {
                 /* Add to freezeable array */
                 $_freeze[$field] = $finalTables['members'][$field];
                 /* Remove it from the fields to save to DB */
                 unset($finalTables['members'][$field]);
             }
         }
         if (count($_freeze)) {
             $finalTables['members']['members_bitoptions'] = IPSBWOptions::freeze($_freeze, 'members', 'global');
         }
     }
     ipsRegistry::DB()->insert('members', $finalTables['members']);
     //-----------------------------------------
     // Get the member id
     //-----------------------------------------
     $finalTables['members']['member_id'] = ipsRegistry::DB()->getInsertId();
     //-----------------------------------------
     // Insert: PROFILE PORTAL
     //-----------------------------------------
     $finalTables['profile_portal']['pp_member_id'] = $finalTables['members']['member_id'];
     $finalTables['profile_portal']['pp_setting_count_friends'] = 1;
     $finalTables['profile_portal']['pp_setting_count_comments'] = 1;
     $finalTables['profile_portal']['pp_setting_count_visitors'] = 1;
     $finalTables['profile_portal']['pp_customization'] = serialize(array());
     foreach (array('pp_last_visitors', 'pp_about_me', 'signature', 'fb_photo', 'fb_photo_thumb', 'pconversation_filters') as $f) {
         $finalTables['profile_portal'][$f] = $finalTables['profile_portal'][$f] ? $finalTables['profile_portal'][$f] : '';
     }
     ipsRegistry::DB()->insert('profile_portal', $finalTables['profile_portal']);
     //-----------------------------------------
     // Insert into the custom profile fields DB
     //-----------------------------------------
     if (!$bypassCfields) {
         /* Check the website url field */
         $website_field = $fields->getFieldIDByKey('website');
         if ($website_field && $fields->out_fields['field_' . $website_field]) {
             if (stristr($fields->out_fields['field_' . $website_field], 'http://') === FALSE && stristr($fields->out_fields['field_' . $website_field], 'https://') === FALSE) {
                 $fields->out_fields['field_' . $website_field] = 'http://' . $fields->out_fields['field_' . $website_field];
             }
         }
         $fields->out_fields['member_id'] = $finalTables['members']['member_id'];
         ipsRegistry::DB()->delete('pfields_content', 'member_id=' . $finalTables['members']['member_id']);
         ipsRegistry::DB()->insert('pfields_content', $fields->out_fields);
     } else {
         ipsRegistry::DB()->delete('pfields_content', 'member_id=' . $finalTables['members']['member_id']);
         ipsRegistry::DB()->insert('pfields_content', array('member_id' => $finalTables['members']['member_id']));
     }
     //-----------------------------------------
     // Insert into partial ID table
     //-----------------------------------------
     $full_account = false;
     if ($finalTables['members']['members_display_name'] and $finalTables['members']['name'] and $finalTables['members']['email'] and $finalTables['members']['email'] != $finalTables['members']['name'] . '@' . $finalTables['members']['joined']) {
         $full_account = true;
     }
     if (!$full_account) {
         ipsRegistry::DB()->insert('members_partial', array('partial_member_id' => $finalTables['members']['member_id'], 'partial_date' => $finalTables['members']['joined'], 'partial_email_ok' => $finalTables['members']['email'] == $finalTables['members']['name'] . '@' . $finalTables['members']['joined'] ? 0 : 1));
     }
     /* Add plain password and run sync */
     $finalTables['members']['plainPassword'] = $plainPassword;
     IPSLib::runMemberSync('onCreateAccount', $finalTables['members']);
     /* Remove plain password */
     unset($finalTables['members']['plainPassword']);
     //-----------------------------------------
     // Recache our stats (Ticket 627608)
     //-----------------------------------------
     if ($doStatsRecache == TRUE) {
         ipsRegistry::cache()->rebuildCache('stats', 'global');
     }
     return array_merge($finalTables['members'], $finalTables['profile_portal'], !$bypassCfields ? $fields->out_fields : array(), array('timenow' => $finalTables['members']['joined'], 'full' => $full_account));
 }