$timezone_nice) { $timezone_list.=''; // XHTMLXHTML //$timezone_list->attach(do_template('OCF_AUTO_TIME_ZONE_ENTRY',array('HOUR'=>date('H',tz_time($time_now,$_timezone)),'DW'=>date('w',tz_time(time(),$_timezone)),'NAME'=>$_timezone,'SELECTED'=>($timezone==$_timezone),'CLASS'=>'','TEXT'=>$timezone_nice))); } return make_string_tempcode($timezone_list); } /** * Validate an IP address, indirectly by passing through a confirmation code. */ function validate_ip_script() { @ob_end_clean(); global $EXTRA_HEAD; $EXTRA_HEAD->attach(''); // XHTMLXHTML $keep=keep_symbol(array('1')); $code=either_param('code',''); if ($code=='') { $title=get_screen_title('CONFIRM'); require_code('form_templates'); $fields=new ocp_tempcode(); $fields->attach(form_input_codename(do_lang_tempcode('CODE'),'','code','',true)); $submit_name=do_lang_tempcode('PROCEED'); $url=find_script('validateip').$keep; $middle=do_template('FORM_SCREEN',array('_GUID'=>'d92ce4ec82dc709f920a4ce6760778de','TITLE'=>$title,'SKIP_VALIDATION'=>true,'HIDDEN'=>'','URL'=>$url,'FIELDS'=>$fields,'TEXT'=>do_lang_tempcode('MISSING_CONFIRM_CODE'),'SUBMIT_NAME'=>$submit_name)); $echo=globalise($middle,NULL,'',true); $echo->evaluate_echo(); exit(); } // If we're still here, we're ok to go require_lang('ocf'); $test=$GLOBALS['FORUM_DB']->query_value_null_ok('f_member_known_login_ips','i_val_code',array('i_val_code'=>$code)); if (is_null($test)) warn_exit(do_lang_tempcode('ALREADY_VALIDATED')); $GLOBALS['FORUM_DB']->query_update('f_member_known_login_ips',array('i_val_code'=>''),array('i_val_code'=>$code),'',1); $title=get_screen_title('CONFIRM'); $middle=redirect_screen($title,get_base_url().$keep,do_lang_tempcode('SUCCESS')); $echo=globalise($middle,NULL,'',true); $echo->evaluate_echo(); exit(); } /** * If we are using human names for usernames, a conflict is likely. Store a suffixed variety. Maybe later ocP will strip these suffixes out in some contexts. * * @param SHORT_TEXT The desired human name for the member profile. * @return SHORT_TEXT A unique username. */ function get_username_from_human_name($username) { $username=preg_replace('# \(\d+\)$#','',$username); $_username=$username; $i=1; do { $test=$GLOBALS['FORUM_DB']->query_value_null_ok('f_members','id',array('m_username'=>$_username)); if (!is_null($test)) { $i++; $_username=$username.' ('.strval($i).')'; } } while (!is_null($test)); $username=$_username; return $username; } /** * Get a form for finishing off a member profile (such as for LDAP or httpauth, where a partial profile is automatically made, but needs completion). * * @param SHORT_TEXT The username for the member profile. * @param ID_TEXT The type of member profile we are finishing off. * @param string Auto-detected e-mail address (blank: none) * @param ?integer Auto-detected DOB day (NULL: unknown) * @param ?integer Auto-detected DOB month (NULL: unknown) * @param ?integer Auto-detected DOB year (NULL: unknown) * @param ?ID_TEXT Auto-detected Timezone (NULL: unknown) * @param ?ID_TEXT Auto-detected Language (NULL: unknown) * @return tempcode The form. */ function ocf_member_external_linker_ask($username,$type,$email_address='',$dob_day=NULL,$dob_month=NULL,$dob_year=NULL,$timezone=NULL,$language=NULL) { // If somehow, we're not fully started up, or in a messy state require_code('urls'); @ob_end_clean(); if (!function_exists('do_header')) require_code('site'); $title=get_screen_title('FINISH_PROFILE'); if ($username!='') $username=get_username_from_human_name($username); list($fields,$hidden)=ocf_get_member_fields(true,NULL,NULL,$email_address,1,$dob_day,$dob_month,$dob_year,$timezone,NULL,NULL,1,0,NULL,$language,1,1,1,NULL,$username,0,$type); $hidden->attach(build_keep_post_fields()); $hidden->attach(form_input_hidden('finishing_profile','1')); $text=do_lang_tempcode('ENTER_PROFILE_DETAILS_FINISH'); $submit_name=do_lang_tempcode('PROCEED'); $url=get_self_url(); return do_template('FORM_SCREEN',array('_GUID'=>'f3fa74f4842f3660f0831f8d708d256d','HIDDEN'=>$hidden,'TITLE'=>$title,'FIELDS'=>$fields,'TEXT'=>$text,'SUBMIT_NAME'=>$submit_name,'URL'=>$url)); } /** * Finishing off of a member profile (such as for LDAP or httpauth, where a partial profile is automatically made, but needs completion). * * @param SHORT_TEXT The username for the member profile. * @param SHORT_TEXT The password for the member profile. * @param ID_TEXT The type of member profile we are finishing off. * @param boolean Whether to check for duplicated email addresses. * @param string Auto-detected e-mail address (blank: none) * @param ?integer Auto-detected DOB day (NULL: unknown) * @param ?integer Auto-detected DOB month (NULL: unknown) * @param ?integer Auto-detected DOB year (NULL: unknown) * @param ?ID_TEXT Auto-detected Timezone (NULL: unknown) * @param ?ID_TEXT Auto-detected Language (NULL: unknown) * @param ?URLPATH The URL to the member's avatar (blank: none) (NULL: choose one automatically). * @param URLPATH The URL to the member's photo (blank: none). * @param URLPATH The URL to the member's photo thumbnail (blank: none). * @return MEMBER The member ID for the finished off profile. */ function ocf_member_external_linker($username,$password,$type,$email_check=true,$email_address='',$dob_day=NULL,$dob_month=NULL,$dob_year=NULL,$timezone=NULL,$language=NULL,$avatar_url=NULL,$photo_url='',$photo_thumb_url='') { // Read in data $email_address=trim(post_param('email_address',$email_address)); $dob_day=post_param_integer('dob_day',$dob_day); $dob_month=post_param_integer('dob_month',$dob_month); $dob_year=post_param_integer('dob_year',$dob_year); $reveal_age=post_param_integer('reveal_age',0); // For default privacy, default off require_code('temporal'); if (is_null($timezone)) $timezone=get_site_timezone(); $timezone=post_param('timezone',$timezone); if (is_null($language)) $language=get_site_default_lang(); $language=post_param('language',$language); $allow_emails=post_param_integer('allow_emails',0); // For default privacy, default off $allow_emails_from_staff=post_param_integer('allow_emails_from_staff',0); // For default privacy, default off require_code('ocf_groups'); $custom_fields=ocf_get_all_custom_fields_match(ocf_get_all_default_groups(true),NULL,NULL,NULL,NULL,NULL,NULL,0,true); $actual_custom_fields=ocf_read_in_custom_fields($custom_fields); foreach ($actual_custom_fields as $key=>$val) { if ($val==STRING_MAGIC_NULL) $actual_custom_fields[$key]=''; } $groups=ocf_get_all_default_groups(true); // $groups will contain the built in default primary group too (it is not $secondary_groups) $primary_group=post_param_integer('primary_group',NULL); if (($primary_group!==NULL) && (!in_array($primary_group,$groups)/*= not built in default, which is automatically ok to join without extra security*/)) { // Check security $test=$GLOBALS['FORUM_DB']->query_value('f_groups','g_is_presented_at_install',array('id'=>$primary_group)); if ($test==1) { $groups=ocf_get_all_default_groups(false); // Get it so it does not include the built in default primary group $groups[]=$primary_group; // And add in the *chosen* primary group } else $primary_group=NULL; } else $primary_group=NULL; if ($primary_group===NULL) // Security error, or built in default (which will already be in $groups) { $primary_group=get_first_default_group(); } // Check that the given address isn't already used (if one_per_email_address on) if ((get_option('one_per_email_address')=='1') && ($email_address!='') && ($email_check)) { $test=$GLOBALS['FORUM_DB']->query_value_null_ok('f_members','m_username',array('m_email_address'=>$email_address)); if (!is_null($test)) { global $MEMBER_CACHED; $MEMBER_CACHED=db_get_first_id(); $reset_url=build_url(array('page'=>'lostpassword','email_address'=>$email_address),get_module_zone('lostpassword')); warn_exit(do_lang_tempcode('EMAIL_ADDRESS_IN_USE',escape_html(get_site_name()),escape_html($reset_url->evaluate()))); } } // Add member require_code('ocf_members_action'); $ret=ocf_make_member($username,$password,$email_address,$groups,$dob_day,$dob_month,$dob_year,$actual_custom_fields,$timezone,NULL,1,time(),time(),'',$avatar_url,'',0,1,$reveal_age,'',$photo_url,$photo_thumb_url,1,1,$language,$allow_emails,$allow_emails_from_staff,'',get_ip_address(),'',false,$type,''); return $ret; } /** * Read in the custom profile field POST data. * * @param array The CPF field rows that we'll be reading in the member's values for. * @param ?MEMBER Member involved (NULL: new member) * @return array The CPF data. */ function ocf_read_in_custom_fields($custom_fields,$member_id=NULL) { require_code('fields'); $actual_custom_fields=array(); foreach ($custom_fields as $custom_field) { $ob=get_fields_hook($custom_field['cf_type']); $old_value=is_null($member_id)?NULL:$GLOBALS['FORUM_DB']->query_value('f_member_custom_fields','field_'.strval($custom_field['id']),array('mf_member_id'=>$member_id)); $new_value=$ob->inputted_to_field_value(true,$custom_field,'uploads/ocf_cpf_upload',$old_value); $actual_custom_fields[$custom_field['id']]=$new_value; } return $actual_custom_fields; } /** * Get form fields for adding/editing/finishing a member profile. * * @param boolean Whether we are only handling the essential details of a profile. * @param ?MEMBER The ID of the member we are handling (NULL: new member). * @param ?array A list of usergroups (NULL: default/current usergroups). * @param SHORT_TEXT The e-mail address. * @param BINARY Whether posts are previewed before they are made. * @param ?integer Day of date of birth (NULL: not known). * @param ?integer Month of date of birth (NULL: not known). * @param ?integer Year of date of birth (NULL: not known). * @param ?ID_TEXT The member timezone (NULL: site default). * @param ?array A map of custom fields values (field-id=>value) (NULL: not known). * @param ?ID_TEXT The members default theme (NULL: not known). * @param BINARY Whether the members age may be shown. * @param BINARY Whether the member sees signatures in posts. * @param ?BINARY Whether the member automatically is enabled for notifications for content they contribute to (NULL: get default from config). * @param ?LANGUAGE_NAME The members language (NULL: auto detect). * @param BINARY Whether the member allows e-mails via the site. * @param BINARY Whether the member allows e-mails from staff via the site. * @param BINARY Whether the profile has been validated. * @param ?GROUP The members primary (NULL: not known). * @param SHORT_TEXT The username. * @param BINARY Whether the member is permanently banned. * @param ID_TEXT The special type of profile this is (blank: not a special type). * @param BINARY Whether the member likes to view zones without menus, when a choice is available. * @param BINARY Whether the member username will be highlighted. * @param SHORT_TEXT Usergroups that may PT the member. * @param LONG_TEXT Rules that other members must agree to before they may start a PT with the member. * @param ?TIME When the member is on probation until (NULL: just finished probation / or effectively was never on it) * @return array A pair: The form fields, Hidden fields (both Tempcode). */ function ocf_get_member_fields($mini_mode=true,$member_id=NULL,$groups=NULL,$email_address='',$preview_posts=0,$dob_day=NULL,$dob_month=NULL,$dob_year=NULL,$timezone=NULL,$custom_fields=NULL,$theme=NULL,$reveal_age=1,$views_signatures=1,$auto_monitor_contrib_content=NULL,$language=NULL,$allow_emails=1,$allow_emails_from_staff=1,$validated=1,$primary_group=NULL,$username='',$is_perm_banned=0,$special_type='',$zone_wide=1,$highlighted_name=0,$pt_allow='*',$pt_rules_text='',$on_probation_until=NULL) { $fields=new ocp_tempcode(); $hidden=new ocp_tempcode(); list($_fields,$_hidden)=ocf_get_member_fields_settings($mini_mode,$member_id,$groups,$email_address,$preview_posts,$dob_day,$dob_month,$dob_year,$timezone,$theme,$reveal_age,$views_signatures,$auto_monitor_contrib_content,$language,$allow_emails,$allow_emails_from_staff,$validated,$primary_group,$username,$is_perm_banned,$special_type,$zone_wide,$highlighted_name,$pt_allow,$pt_rules_text,$on_probation_until); $fields->attach($_fields); $hidden->attach($_hidden); if (!$mini_mode) $fields->attach(do_template('FORM_SCREEN_FIELD_SPACER',array('TITLE'=>do_lang_tempcode('PROFILE')))); list($_fields,$_hidden)=ocf_get_member_fields_profile($mini_mode,$member_id,$groups,$custom_fields); $fields->attach($_fields); $hidden->attach($_hidden); return array($fields,$hidden); } /** * Get form fields for adding/editing/finishing a member profile. * * @param boolean Whether we are only handling the essential details of a profile. * @param ?MEMBER The ID of the member we are handling (NULL: new member). * @param ?array A list of usergroups (NULL: default/current usergroups). * @param SHORT_TEXT The e-mail address. * @param BINARY Whether posts are previewed before they are made. * @param ?integer Day of date of birth (NULL: not known). * @param ?integer Month of date of birth (NULL: not known). * @param ?integer Year of date of birth (NULL: not known). * @param ?ID_TEXT The member timezone (NULL: site default). * @param ?ID_TEXT The members default theme (NULL: not known). * @param BINARY Whether the members age may be shown. * @param BINARY Whether the member sees signatures in posts. * @param ?BINARY Whether the member automatically is enabled for notifications for content they contribute to (NULL: get default from config). * @param ?LANGUAGE_NAME The members language (NULL: auto detect). * @param BINARY Whether the member allows e-mails via the site. * @param BINARY Whether the member allows e-mails from staff via the site. * @param BINARY Whether the profile has been validated. * @param ?GROUP The members primary (NULL: not known). * @param SHORT_TEXT The username. * @param BINARY Whether the member is permanently banned. * @param ID_TEXT The special type of profile this is (blank: not a special type). * @param BINARY Whether the member likes to view zones without menus, when a choice is available. * @param BINARY Whether the member username will be highlighted. * @param SHORT_TEXT Usergroups that may PT the member. * @param LONG_TEXT Rules that other members must agree to before they may start a PT with the member. * @param ?TIME When the member is on probation until (NULL: just finished probation / or effectively was never on it) * @return array A pair: The form fields, Hidden fields (both Tempcode). */ function ocf_get_member_fields_settings($mini_mode=true,$member_id=NULL,$groups=NULL,$email_address='',$preview_posts=0,$dob_day=NULL,$dob_month=NULL,$dob_year=NULL,$timezone=NULL,$theme=NULL,$reveal_age=1,$views_signatures=1,$auto_monitor_contrib_content=NULL,$language=NULL,$allow_emails=1,$allow_emails_from_staff=1,$validated=1,$primary_group=NULL,$username='',$is_perm_banned=0,$special_type='',$zone_wide=1,$highlighted_name=0,$pt_allow='*',$pt_rules_text='',$on_probation_until=NULL) { require_code('ocf_field_editability'); if (is_null($auto_monitor_contrib_content)) { $auto_monitor_contrib_content=(get_value('no_auto_notifications')==='1')?0:1; } $hidden=new ocp_tempcode(); if (has_actual_page_access(get_member(),'admin_ocf_join')) { $dob_optional=true; } else { $dob_optional=(get_option('no_dob_ask')=='2'); } if ($member_id===$GLOBALS['OCF_DRIVER']->get_guest_id()) fatal_exit(do_lang_tempcode('INTERNAL_ERROR')); require_code('form_templates'); require_code('encryption'); if (($special_type=='') && (!is_null($member_id))) { if (ocf_is_ldap_member($member_id)) $special_type='ldap'; if (ocf_is_httpauth_member($member_id)) $special_type='httpauth'; $special_type=$GLOBALS['FORUM_DRIVER']->get_member_row_field($member_id,'m_password_compat_scheme'); } if (is_null($groups)) $groups=is_null($member_id)?ocf_get_all_default_groups(true):$GLOBALS['OCF_DRIVER']->get_members_groups($member_id); $fields=new ocp_tempcode(); // Human name / Username if (ocf_field_editable('username',$special_type)) { if ((is_null($member_id)) || (has_actual_page_access(get_member(),'admin_ocf_join')) || (has_specific_permission($member_id,'rename_self'))) { if (get_option('signup_fullname')=='1') { $fields->attach(form_input_line(do_lang_tempcode('NAME'),do_lang_tempcode('_DESCRIPTION_NAME'),is_null($member_id)?'username':'edit_username',$username,true)); } else { $prohibit_username_whitespace=get_option('prohibit_username_whitespace',true); if ($prohibit_username_whitespace=='1') { $fields->attach(form_input_codename(do_lang_tempcode('USERNAME'),do_lang_tempcode('DESCRIPTION_USERNAME'),is_null($member_id)?'username':'edit_username',$username,true)); } else { $fields->attach(form_input_line(do_lang_tempcode('USERNAME'),do_lang_tempcode('DESCRIPTION_USERNAME'),is_null($member_id)?'username':'edit_username',$username,true)); } } } } // Password if (ocf_field_editable('password',$special_type)) { if ((is_null($member_id)) || ($member_id==get_member()) || (has_specific_permission(get_member(),'assume_any_member'))) { $fields->attach(form_input_password(do_lang_tempcode('PASSWORD'),do_lang_tempcode('DESCRIPTION_PASSWORD'.(!is_null($member_id)?'_EDIT':'')),is_null($member_id)?'password':'edit_password',$mini_mode)); $fields->attach(form_input_password(do_lang_tempcode('CONFIRM_PASSWORD'),'','password_confirm',$mini_mode)); } } // E-mail address if (ocf_field_editable('email',$special_type)) { if ($email_address=='') $email_address=trim(get_param('email_address','')); $fields->attach(form_input_email(do_lang_tempcode('EMAIL_ADDRESS'),(get_option('skip_email_confirm_join')=='1')?new ocp_tempcode():do_lang_tempcode('MUST_BE_REAL_ADDRESS'),'email_address',$email_address,!has_specific_permission(get_member(),'member_maintenance'))); if ((is_null($member_id)) && ($email_address=='') && (get_option('skip_email_confirm_join')=='0')) { $fields->attach(form_input_email(do_lang_tempcode('CONFIRM_EMAIL_ADDRESS'),'','email_address_confirm','',!has_specific_permission(get_member(),'member_maintenance'))); } } // DOB if (ocf_field_editable('dob',$special_type)) { $default_time=is_null($dob_month)?NULL:usertime_to_utctime(mktime(0,0,0,$dob_month,$dob_day,$dob_year)); if (get_option('no_dob_ask')!='1') { $fields->attach(form_input_date(do_lang_tempcode((get_option('no_dob_ask')=='2')?'BIRTHDAY':'DATE_OF_BIRTH'),'','dob',$dob_optional,false,false,$default_time,-130)); if (addon_installed('ocf_forum')) { $fields->attach(form_input_tick(do_lang_tempcode('RELATED_FIELD',do_lang_tempcode('REVEAL_AGE')),do_lang_tempcode('DESCRIPTION_REVEAL_AGE'),'reveal_age',$reveal_age==1)); } } } // Work out what options we need to present $doing_international=(get_option('allow_international')=='1'); $_langs=find_all_langs(); $doing_langs=multi_lang(); $doing_email_option=(get_option('allow_email_disable')=='1'); $doing_email_from_staff_option=(get_option('allow_email_from_staff_disable')=='1'); $unspecced_width_zone_exists=$GLOBALS['SITE_DB']->query_value_null_ok('zones','zone_name',array('zone_wide'=>NULL)); $unspecced_theme_zone_exists=$GLOBALS['SITE_DB']->query_value_null_ok_full('SELECT COUNT(*) FROM '.get_table_prefix().'zones WHERE '.db_string_equal_to('zone_theme','').' OR '.db_string_equal_to('zone_theme','-1')); $doing_wide_option=(!is_null($unspecced_width_zone_exists)) && (!$mini_mode); $doing_theme_option=($unspecced_theme_zone_exists!=0) && (!$mini_mode); $doing_local_forum_options=(addon_installed('ocf_forum')) && (!$mini_mode); if (($doing_international) || ($doing_langs) || ($doing_email_option) || ($doing_wide_option) || ($doing_theme_option) || ($doing_local_forum_options)) $fields->attach(do_template('FORM_SCREEN_FIELD_SPACER',array('FORCE_OPEN'=>is_null($member_id)?true:NULL,'TITLE'=>do_lang_tempcode('SETTINGS')))); require_lang('config'); // Timezones, if enabled if ($doing_international) { $timezone_list=nice_get_timezone_list($timezone); $fields->attach(form_input_list(do_lang_tempcode('TIME_ZONE'),do_lang_tempcode('DESCRIPTION_TIMEZONE_MEMBER'),'timezone',$timezone_list)); } // Language choice, if we have multiple languages on site if ($doing_langs) { $lang_list=new ocp_tempcode(); $no_lang_set=(is_null($language)) || ($language==''); $allow_no_lang_set=(get_value('allow_no_lang_selection')==='1'); if ($allow_no_lang_set) { $lang_list->attach(form_input_list_entry('',$no_lang_set,do_lang_tempcode('UNSET'))); } else { if ($no_lang_set) $language=user_lang(); } $lang_list->attach(nice_get_langs($language)); $fields->attach(form_input_list(do_lang_tempcode('LANGUAGE'),'','language',$lang_list,NULL,false,!$allow_no_lang_set)); } // Email privacy if ($doing_email_option) $fields->attach(form_input_tick(do_lang_tempcode('ALLOW_EMAILS'),do_lang_tempcode('DESCRIPTION_ALLOW_EMAILS'),'allow_emails',$allow_emails==1)); if ($doing_email_from_staff_option) $fields->attach(form_input_tick(do_lang_tempcode('ALLOW_EMAILS_FROM_STAFF'),do_lang_tempcode('DESCRIPTION_ALLOW_EMAILS_FROM_STAFF'),'allow_emails_from_staff',$allow_emails_from_staff==1)); if (!$mini_mode) { // Wide-option, if we have any zones giving a choice require_lang('zones'); if ($doing_wide_option) { $fields->attach(form_input_tick(do_lang_tempcode('WIDE'),do_lang_tempcode('DESCRIPTION_MEMBER_ZONE_WIDE'),'zone_wide',$zone_wide==1)); } // Theme, if we have any zones giving a choice require_code('themes2'); $entries=nice_get_themes($theme,false,false,'RELY_SITE_DEFAULT'); require_lang('themes'); if ($doing_theme_option) { $fields->attach(form_input_list(do_lang_tempcode('THEME'),do_lang_tempcode('DESCRIPTION_THEME'),'theme',$entries)); } // Various forum options if (addon_installed('ocf_forum')) { if (get_option('forced_preview_option')=='1') $fields->attach(form_input_tick(do_lang_tempcode('PREVIEW_POSTS'),do_lang_tempcode('DESCRIPTION_PREVIEW_POSTS'),'preview_posts',$preview_posts==1)); if (get_value('disable_views_sigs_option')!=='1') { if (addon_installed('ocf_signatures')) $fields->attach(form_input_tick(do_lang_tempcode('VIEWS_SIGNATURES'),do_lang_tempcode('DESCRIPTION_VIEWS_SIGNATURES'),'views_signatures',$views_signatures==1)); } else { $hidden->attach(form_input_hidden('views_signatures','1')); } //$fields->attach(form_input_tick(do_lang_tempcode('AUTO_NOTIFICATION_CONTRIB_CONTENT'),do_lang_tempcode('DESCRIPTION_AUTO_NOTIFICATION_CONTRIB_CONTENT'),'auto_monitor_contrib_content',$auto_monitor_contrib_content==1)); $usergroup_list=new ocp_tempcode(); $lgroups=$GLOBALS['OCF_DRIVER']->get_usergroup_list(true,true); foreach ($lgroups as $key=>$val) { if ($key!=db_get_first_id()) $usergroup_list->attach(form_input_list_entry(strval($key),($pt_allow=='*') || count(array_intersect(array(strval($key)),explode(',',$pt_allow)))!=0,$val)); } if (get_value('disable_pt_restrict')!=='1') { $fields->attach(form_input_multi_list(do_lang_tempcode('PT_ALLOW'),addon_installed('chat')?do_lang_tempcode('PT_ALLOW_DESCRIPTION_CHAT'):do_lang_tempcode('PT_ALLOW_DESCRIPTION'),'pt_allow',$usergroup_list)); $fields->attach(form_input_text_comcode(do_lang_tempcode('PT_RULES_TEXT'),do_lang_tempcode('PT_RULES_TEXT_DESCRIPTION'),'pt_rules_text',$pt_rules_text,false)); } } // Prepare list of usergroups, if maybe we are gonna let (a) usergroup-change field(s) $group_count=$GLOBALS['FORUM_DB']->query_value('f_groups','COUNT(*)'); $rows=$GLOBALS['FORUM_DB']->query_select('f_groups',array('id','g_name','g_hidden','g_open_membership'),($group_count>200)?array('g_is_private_club'=>0):NULL,'ORDER BY g_order'); $_groups=new ocp_tempcode(); $default_primary_group=get_first_default_group(); $current_primary_group=NULL; foreach ($rows as $group) { if ($group['id']!=db_get_first_id()) { $selected=($group['id']==$primary_group) || (is_null($primary_group) && ($group['id']==$default_primary_group)); if ($selected) $current_primary_group=$group['id']; $_groups->attach(form_input_list_entry(strval($group['id']),$selected,get_translated_text($group['g_name'],$GLOBALS['FORUM_DB']))); } } // Some admin options... if (has_specific_permission(get_member(),'member_maintenance')) { $fields->attach(do_template('FORM_SCREEN_FIELD_SPACER',array('TITLE'=>do_lang_tempcode('MEMBER_ACCESS')))); // Probation if (has_specific_permission(get_member(),'probate_members')) { $fields->attach(form_input_date(do_lang_tempcode('ON_PROBATION_UNTIL'),do_lang_tempcode('DESCRIPTION_ON_PROBATION_UNTIL'),'on_probation_until',true,is_null($on_probation_until) || $on_probation_until<=time(),true,$on_probation_until,2)); } // Primary usergroup if (ocf_field_editable('primary_group',$special_type)) { if (has_specific_permission(get_member(),'assume_any_member')) { if ((is_null($member_id)) || (!$GLOBALS['FORUM_DRIVER']->is_super_admin($member_id)) || (count($GLOBALS['FORUM_DRIVER']->member_group_query($GLOBALS['FORUM_DRIVER']->get_super_admin_groups(),2))>1)) $fields->attach(form_input_list(do_lang_tempcode('PRIMARY_GROUP'),do_lang_tempcode('DESCRIPTION_PRIMARY_GROUP'),'primary_group',$_groups)); } } } // Secondary usergroups if (ocf_field_editable('secondary_groups',$special_type)) { $_groups2=new ocp_tempcode(); $members_groups=is_null($member_id)?array():ocf_get_members_groups($member_id,false,false,false); foreach ($rows as $group) { if (($group['g_hidden']==1) && (!array_key_exists($group['id'],$members_groups)) && (!has_specific_permission(get_member(),'see_hidden_groups'))) continue; if (($group['id']!=db_get_first_id()) && ($group['id']!=$current_primary_group) && ((array_key_exists($group['id'],$members_groups)) || (has_specific_permission(get_member(),'assume_any_member')) || ($group['g_open_membership']==1))) { $selected=array_key_exists($group['id'],$members_groups); $_groups2->attach(form_input_list_entry(strval($group['id']),$selected,get_translated_text($group['g_name'],$GLOBALS['FORUM_DB']))); } } $sec_url=build_url(array('page'=>'groups','type'=>'misc'),get_module_zone('groups')); if (!$_groups2->is_empty()) $fields->attach(form_input_multi_list(do_lang_tempcode('SECONDARY_GROUP_MEMBERSHIP'),do_lang_tempcode('DESCRIPTION_SECONDARY_GROUP',escape_html($sec_url->evaluate())),'secondary_groups',$_groups2)); } // Special admin options if (has_specific_permission(get_member(),'member_maintenance')) { if ($validated==0) { $validated=get_param_integer('validated',0); if ($validated==1) attach_message(do_lang_tempcode('WILL_BE_VALIDATED_WHEN_SAVING')); } if (addon_installed('unvalidated')) $fields->attach(form_input_tick(do_lang_tempcode('VALIDATED'),do_lang_tempcode('DESCRIPTION_MEMBER_VALIDATED'),'validated',$validated==1)); if (get_value('disable_highlight_name')!=='1') $fields->attach(form_input_tick(do_lang_tempcode('HIGHLIGHTED_NAME'),do_lang_tempcode(addon_installed('pointstore')?'DESCRIPTION_HIGHLIGHTED_NAME_P':'DESCRIPTION_HIGHLIGHTED_NAME'),'highlighted_name',$highlighted_name==1)); if ((!is_null($member_id)) && ($member_id!=get_member())) // Can't ban someone new, and can't ban yourself $fields->attach(form_input_tick(do_lang_tempcode('_BANNED'),do_lang_tempcode('DESCRIPTION_MEMBER_BANNED'),'is_perm_banned',$is_perm_banned==1)); } } return array($fields,$hidden); } /** * Get form fields for adding/editing/finishing a member profile. * * @param boolean Whether we are only handling the essential details of a profile. * @param ?MEMBER The ID of the member we are handling (NULL: new member). * @param ?array A list of usergroups (NULL: default/current usergroups). * @param ?array A map of custom fields values (field-id=>value) (NULL: not known). * @return array A pair: The form fields, Hidden fields (both Tempcode). */ function ocf_get_member_fields_profile($mini_mode=true,$member_id=NULL,$groups=NULL,$custom_fields=NULL) { $fields=new ocp_tempcode(); $hidden=new ocp_tempcode(); if (is_null($groups)) $groups=is_null($member_id)?ocf_get_all_default_groups(true):$GLOBALS['OCF_DRIVER']->get_members_groups($member_id); $_custom_fields=ocf_get_all_custom_fields_match( $groups, ($mini_mode || (is_null($member_id)) || ($member_id==get_member()) || (has_specific_permission(get_member(),'view_any_profile_field')))?NULL:1, // public view ($mini_mode || (is_null($member_id)) || ($member_id!=get_member()) || (has_specific_permission(get_member(),'view_any_profile_field')))?NULL:1, // owner view ($mini_mode || (is_null($member_id)) || ($member_id!=get_member()) || (has_specific_permission(get_member(),'view_any_profile_field')))?NULL:1, // owner set NULL, NULL, NULL, 0, $mini_mode?true:NULL // show on join form ); $GLOBALS['NO_DEV_MODE_FULLSTOP_CHECK']=true; $field_groups=array(); require_code('fields'); require_code('encryption'); foreach ($_custom_fields as $custom_field) { // if (($custom_field['cf_locked']==0) || (!is_null($member_id))) // { $ob=get_fields_hook($custom_field['cf_type']); list(,,$storage_type)=$ob->get_field_value_row_bits($custom_field); $existing_field=(!is_null($custom_fields)) && (array_key_exists($custom_field['id'],$custom_fields)); if ($existing_field) { $value=mixed(); $value=$custom_fields[$custom_field['id']]; if (is_float($value)) $value=float_to_raw_string($value,10,true); elseif (is_integer($value)) $value=strval($value); if (strpos($storage_type,'_trans')!==false) { $value=((is_null($value)) || ($value=='0'))?'':get_translated_text(intval($value),$GLOBALS['FORUM_DB']); } if (($custom_field['cf_encrypted']==1) && (is_encryption_enabled())) $value=remove_magic_encryption_marker($value); } else { $value=$custom_field['cf_default']; } $result=new ocp_tempcode(); $_description=escape_html(get_translated_text($custom_field['cf_description'],$GLOBALS['FORUM_DB'])); $field_cat=''; $matches=array(); if (strpos($custom_field['trans_name'],': ')!==false) { $field_cat=substr($custom_field['trans_name'],0,strpos($custom_field['trans_name'],': ')); if ($field_cat.': '==$custom_field['trans_name']) { $custom_field['trans_name']=$field_cat; // Just been pulled out as heading, nothing after ": " } else { $custom_field['trans_name']=substr($custom_field['trans_name'],strpos($custom_field['trans_name'],': ')+2); } } elseif (preg_match('#(^\([A-Z][^\)]*\) )|( \([A-Z][^\)]*\)$)#',$custom_field['trans_name'],$matches)!=0) { $field_cat=trim($matches[0],'() '); $custom_field['trans_name']=str_replace($matches[0],'',$custom_field['trans_name']); } $result=$ob->get_field_inputter($custom_field['trans_name'],$_description,$custom_field,$value,!$existing_field); if (!array_key_exists($field_cat,$field_groups)) $field_groups[$field_cat]=new ocp_tempcode(); if (is_array($result)) { $field_groups[$field_cat]->attach($result[0]); $hidden->attach($result[1]); } else { $field_groups[$field_cat]->attach($result); } $hidden->attach(form_input_hidden('label_for__field_'.strval($custom_field['id']),$custom_field['trans_name'])); // } } if (array_key_exists('',$field_groups)) // Blank prefix must go first { $field_groups_blank=$field_groups['']; unset($field_groups['']); $field_groups=array_merge(array($field_groups_blank),$field_groups); } foreach ($field_groups as $field_group_title=>$extra_fields) { if (is_integer($field_group_title)) $field_group_title=($field_group_title==0)?'':strval($field_group_title); if ($field_group_title!='') $fields->attach(do_template('FORM_SCREEN_FIELD_SPACER',array('_GUID'=>'af91e3c040a0a18a4d9cc1143c0d2007','TITLE'=>$field_group_title))); $fields->attach($extra_fields); } $GLOBALS['NO_DEV_MODE_FULLSTOP_CHECK']=false; return array($fields,$hidden); } /** * Edit a member. * * @param AUTO_LINK The ID of the member. * @param ?SHORT_TEXT The e-mail address. (NULL: don't change) * @param ?BINARY Whether posts are previewed before they are made. (NULL: don't change) * @param ?integer Day of date of birth. (NULL: don't change) (-1: deset) * @param ?integer Month of date of birth. (NULL: don't change) (-1: deset) * @param ?integer Year of date of birth. (NULL: don't change) (-1: deset) * @param ?ID_TEXT The member timezone. (NULL: don't change) * @param ?GROUP The members primary (NULL: don't change). * @param array A map of custom fields values (field-id=>value). * @param ?ID_TEXT The members default theme. (NULL: don't change) * @param ?BINARY Whether the members age may be shown. (NULL: don't change) * @param ?BINARY Whether the member sees signatures in posts. (NULL: don't change) * @param ?BINARY Whether the member automatically is enabled for notifications for content they contribute to. (NULL: don't change) * @param ?LANGUAGE_NAME The members language. (NULL: don't change) * @param ?BINARY Whether the member allows e-mails via the site. (NULL: don't change) * @param ?BINARY Whether the member allows e-mails from staff via the site. (NULL: don't change) * @param ?BINARY Whether the profile has been validated (NULL: do not change this). (NULL: don't change) * @param ?string The username. (NULL: don't change) * @param ?string The password. (NULL: don't change) * @param ?BINARY Whether the member likes to view zones without menus, when a choice is available. (NULL: don't change) * @param ?BINARY Whether the member username will be highlighted. (NULL: don't change) * @param ?SHORT_TEXT Usergroups that may PT the member. (NULL: don't change) * @param ?LONG_TEXT Rules that other members must agree to before they may start a PT with the member. (NULL: don't change) * @param ?TIME When the member is on probation until (NULL: don't change) * @param ?TIME When the member joined (NULL: don't change) * @param ?URLPATH Avatar (NULL: don't change) * @param ?LONG_TEXT Signature (NULL: don't change) * @param ?BINARY Banned status (NULL: don't change) * @param ?URLPATH Photo URL (NULL: don't change) * @param ?URLPATH URL of thumbnail of photo (NULL: don't change) * @param ?SHORT_TEXT Password salt (NULL: don't change) * @param ?ID_TEXT Password compatibility scheme (NULL: don't change) * @param boolean Whether to skip security checks and most of the change-triggered emails */ function ocf_edit_member($member_id,$email_address,$preview_posts,$dob_day,$dob_month,$dob_year,$timezone,$primary_group,$custom_fields,$theme,$reveal_age,$views_signatures,$auto_monitor_contrib_content,$language,$allow_emails,$allow_emails_from_staff,$validated=NULL,$username=NULL,$password=NULL,$zone_wide=1,$highlighted_name=NULL,$pt_allow='*',$pt_rules_text='',$on_probation_until=NULL,$join_time=NULL,$avatar_url=NULL,$signature=NULL,$is_perm_banned=NULL,$photo_url=NULL,$photo_thumb_url=NULL,$salt=NULL,$password_compatibility_scheme=NULL,$skip_checks=false) { require_code('type_validation'); if (!$skip_checks) { $old_email_address=$GLOBALS['OCF_DRIVER']->get_member_row_field($member_id,'m_email_address'); if ((!is_null($email_address)) && (($email_address!='') || (($old_email_address!='') && (!has_specific_permission(get_member(),'member_maintenance')))) && (!is_valid_email_address($email_address))) warn_exit(do_lang_tempcode('_INVALID_EMAIL_ADDRESS',escape_html($email_address))); } if (!is_null($username)) { if (!$skip_checks) { ocf_check_name_valid($username,$member_id,$password); require_code('urls2'); suggest_new_idmoniker_for('members','view',strval($member_id),$username); } } // Supplement custom field values given with defaults, and check constraints $all_fields=ocf_get_all_custom_fields_match($GLOBALS['OCF_DRIVER']->get_members_groups($member_id)); foreach ($all_fields as $field) { $field_id=$field['id']; if (array_key_exists($field_id,$custom_fields)) { if (!$skip_checks) { if (($field['cf_public_view']==0) && ($member_id!=get_member()) && (!has_specific_permission(get_member(),'view_any_profile_field'))) access_denied('I_ERROR'); if (($field['cf_owner_view']==0) && ($member_id==get_member()) && (!has_specific_permission(get_member(),'view_any_profile_field'))) access_denied('I_ERROR'); if (($field['cf_owner_set']==0) && ($member_id==get_member()) && (!has_specific_permission(get_member(),'view_any_profile_field'))) access_denied('I_ERROR'); } } } // Set custom profile field values $all_fields_types=collapse_2d_complexity('id','cf_type',$all_fields); $changes=array(); foreach ($custom_fields as $field=>$value) { if (!array_key_exists($field,$all_fields_types)) continue; // Trying to set a field we're not allowed to (doesn't apply to our group) $change=ocf_set_custom_field($member_id,$field,$value,$all_fields_types[$field],true); if (!is_null($change)) $changes=array_merge($changes,$change); } if (count($changes)!=0) { $GLOBALS['FORUM_DB']->query_update('f_member_custom_fields',$changes,array('mf_member_id'=>$member_id),'',1); } $old_primary_group=$GLOBALS['OCF_DRIVER']->get_member_row_field($member_id,'m_primary_group'); $_pt_rules_text=$GLOBALS['OCF_DRIVER']->get_member_row_field($member_id,'m_pt_rules_text'); $_signature=$GLOBALS['OCF_DRIVER']->get_member_row_field($member_id,'m_signature'); $update=array(); if (!is_null($theme)) $update['m_theme']=$theme; if (!is_null($preview_posts)) $update['m_preview_posts']=$preview_posts; if (!is_null($dob_day)) $update['m_dob_day']=($dob_day==-1)?NULL:$dob_day; if (!is_null($dob_month)) $update['m_dob_month']=($dob_month==-1)?NULL:$dob_month; if (!is_null($dob_year)) $update['m_dob_year']=($dob_year==-1)?NULL:$dob_year; if (!is_null($timezone)) $update['m_timezone_offset']=$timezone; if (!is_null($reveal_age)) $update['m_reveal_age']=$reveal_age; if (!is_null($email_address)) $update['m_email_address']=$email_address; if (!is_null($views_signatures)) $update['m_views_signatures']=$views_signatures; if (!is_null($auto_monitor_contrib_content)) $update['m_auto_monitor_contrib_content']=$auto_monitor_contrib_content; if (!is_null($language)) $update['m_language']=$language; if (!is_null($allow_emails)) $update['m_allow_emails']=$allow_emails; if (!is_null($allow_emails_from_staff)) $update['m_allow_emails_from_staff']=$allow_emails_from_staff; if (!is_null($zone_wide)) $update['m_zone_wide']=$zone_wide; if (!is_null($pt_allow)) $update['m_pt_allow']=$pt_allow; if (!is_null($pt_rules_text)) $update['m_pt_rules_text']=lang_remap_comcode($_pt_rules_text,$pt_rules_text,$GLOBALS['FORUM_DB']); if (($skip_checks) || (has_specific_permission(get_member(),'probate_members'))) $update['m_on_probation_until']=$on_probation_until; if (!is_null($join_time)) $update['m_join_time']=$join_time; if (!is_null($avatar_url)) $update['m_avatar_url']=$avatar_url; if (!is_null($signature)) $update['m_signature']=lang_remap_comcode($_signature,$signature,$GLOBALS['FORUM_DB']); if (!is_null($is_perm_banned)) $update['m_is_perm_banned']=$is_perm_banned; if (!is_null($photo_url)) $update['m_photo_url']=$photo_url; if (!is_null($photo_thumb_url)) $update['m_photo_thumb_url']=$photo_thumb_url; $old_username=$GLOBALS['OCF_DRIVER']->get_member_row_field($member_id,'m_username'); if ((!is_null($username)) && ($username!=$old_username) && (($skip_checks) || (has_actual_page_access(get_member(),'admin_ocf_join')) || (has_specific_permission($member_id,'rename_self')))) // Username change { $update['m_username']=$username; // Reassign personal galleries if (addon_installed('galleries')) { require_lang('galleries'); $personal_galleries=$GLOBALS['SITE_DB']->query('SELECT fullname,parent_id FROM '.get_table_prefix().'galleries WHERE name LIKE \'member_'.strval($member_id).'_%\''); foreach ($personal_galleries as $gallery) { $parent_title=get_translated_text($GLOBALS['SITE_DB']->query_value('galleries','fullname',array('name'=>$gallery['parent_id']))); if (get_translated_text($gallery['fullname'])==do_lang('PERSONAL_GALLERY_OF',$old_username,$parent_title)) { lang_remap($gallery['fullname'],do_lang('PERSONAL_GALLERY_OF',$username,$parent_title),$GLOBALS['FORUM_DB']); } } } require_code('notifications'); $subject=do_lang('USERNAME_CHANGED_MAIL_SUBJECT',$username,$old_username,NULL,get_lang($member_id)); $mail=do_lang('USERNAME_CHANGED_MAIL',comcode_escape(get_site_name()),comcode_escape($username),comcode_escape($old_username),get_lang($member_id)); dispatch_notification('ocf_username_changed',NULL,$subject,$mail,array($member_id)); $subject=do_lang('STAFF_USERNAME_CHANGED_MAIL_SUBJECT',$username,$old_username,NULL,get_site_default_lang()); $mail=do_lang('STAFF_USERNAME_CHANGED_MAIL',comcode_escape(get_site_name()),comcode_escape($username),comcode_escape($old_username),get_site_default_lang()); dispatch_notification('ocf_username_changed_staff',NULL,$subject,$mail); if (addon_installed('news')) $GLOBALS['SITE_DB']->query_update('news',array('author'=>$username),array('author'=>$old_username)); update_member_username_caching($member_id,$username); } if (!is_null($password)) // Password change { if ((is_null($password_compatibility_scheme)) && (get_value('no_password_hashing')==='1')) { $password_compatibility_scheme='plain'; $update['m_password_change_code']=''; $salt=''; } if ((!is_null($salt)) || (!is_null($password_compatibility_scheme))) { if (!is_null($salt)) $update['m_pass_salt']=$salt; if (!is_null($password_compatibility_scheme)) $update['m_password_compat_scheme']=$password_compatibility_scheme; $update['m_pass_hash_salted']=$password; } else { $update['m_password_change_code']=''; $salt=$GLOBALS['OCF_DRIVER']->get_member_row_field($member_id,'m_pass_salt'); $update['m_pass_hash_salted']=md5($salt.md5($password)); $update['m_password_compat_scheme']=''; } // Security, clear out sessions from other people on this user - just in case the reset is due to suspicious activity $GLOBALS['SITE_DB']->query('DELETE FROM '.get_table_prefix().'sessions WHERE the_user='.strval($member_id).' AND the_session<>'.strval(get_session_id())); if (!$skip_checks) { if (($member_id==get_member()) || (get_value('disable_password_change_mails_for_staff')!=='1')) { if (get_page_name()!='admin_ocf_join') { $part_b=''; if (!has_actual_page_access(get_member(),'admin_ocf_join')) $part_b=do_lang('PASSWORD_CHANGED_MAIL_BODY_2',get_ip_address()); $mail=do_lang('PASSWORD_CHANGED_MAIL_BODY',get_site_name(),$part_b,NULL,get_lang($member_id)); require_code('notifications'); dispatch_notification('ocf_password_changed',NULL,do_lang('PASSWORD_CHANGED_MAIL_SUBJECT',NULL,NULL,NULL,get_lang($member_id)),$mail,array($member_id),NULL,2); } } } } if (!is_null($validated)) { $update['m_validated_email_confirm_code']=''; if (addon_installed('unvalidated')) $update['m_validated']=$validated; } if (!is_null($highlighted_name)) { $update['m_highlighted_name']=$highlighted_name; } if (!is_null($primary_group)) { $update['m_primary_group']=$primary_group; if ($primary_group!=$old_primary_group) { log_it('MEMBER_PRIMARY_GROUP_CHANGED',strval($member_id),strval($primary_group)); } } $GLOBALS['FORUM_DB']->query_update('f_members',$update,array('id'=>$member_id),'',1); if (get_member()!=$member_id) log_it('EDIT_MEMBER_PROFILE',strval($member_id),$username); $old_validated=$GLOBALS['OCF_DRIVER']->get_member_row_field($member_id,'m_validated'); if (($old_validated==0) && ($validated==1)) { require_code('mail'); $_login_url=build_url(array('page'=>'login'),get_module_zone('login'),NULL,false,false,true); $login_url=$_login_url->evaluate(); mail_wrap(do_lang('VALIDATED_MEMBER_SUBJECT',get_site_name(),NULL,get_lang($member_id)),do_lang('MEMBER_VALIDATED',get_site_name(),$username,$login_url,get_lang($member_id)),array($email_address),$username); } $old_email_address=$GLOBALS['FORUM_DRIVER']->get_member_row_field($member_id,'m_email_address'); if ($old_email_address!=$email_address) { $GLOBALS['FORUM_DB']->query_update('f_invites',array('i_email_address'=>$old_email_address),array('i_email_address'=>$email_address)); } delete_value('ocf_newest_member_id'); delete_value('ocf_newest_member_username'); // Decache from run-time cache unset($GLOBALS['FORUM_DRIVER']->MEMBER_ROWS_CACHED[$member_id]); unset($GLOBALS['MEMBER_CACHE_FIELD_MAPPINGS'][$member_id]); unset($GLOBALS['TIMEZONE_MEMBER_CACHE'][$member_id]); unset($GLOBALS['USER_NAME_CACHE'][$member_id]); } /** * Delete a member. * * @param AUTO_LINK The ID of the member. */ function ocf_delete_member($member_id) { $username=$GLOBALS['OCF_DRIVER']->get_member_row_field($member_id,'m_username'); $signature=$GLOBALS['OCF_DRIVER']->get_member_row_field($member_id,'m_signature'); require_code('attachments2'); require_code('attachments3'); delete_lang_comcode_attachments($signature,'signature',strval($member_id),$GLOBALS['FORUM_DB']); $GLOBALS['FORUM_DB']->query_delete('f_members',array('id'=>$member_id),'',1); $GLOBALS['FORUM_DB']->query_delete('f_group_members',array('gm_member_id'=>$member_id)); $GLOBALS['FORUM_DB']->query_update('f_groups',array('g_group_leader'=>get_member()),array('g_group_leader'=>$member_id)); $GLOBALS['FORUM_DB']->query_delete('sessions',array('the_user'=>$member_id)); require_code('fields'); // Delete custom profile fields $cpfs=$GLOBALS['FORUM_DB']->query_select('f_custom_fields'); $fields_row=$GLOBALS['FORUM_DB']->query_select('f_member_custom_fields',array('*'),array('mf_member_id'=>$member_id),'',1); foreach ($cpfs as $field) { $l=$fields_row[0]['field_'.strval($field['id'])]; $object=get_fields_hook($field['cf_type']); list(,,$storage_type)=$object->get_field_value_row_bits($field); if (method_exists($object,'cleanup')) { $object->cleanup($l); } if ((strpos($storage_type,'_trans')!==false) && (!is_null($l))) { if (true) // Always do this just in case it is for attachments { require_code('attachments2'); require_code('attachments3'); delete_lang_comcode_attachments($l,'null',strval($member_id),$GLOBALS['FORUM_DB']); } else { delete_lang($l,$GLOBALS['FORUM_DB']); } } } $GLOBALS['FORUM_DB']->query_delete('f_member_custom_fields',array('mf_member_id'=>$member_id),'',1); // Cleanup images $old=$GLOBALS['OCF_DRIVER']->get_member_row_field($member_id,'m_avatar_url'); if ((url_is_local($old)) && ((substr($old,0,20)=='uploads/ocf_avatars/') || (substr($old,0,16)=='uploads/avatars/'))) { @unlink(get_custom_file_base().'/'.rawurldecode($old)); sync_file(rawurldecode($old)); } $old=$GLOBALS['OCF_DRIVER']->get_member_row_field($member_id,'m_photo_url'); if ((url_is_local($old)) && ((substr($old,0,19)=='uploads/ocf_photos/') || (substr($old,0,15)=='uploads/photos/'))) { @unlink(get_custom_file_base().'/'.rawurldecode($old)); sync_file(rawurldecode($old)); } if (addon_installed('catalogues')) { update_catalogue_content_ref('member',strval($member_id),''); } delete_value('ocf_newest_member_id'); delete_value('ocf_newest_member_username'); log_it('DELETE_MEMBER',strval($member_id),$username); } /** * Ban a member. * * @param AUTO_LINK The ID of the member. */ function ocf_ban_member($member_id) { require_code('mail'); $username=$GLOBALS['OCF_DRIVER']->get_member_row_field($member_id,'m_username'); $email_address=$GLOBALS['OCF_DRIVER']->get_member_row_field($member_id,'m_email_address'); $GLOBALS['FORUM_DB']->query_update('f_members',array('m_is_perm_banned'=>1),array('id'=>$member_id),'',1); log_it('BAN_MEMBER',strval($member_id),$username); $mail=do_lang('BAN_MEMBER_MAIL',$username,get_site_name(),array(),get_lang($member_id)); mail_wrap(do_lang('BAN_MEMBER_MAIL_SUBJECT',NULL,NULL,NULL,get_lang($member_id)),$mail,array($email_address),$username,'','',2); } /** * Unban a member. * * @param AUTO_LINK The ID of the member. */ function ocf_unban_member($member_id) { require_code('mail'); $username=$GLOBALS['OCF_DRIVER']->get_member_row_field($member_id,'m_username'); $email_address=$GLOBALS['OCF_DRIVER']->get_member_row_field($member_id,'m_email_address'); $GLOBALS['FORUM_DB']->query_update('f_members',array('m_is_perm_banned'=>0),array('id'=>$member_id),'',1); log_it('UNBAN_MEMBER',strval($member_id),$username); $mail=do_lang('UNBAN_MEMBER_MAIL',$username,get_site_name(),array(),get_lang($member_id)); mail_wrap(do_lang('UNBAN_MEMBER_MAIL_SUBJECT',NULL,NULL,NULL,get_lang($member_id)),$mail,array($email_address),$username,'','',2); } /** * Edit a custom profile field. * * @param AUTO_LINK The ID of the custom profile field. * @param SHORT_TEXT Name of the field. * @param SHORT_TEXT Description of the field. * @param LONG_TEXT The default value for the field. * @param BINARY Whether the field is publicly viewable. * @param BINARY Whether the field is viewable by the owner. * @param BINARY Whether the field may be set by the owner. * @param BINARY Whether the field should be encrypted. * @param BINARY Whether the field is to be shown on the join form * @param BINARY Whether this field is shown in posts and places where member details are highlighted (such as an image in a member gallery). * @param BINARY Whether this field is shown in preview places, such as in the teaser for a member gallery. * @param integer The order of this field relative to other fields. * @param LONG_TEXT The usergroups that this field is confined to (comma-separated list). * @param ID_TEXT The type of the field. * @set short_text long_text short_trans long_trans integer upload picture url list tick float * @param BINARY Whether it is required that every member have this field filled in. */ function ocf_edit_custom_field($id,$name,$description,$default,$public_view,$owner_view,$owner_set,$encrypted,$required,$show_in_posts,$show_in_post_previews,$order,$only_group,$type,$show_on_join_form) { $dbs_back=$GLOBALS['NO_DB_SCOPE_CHECK']; $GLOBALS['NO_DB_SCOPE_CHECK']=true; if ($only_group=='-1') $only_group=''; $info=$GLOBALS['FORUM_DB']->query_select('f_custom_fields',array('cf_name','cf_description'),array('id'=>$id),'',1); $_name=$info[0]['cf_name']; $_description=$info[0]['cf_description']; $map=array( 'cf_name'=>lang_remap($_name,$name,$GLOBALS['FORUM_DB']), 'cf_description'=>lang_remap($_description,$description,$GLOBALS['FORUM_DB']), 'cf_default'=>$default, 'cf_public_view'=>$public_view, 'cf_owner_view'=>$owner_view, 'cf_owner_set'=>$owner_set, 'cf_required'=>$required, 'cf_show_in_posts'=>$show_in_posts, 'cf_show_in_post_previews'=>$show_in_post_previews, 'cf_order'=>$order, 'cf_only_group'=>$only_group, 'cf_type'=>$type, 'cf_show_on_join_form'=>$show_on_join_form ); $GLOBALS['FORUM_DB']->query_update('f_custom_fields',$map,array('id'=>$id),'',1); list($_type,$index)=get_cpf_storage_for($type); require_code('database_action'); $GLOBALS['FORUM_DB']->delete_index_if_exists('f_member_custom_fields','mcf'.strval($id)); $GLOBALS['FORUM_DB']->delete_index_if_exists('f_member_custom_fields','#mcf_ft_'.strval($id)); $indices_count=$GLOBALS['FORUM_DB']->query_value('db_meta_indices','COUNT(*)',array('i_table'=>'f_member_custom_fields')); if ($indices_count<60) // Could be 64 but trying to be careful here... { if ($index) { if ($_type!='LONG_TEXT') { $GLOBALS['FORUM_DB']->create_index('f_member_custom_fields','mcf'.strval($id),array('field_'.strval($id)),'mf_member_id'); } if (strpos($_type,'_TEXT')!==false) { $GLOBALS['FORUM_DB']->create_index('f_member_custom_fields','#mcf_ft_'.strval($id),array('field_'.strval($id)),'mf_member_id'); } } elseif ((strpos($type,'trans')!==false) || ($type=='posting_field')) { $GLOBALS['FORUM_DB']->create_index('f_member_custom_fields','mcf'.strval($id),array('field_'.strval($id)),'mf_member_id'); // For joins } } log_it('EDIT_CUSTOM_PROFILE_FIELD',strval($id),$name); $GLOBALS['NO_DB_SCOPE_CHECK']=$dbs_back; } /** * Delete a custom profile field. * * @param AUTO_LINK The ID of the custom profile field. */ function ocf_delete_custom_field($id) { $dbs_back=$GLOBALS['NO_DB_SCOPE_CHECK']; $GLOBALS['NO_DB_SCOPE_CHECK']=true; $info=$GLOBALS['FORUM_DB']->query_select('f_custom_fields',array('cf_name','cf_description'),array('id'=>$id),'',1); if (!array_key_exists(0,$info)) warn_exit(do_lang_tempcode('MISSING_RESOURCE')); $_name=$info[0]['cf_name']; $_description=$info[0]['cf_description']; log_it('DELETE_CUSTOM_PROFILE_FIELD',strval($id),get_translated_text($_name,$GLOBALS['FORUM_DB'])); require_code('database_action'); delete_lang($_name,$GLOBALS['FORUM_DB']); delete_lang($_description,$GLOBALS['FORUM_DB']); $GLOBALS['FORUM_DB']->delete_index_if_exists('f_member_custom_fields','#mcf'.strval($id)); $GLOBALS['FORUM_DB']->delete_table_field('f_member_custom_fields','field_'.strval($id)); $GLOBALS['FORUM_DB']->query_delete('f_custom_fields',array('id'=>$id),'',1); $GLOBALS['NO_DB_SCOPE_CHECK']=$dbs_back; global $TABLE_LANG_FIELDS; unset($TABLE_LANG_FIELDS['f_member_custom_fields']); } /** * Set a custom profile field for a member. * * @param MEMBER The member. * @param AUTO_LINK The field being set. * @param mixed The value of the field. For a trans-type field, this can be either a lang-ID to be copied (from forum DB), or an actual string. * @param ?ID_TEXT The field type (NULL: look it up). * @param boolean Whether to defer the change, by returning a result change rather than doing it right away. * @return ?array Mapping change (NULL: none / can't defer). */ function ocf_set_custom_field($member_id,$field,$value,$type=NULL,$defer=false) { if (is_null($type)) $type=$GLOBALS['FORUM_DB']->query_value('f_custom_fields','cf_type',array('id'=>$field)); ocf_get_custom_field_mappings($member_id); // This will do an auto-repair if CPF storage row is missing global $ANY_FIELD_ENCRYPTED; if ($ANY_FIELD_ENCRYPTED===NULL) $ANY_FIELD_ENCRYPTED=!is_null($GLOBALS['FORUM_DB']->query_value_null_ok('f_custom_fields','cf_encrypted',array('cf_encrypted'=>1))); if ($ANY_FIELD_ENCRYPTED) { $encrypted=$GLOBALS['FORUM_DB']->query_value('f_custom_fields','cf_encrypted',array('id'=>$field)); if ($encrypted) { require_code('encryption'); $current=$GLOBALS['FORUM_DB']->query_value('f_member_custom_fields','field_'.strval(intval($field)),array('mf_member_id'=>$member_id)); if ((remove_magic_encryption_marker($value)==remove_magic_encryption_marker($current)) && (is_data_encrypted($current))) return NULL; $value=encrypt_data($value); } } else $encrypted=false; require_code('fields'); $ob=get_fields_hook($type); list(,,$storage_type)=$ob->get_field_value_row_bits(array('id'=>$field,'cf_default'=>'','cf_type'=>$type)); if (strpos($storage_type,'_trans')!==false) { if (is_integer($value)) $value=get_translated_text($value,$GLOBALS['FORUM_DB']); $current=$GLOBALS['FORUM_DB']->query_value('f_member_custom_fields','field_'.strval(intval($field)),array('mf_member_id'=>$member_id)); if (is_null($current)) { if ($type=='posting_field') { require_code('attachments2'); $current=insert_lang_comcode_attachments(3,$value,'null',strval($member_id),$GLOBALS['FORUM_DB']); } else { $current=insert_lang_comcode($value,3,$GLOBALS['FORUM_DB']); } $GLOBALS['FORUM_DB']->query_update('f_member_custom_fields',array('field_'.strval(intval($field))=>$current),array('mf_member_id'=>$member_id),'',1); } else { if ($type=='posting_field') { require_code('attachments2'); require_code('attachments3'); update_lang_comcode_attachments($current,$value,'null',strval($member_id),$GLOBALS['FORUM_DB'],false,$member_id); } else { lang_remap_comcode($current,$value,$GLOBALS['FORUM_DB']); } } } else { $change=array('field_'.strval(intval($field))=>$value); if (!$defer) $GLOBALS['FORUM_DB']->query_update('f_member_custom_fields',$change,array('mf_member_id'=>$member_id),'',1); return $change; } return NULL; } /** * Check a username is valid for adding, and possibly also the password. * * @param SHORT_TEXT The username (may get altered). * @param ?MEMBER The member (NULL: member not actually added yet; this ID is only given for the duplication check, to make sure it doesn't think we are duplicating with ourself). * @param ?SHORT_TEXT The password (NULL: nothing to check). * @param boolean Whether to return errors instead of dieing on them. * @return ?tempcode Error (NULL: none). */ function ocf_check_name_valid(&$username,$member_id=NULL,$password=NULL,$return_errors=false) { /* $striped_username=$username; This would be an internationalisation mistake $allowed_characters=array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z', 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z', '0','1','2','3','4','5','6','7','8','9',' ', '#','@',':',';','/',"\\",'.',',','|','!','%','$','^','(','*',')','-','_','+','=','[',']','{','}','~'); foreach ($allowed_characters as $allowed_character) { $striped_username=str_replace($allowed_character,'',$striped_username); } if ($striped_username!='') warn_exit(do_lang_tempcode('USERNAME_BAD_SYMBOLS'));*/ // Check it doesn't already exist $test=is_null($member_id)?NULL:$GLOBALS['FORUM_DB']->query_value_null_ok('f_members','id',array('m_username'=>$username,'id'=>$member_id)); // Precedence on an ID match in case there are duplicate usernames and user is trying to fix that if (is_null($test)) $test=$GLOBALS['FORUM_DB']->query_value_null_ok('f_members','id',array('m_username'=>$username)); if ((!is_null($test)) && ($test!==$member_id)) { if (get_option('signup_fullname')=='0') { if ($return_errors) return do_lang_tempcode('USERNAME_ALREADY_EXISTS'); warn_exit(do_lang_tempcode('USERNAME_ALREADY_EXISTS')); } else // Adjust username as required { $username=get_username_from_human_name($username); } } $username_changed=is_null($test); // Check for disallowed symbols in username $disallowed_characters=array(/*'<','>','&','"',"'",'$',','*/); foreach ($disallowed_characters as $disallowed_character) { if ((strpos($username,$disallowed_character)!==false) && ($username_changed)) { if ($return_errors) return do_lang_tempcode('USERNAME_BAD_SYMBOLS'); warn_exit(do_lang_tempcode('USERNAME_BAD_SYMBOLS')); } } if ((strpos($username,'@')!==false) && (strpos($username,'.')!==false) && ($username_changed)) { if ($return_errors) return do_lang_tempcode('USERNAME_BAD_SYMBOLS'); warn_exit(do_lang_tempcode('USERNAME_BAD_SYMBOLS')); } // Check lengths if (get_page_name()!='admin_ocf_join') { $_maximum_username_length=get_option('maximum_username_length',true); if (is_null($_maximum_username_length)) $maximum_username_length=15; else $maximum_username_length=intval($_maximum_username_length); if ((ocp_mb_strlen($username)>$maximum_username_length) && ($username_changed)) { if ($return_errors) return do_lang_tempcode('USERNAME_TOO_LONG',integer_format($maximum_username_length)); warn_exit(do_lang_tempcode('USERNAME_TOO_LONG',integer_format($maximum_username_length))); } $_minimum_username_length=get_option('minimum_username_length',true); if (is_null($_minimum_username_length)) $minimum_username_length=1; else $minimum_username_length=intval($_minimum_username_length); if ((ocp_mb_strlen($username)<$minimum_username_length) && ($username_changed)) { if ($return_errors) return do_lang_tempcode('USERNAME_TOO_SHORT',integer_format($minimum_username_length)); warn_exit(do_lang_tempcode('USERNAME_TOO_SHORT',integer_format($minimum_username_length))); } if (!is_null($password)) { $_maximum_password_length=get_option('maximum_password_length',true); if (is_null($_maximum_password_length)) $maximum_password_length=1000; else $maximum_password_length=intval($_maximum_password_length); if (ocp_mb_strlen($password)>$maximum_password_length) { if ($return_errors) return do_lang_tempcode('PASSWORD_TOO_LONG',integer_format($maximum_password_length)); warn_exit(do_lang_tempcode('PASSWORD_TOO_LONG',integer_format($maximum_password_length))); } $_minimum_password_length=get_option('minimum_password_length',true); if (is_null($_minimum_password_length)) $minimum_password_length=1; else $minimum_password_length=intval($_minimum_password_length); if (ocp_mb_strlen($password)<$minimum_password_length) { if ($return_errors) return do_lang_tempcode('PASSWORD_TOO_SHORT',integer_format($minimum_password_length)); warn_exit(do_lang_tempcode('PASSWORD_TOO_SHORT',integer_format($minimum_password_length))); } } } // Check for whitespace if (get_option('signup_fullname')=='0') { $prohibit_username_whitespace=get_option('prohibit_username_whitespace',true); if (($prohibit_username_whitespace==='1') && (preg_match('#\s#',$username)!=0) && ($username_changed)) { if ($return_errors) return do_lang_tempcode('USERNAME_PASSWORD_WHITESPACE'); warn_exit(do_lang_tempcode('USERNAME_PASSWORD_WHITESPACE')); } } $prohibit_password_whitespace=get_option('prohibit_password_whitespace',true); if (($prohibit_password_whitespace==='1') && (preg_match('#\s#',$password)!=0) && ($username_changed)) { if ($return_errors) return do_lang_tempcode('USERNAME_PASSWORD_WHITESPACE'); warn_exit(do_lang_tempcode('USERNAME_PASSWORD_WHITESPACE')); } // Check against restricted usernames if ((get_page_name()!='admin_ocf_join') && ($username_changed)) { $restricted_usernames=explode(',',get_option('restricted_usernames')); $restricted_usernames[]=do_lang('GUEST'); $restricted_usernames[]=do_lang('UNKNOWN'); $restricted_usernames[]=do_lang('SYSTEM'); foreach ($restricted_usernames as $_restricted_username) { $restricted_username=trim($_restricted_username); if ($restricted_username=='') continue; if (strpos($username,$restricted_username)!==false) { if ($return_errors) return do_lang_tempcode('USERNAME_BAD_SUBSTRING'); warn_exit(do_lang_tempcode('USERNAME_BAD_SUBSTRING')); } } } return NULL; } /** * Edit a member's personal title, and check validity. * * @param SHORT_TEXT The new title. * @param ?MEMBER The member (NULL: the current member). */ function ocf_member_choose_title($new_title,$member_id=NULL) { if (is_null($member_id)) $member_id=get_member(); $old_title=$GLOBALS['OCF_DRIVER']->get_member_row_field($member_id,'m_title'); if ($old_title==$new_title) return; if (ocp_mb_strlen($new_title)>intval(get_option('max_member_title_length'))) warn_exit(do_lang_tempcode('USER_TITLE_TOO_BIG')); $GLOBALS['FORUM_DB']->query_update('f_members',array('m_title'=>$new_title),array('id'=>$member_id),'',1); // Decache from run-time cache unset($GLOBALS['FORUM_DRIVER']->MEMBER_ROWS_CACHED[$member_id]); unset($GLOBALS['MEMBER_CACHE_FIELD_MAPPINGS'][$member_id]); } /** * Edit a member's signature, and check validity. * * @param LONG_TEXT The new signature. * @param ?MEMBER The member (NULL: the current member). */ function ocf_member_choose_signature($new_signature,$member_id=NULL) { if (is_null($member_id)) $member_id=get_member(); $max_sig_length=ocf_get_member_best_group_property($member_id,'max_sig_length_comcode'); if (ocp_mb_strlen($new_signature)>$max_sig_length) warn_exit(make_string_tempcode(escape_html(do_lang('SIGNATURE_TOO_BIG')))); $_signature=$GLOBALS['OCF_DRIVER']->get_member_row_field($member_id,'m_signature'); if (get_translated_text($_signature)==$new_signature) return; require_code('attachments2'); require_code('attachments3'); $GLOBALS['FORUM_DB']->query_update('f_members',array('m_signature'=>update_lang_comcode_attachments($_signature,$new_signature,'ocf_signature',strval($member_id),$GLOBALS['FORUM_DB'],false,$member_id)),array('id'=>$member_id),'',1); require_code('notifications'); dispatch_notification('ocf_choose_signature',NULL,do_lang('CHOOSE_SIGNATURE_SUBJECT',$GLOBALS['FORUM_DRIVER']->get_username($member_id),NULL,NULL,get_lang($member_id)),do_lang('CHOOSE_SIGNATURE_BODY',$new_signature,$GLOBALS['FORUM_DRIVER']->get_username($member_id),NULL,get_lang($member_id))); // Decache from run-time cache unset($GLOBALS['FORUM_DRIVER']->MEMBER_ROWS_CACHED[$member_id]); unset($GLOBALS['MEMBER_CACHE_FIELD_MAPPINGS'][$member_id]); } /** * Edit a member's avatar, and check validity. * * @param URLPATH The new avatar URL. * @param ?MEMBER The member (NULL: the current member). */ function ocf_member_choose_avatar($avatar_url,$member_id=NULL) { if (is_null($member_id)) $member_id=get_member(); $old=$GLOBALS['FORUM_DB']->query_value('f_members','m_avatar_url',array('id'=>$member_id)); if ($old==$avatar_url) return; // Check it has valid dimensions if ($avatar_url!='') { require_code('images'); if (!is_image($avatar_url,true)) { $ext=get_file_extension($avatar_url); warn_exit(do_lang_tempcode('UNKNOWN_FORMAT',escape_html($ext))); } $stub=url_is_local($avatar_url)?(get_complex_base_url($avatar_url).'/'):''; if ((get_option('is_on_gd')=='1') && (function_exists('imagetypes'))) { $file_path_stub=convert_url_to_path($stub.$avatar_url); if (!is_null($file_path_stub)) { $from_file=@file_get_contents($file_path_stub); } else { $from_file=http_download_file($stub.$avatar_url,1024*1024*4/*reasonable limit*/,false); } if (is_null($from_file)) warn_exit(do_lang_tempcode('MISSING_RESOURCE')); $source=@imagecreatefromstring($from_file); if ($source===false) { warn_exit(do_lang_tempcode('CORRUPT_FILE',escape_html($avatar_url))); } if (get_file_extension($avatar_url)=='gif') { $header = unpack('@6/'.'vwidth/'.'vheight',$from_file); $sx=$header['width']; $sy=$header['height']; } else { $sx=imagesx($source); $sy=imagesy($source); } imagedestroy($source); $width=ocf_get_member_best_group_property($member_id,'max_avatar_width'); $height=ocf_get_member_best_group_property($member_id,'max_avatar_height'); if (($sx>$width) || ($sy>$height)) { require_code('images'); $file_path=get_custom_file_base().'/'.rawurldecode($avatar_url); if ((!is_saveable_image($file_path)) || (!url_is_local($avatar_url))) { if ((url_is_local($avatar_url)) && (substr($avatar_url,0,20)=='uploads/ocf_avatars/')) { unlink($file_path); sync_file(rawurldecode($avatar_url)); } warn_exit(do_lang_tempcode('IMAGE_BAD_DIMENSIONS',strval($width).'x'.strval($height),strval($sx).'x'.strval($sy))); } convert_image($file_path,$file_path,$width,$height,-1,false,get_file_extension($file_path),true,true); } } if ((substr($avatar_url,0,7)!='themes/') && (addon_installed('ocf_avatars'))) { require_code('notifications'); dispatch_notification('ocf_choose_avatar',NULL,do_lang('CHOOSE_AVATAR_SUBJECT',$GLOBALS['FORUM_DRIVER']->get_username($member_id),NULL,NULL,get_lang($member_id)),do_lang('CHOOSE_AVATAR_BODY',$stub.$avatar_url,$GLOBALS['FORUM_DRIVER']->get_username($member_id),NULL,get_lang($member_id))); } } // Cleanup old avatar if ((url_is_local($old)) && ((substr($old,0,20)=='uploads/ocf_avatars/') || (substr($old,0,16)=='uploads/avatars/')) && ($old!=$avatar_url)) @unlink(get_custom_file_base().'/'.rawurldecode($old)); $GLOBALS['FORUM_DB']->query_update('f_members',array('m_avatar_url'=>$avatar_url),array('id'=>$member_id),'',1); // Decache from run-time cache unset($GLOBALS['FORUM_DRIVER']->MEMBER_ROWS_CACHED[$member_id]); unset($GLOBALS['MEMBER_CACHE_FIELD_MAPPINGS'][$member_id]); } /** * Edit a member's photo, and check validity. * * @param ID_TEXT The identifier for the name of the posted URL field. * @param ID_TEXT The identifier for the name of the posted upload. * @param ?MEMBER The member (NULL: the current member). */ function ocf_member_choose_photo($param_name,$upload_name,$member_id=NULL) { if (is_null($member_id)) $member_id=get_member(); require_code('uploads'); if (((!array_key_exists($upload_name,$_FILES)) || (!is_swf_upload()) && (!is_uploaded_file($_FILES[$upload_name]['tmp_name'])))) { $old=$GLOBALS['FORUM_DB']->query_value('f_members','m_photo_url',array('id'=>$member_id)); $x=post_param($param_name,''); if (($x!='') && (url_is_local($x))) { if (!$GLOBALS['FORUM_DRIVER']->is_super_admin(get_member())) { if ($old!=$x) access_denied('ASSOCIATE_EXISTING_FILE'); } } if ($old==$x) return; // Not changed, bomb out as we don't want to generate a thumbnail, or copy to avatar, or send notification } // Find photo URL $urls=get_url($param_name,$upload_name,file_exists(get_custom_file_base().'/uploads/photos')?'uploads/photos':'uploads/ocf_photos',0,OCP_UPLOAD_IMAGE,true,'thumb_'.$param_name,$upload_name.'2',false,true); if (!(strlen($urls[0])>1)) { $urls[1]=''; } if (((get_base_url()!=get_forum_base_url()) || ((array_key_exists('on_msn',$GLOBALS['SITE_INFO'])) && ($GLOBALS['SITE_INFO']['on_msn']=='1'))) && ($urls[0]!='') && (url_is_local($urls[0]))) $urls[0]=get_base_url().'/'.$urls[0]; if (((get_base_url()!=get_forum_base_url()) || ((array_key_exists('on_msn',$GLOBALS['SITE_INFO'])) && ($GLOBALS['SITE_INFO']['on_msn']=='1'))) && ($urls[1]!='') && (url_is_local($urls[1]))) $urls[1]=get_base_url().'/'.$urls[1]; // At this point in the code, we know a photo was uploaded or changed to blank. // If we don't have GD, we need them to have uploaded a thumbnail too. if ((get_option('is_on_gd')=='0') || (!function_exists('imagetypes'))) { if (((!array_key_exists($upload_name.'2',$_FILES)) || (!is_swf_upload()) && (!is_uploaded_file($_FILES[$upload_name.'2']['tmp_name'])))) { $field=post_param('thumb_'.$param_name,''); if (($field=='') && ($urls[0]!='')) warn_exit(do_lang_tempcode('IMPROPERLY_FILLED_IN_UPLOAD')); if (($field!='') && (url_is_local($field)) && (!$GLOBALS['FORUM_DRIVER']->is_super_admin(get_member()))) { $old=$GLOBALS['FORUM_DB']->query_value('f_members','m_photo_thumb_url',array('id'=>$member_id)); if ($old!=$field) access_denied('ASSOCIATE_EXISTING_FILE'); } } } // Cleanup old photo $old=$GLOBALS['FORUM_DB']->query_value('f_members','m_photo_url',array('id'=>$member_id)); if ($old==$urls[0]) return; if ((url_is_local($old)) && ((substr($old,0,19)=='uploads/ocf_photos/') || (substr($old,0,15)=='uploads/photos/'))) @unlink(get_custom_file_base().'/'.rawurldecode($old)); $GLOBALS['FORUM_DB']->query_update('f_members',array('m_photo_url'=>$urls[0],'m_photo_thumb_url'=>$urls[1]),array('id'=>$member_id),'',1); require_code('notifications'); dispatch_notification('ocf_choose_photo',NULL,do_lang('CHOOSE_PHOTO_SUBJECT',$GLOBALS['FORUM_DRIVER']->get_username($member_id),NULL,NULL,get_lang($member_id)),do_lang('CHOOSE_PHOTO_BODY',$urls[0],$urls[1],$GLOBALS['FORUM_DRIVER']->get_username($member_id),get_lang($member_id))); // If no avatar, or default avatar, or avatars not installed, use photo for it $avatar_url=$GLOBALS['FORUM_DRIVER']->get_member_avatar_url($member_id); $default_avatar_url=find_theme_image('ocf_default_avatars/default',true,true); if (/*($avatar_url=='') || ($avatar_url==$default_avatar_url) || */(!addon_installed('ocf_avatars'))) { $avatar_url=$urls[0]; if ((get_option('is_on_gd')=='1') && (function_exists('imagetypes'))) { $stub=url_is_local($avatar_url)?(get_complex_base_url($avatar_url).'/'):''; $file_path=convert_url_to_path($stub.$avatar_url); if (!is_null($file_path)) { $new_file_path=str_replace('/ocf_photos/','/ocf_avatars/',$file_path); if (!file_exists($new_file_path)) { copy($file_path,$new_file_path); fix_permissions($new_file_path); sync_file($new_file_path); } $avatar_url=str_replace('/ocf_photos/','/ocf_avatars/',$avatar_url); } } ocf_member_choose_avatar($avatar_url,$member_id); } // Decache from run-time cache unset($GLOBALS['FORUM_DRIVER']->MEMBER_ROWS_CACHED[$member_id]); unset($GLOBALS['MEMBER_CACHE_FIELD_MAPPINGS'][$member_id]); } /** * Update cacheing against a member's username. This doesn't change the username in the actual member record -- it is assumed that this will be done elsewhere. * * @param MEMBER The member ID. * @param ID_TEXT The new username that is being set for them. */ function update_member_username_caching($member_id,$username) { // Fix cacheing for usernames $to_fix=array( 'f_forums/f_cache_last_username/f_cache_last_member_id', 'f_posts/p_poster_name_if_guest/p_poster', 'f_topics/t_cache_first_username/t_cache_first_member_id', 'f_topics/t_cache_last_username/t_cache_last_member_id', 'sessions/cache_username/the_user', ); foreach ($to_fix as $fix) { list($table,$field,$updating_field)=explode('/',$fix,3); $con=$GLOBALS[(substr($table,0,2)=='f_')?'FORUM_DB':'SITE_DB']; $con->query_update($table,array($field=>$username),array($updating_field=>$member_id)); } }