Skocz do zawartości
"Idzie nowe..." - o zmianach i nie tylko ×
Przeniesienie zakupów z IPS Marketplace / Moving bought items from IPS Marketplace ×

pawel7121

Użytkownik
  • Postów

    552
  • Dołączył

  • Ostatnia wizyta

Treść opublikowana przez pawel7121

  1. Nic nie mam, ale jak dla mnie to idiotyczne. Wgrałeś wszystkie pliki na FTP?
  2. Nie dałeś przed </span> zakończenia a href czyli </a>.
  3. skay, mam pytanie, masz ubaw z tego, że dodajesz do wszystkiego stopkę? Przecież to sztywny kod HTML, nawet nie ma gameq. Jak można się pod takim czymś podpisać? A sidebar? to też sztywny kod HTML + hook global sidebar czy jakiś inny do sidebarów. Co do tematu: o tak powinna wyglądać poprawna konfiguracja hooku
  4. Date: Wed, 31 Jul 2013 10:40:35 +0000 Error: 1146 - Table 'fuj_com._postacie' doesn't exist IP Address: 178.23.106.90 - /user/1-pgmajster/?tab=characters ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- mySQL query error: SELECT COUNT(*) AS num_rows FROM _postacie WHERE Online = 1 .--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------. | File | Function | Line No. | |----------------------------------------------------------------------------+-------------------------------------------------------------------------------+-------------------| | web/applications_addon/other/majster/sources/classes/core.php | [core].loadOnlinePlayersAmount | 1 | '----------------------------------------------------------------------------+-------------------------------------------------------------------------------+-------------------' | web/applications_addon/other/majster/extensions/profileTabs/characters.php | [core].__construct | 26 | '----------------------------------------------------------------------------+-------------------------------------------------------------------------------+-------------------' | web/applications/members/modules_public/profile/view.php | [profile_characters].return_html_block | 479 | '----------------------------------------------------------------------------+-------------------------------------------------------------------------------+-------------------' | web/applications/members/modules_public/profile/view.php | [public_members_profile_view]._viewModern | 64 | '----------------------------------------------------------------------------+-------------------------------------------------------------------------------+-------------------' | web/sources/base/ipsController.php | [public_members_profile_view].doExecute | 306 | '----------------------------------------------------------------------------+-------------------------------------------------------------------------------+-------------------' Więc o tabele chodzi, pomyślę trochę nad tym. Temat nie zamykać, zawieszam go.
  5. Witam, stworzyłem coś takiego jak miałem, lecz to mi nie wystarcza i zacząłem pisać inną appkę, ale za to też nie umie się zabrać. Napisałem w profileTabs aplikacji character.php, który zawiera: [long] <?php define( 'RP_PREFIX', '_'); class profile_characters extends profile_plugin_parent { private $template = ''; private $profile = array(); private $character = array(); /** * Feturn HTML block * * @access public * @param array Member information * @return string HTML block */ public function return_html_block( $profile = array() ) { $this->profile = $profile; try { $classToLoad = IPSLib::loadLibrary( IPSLib::getAppDir( 'majster' ) . '/sources/classes/core.php', 'core' ); $this->registry->setClass( 'core', new $classToLoad( $this->registry ) ); } catch( Exception $error ) { IPS_exception_error( $error ); } if( isset( $this->request['newCharacter'] ) ) { $this->newCharacterView(); } else { $this->allCharactersView(); } return $this->template; } private function allCharactersView() { $characters = $this->registry->getClass( 'core' )->getCharactersOfMember( $this->profile['member_id'] ); $this->template = $this->registry->output->getTemplate( 'majster' )->profileTabCharacters_AllCharacters( $characters, $this->profile ); } private function newCharacterView() { try { $classToLoad = IPSLib::loadLibrary( IPSLib::getAppDir( 'majster' ) . '/sources/classes/newCharacter.php', 'newCharacter' ); $this->registry->setClass( 'newCharacter', new $classToLoad( $this->registry ) ); } catch( Exception $error ) { IPS_exception_error( $error ); } $this->template = $this->registry->output->getTemplate( 'majster' )->pageTabCharacters_newCharacter(); } } ?> [/long] I troche tam w stylu, gdy będzie trzeba pokaże. Gdy wchodzę w zakładkę w profilu wyskakuje driver error http://i.imgur.com/Sb0YU8m.png Co poradzicie? Żadnego połączenia MySQL nie robiłem, a w kodzie pomagał kolega
  6. Robiłeś już temat. http://forum.invisionize.pl/topic/39253-podgrupa-w-grupe/?hl=soplica+podgrupy No ale ok, DawPi dość dawno to napisałeś Łap: http://forum.invisionize.pl/topic/34990-edycja-grup/
  7. Domena za free... Nie podłączyłeś domeny pod hosting, możliwe, że wpisałeś błędne DNSy lub jak to napisał kolega wyżej, ktoś trzeci zmienił Tobie dane.
  8. ACP Ustawienia General Configuration Debug level Ustaw na 1: Show [...]
  9. Może to wina nulleda? Jakiegoś 'niedopracowanego' może ściągnąłeś.
  10. Może ten. http://community.invisionpower.com/files/file/5955-ipb-shoutbox/
  11. Możliwe, że masz starą wersję shoutboxa. PS. Naucz się poprawnie pisać po polsku.
  12. masz tak ustawione?
  13. Sprawdź czy w ACP w edycji profilu nie ustawiłeś, aby można było korzystać z kodów HTML.
  14. Daj link do forum to zobaczymy.
  15. Ta po rusku to kopia Portka, nie ściągajcie. Golus robił taką tabele, była wyczepista. Może jak się z nim skontaktujecie to da Wam
  16. Ten kod co podał @MisieKPS to tylko sztywny kod. Nawet nie pokazuje ilości graczy będących na serwerze...
  17. Ok, więc zrobiłem wszystko od nowa, lecz nie zrobiłem nowej zakładki tylko podłączyłem pod Profile Customization. Zrobiłem, zapis do bazy jest. Wyświetlam poprzez: {$this->memberData['minecraft']}. Dziękuje Mac i DawPi za pomoc, zamykam.
  18. Dziś w nocy bym odpisał, ale już zmęczony byłem. Jak wnowić wykonywanie strony? Chodzi mi tylko o tą zakładkę w ustawieniach, odczyt już będę mniej więcej wiedział jak zrobić. A ta zakładka byle by była pusta i wiedziałbym gdzie mam wklepać mój kod ;p
  19. Faktycznie, była do public function formMinecraft() { Lecz nie zauważyłem na końcu zamykającej do tej funkcji. W kodzie Mac poprawił i działa wyświetlanie edycji profilu, lecz zakładki nie ma.
  20. Klamry są do pary. Dziękuje Mac, lecz nie wyświetla mi się zakładka "Minecraft" w panelu bocznym nie wiem jaki kod za to odpowiada.
  21. Skopiowałem z sygnatury kod na wyświetlanie i zedytowałem na minecraft pages. /** * Show the minecraft pages * * @author PGmajster * @return string Processed HTML */ public function formMinecraft() { /* Load editor stuff */ $classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/classes/editor/composite.php', 'classes_editor_composite' ); $this->editor = new $classToLoad(); /* HTML checkbox language strings */ $this->registry->getClass('class_localization')->loadLanguageFile( array( 'public_post' ), 'forums' ); //----------------------------------------- // Check to make sure that we can edit profiles.. //----------------------------------------- if ( ! $this->memberData['g_edit_profile'] AND ! $this->memberData['g_minecraft_unit'] ) { $this->registry->getClass('output')->showError( 'members_profile_disabled', 1024, null, null, 403 ); } if( $form['_noPerm'] ) { return $this->registry->getClass('output')->getTemplate('ucp')->membersMinecraftFormError( $form ); } } /* Set content in editor */ $this->editor->setAllowBbcode( true ); $this->editor->setAllowSmilies( true ); $this->editor->setAllowHtml( $this->memberData['g_dohtml'] ); $this->editor->setIsHtml( $this->memberData['bw_html_minecraft'] ); $this->editor->setBbcodeSection('minecraft'); $this->editor->setContent( $this->memberData['minecraft'] ); /* Load parser */ $classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/classes/text/parser.php', 'classes_text_parser' ); $parser = new $classToLoad(); $parser->set( array( 'memberData' => $this->memberData, 'parseBBCode' => 1, 'parseHtml' => ( $this->memberData['g_dohtml'] && $this->memberData['bw_html_minecraft'] ), 'parseArea' => 'minecraft', 'parseEmoticons' => 1 ) ); $minecraft = $parser->display( $this->memberData['minecraft'] ); return $this->registry->getClass('output')->getTemplate('ucp')->membersSignatureForm( $this->editor->show( 'Post', array( 'noSmilies' => false ) ), $minecraft ); } również zapis skopiowałem z sygnatury i zedytowałem na minecrafta /** * UserCP Save Form: Minecraft * * @return array Errors */ public function saveMinecraft() { /* Load editor stuff */ $classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/classes/editor/composite.php', 'classes_editor_composite' ); $this->editor = new $classToLoad(); $this->editor->setLegacyMode(false); $isHtml = intval( $this->request['minecraft_htmlstatus'] ); //----------------------------------------- // Check to make sure that we can edit profiles.. //----------------------------------------- if ( ! $this->memberData['g_edit_profile'] AND ! $this->memberData['g_minecraft_unit'] ) ) { $this->registry->getClass('output')->showError( 'members_profile_disabled', 1028, null, null, 403 ); } //----------------------------------------- // Post process the editor // Now we have safe HTML and bbcode //----------------------------------------- /* Set content in editor */ $this->editor->setAllowBbcode( true ); $this->editor->setAllowSmilies( true ); $this->editor->setIsHtml( $this->memberData['g_dohtml'] && $isHtml ); $this->editor->setBbcodeSection('minecraft'); $this->editor->setContent( $this->memberData['minecraft'] ); $minecraft = $this->editor->process( $_POST['Post'] ); //----------------------------------------- // Parse post //----------------------------------------- /* Load parser */ $classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/classes/text/parser.php', 'classes_text_parser' ); $parser = new $classToLoad(); $parser->testForParsingLimits( $minecraft, array( 'quote', 'emoticons', 'urls' ) ); if ( is_array( $parser->getErrors() ) && count( $parser->getErrors() ) ) { $this->lang->loadLanguageFile( array( 'public_post' ), 'forums' ); $_error = array_pop( $parser->getErrors() ); $this->registry->getClass('output')->showError( $_error, 10210 ); } //----------------------------------------- // Signature restrictions... //----------------------------------------- $minecraft_errors = array(); $minecraft = preg_replace( '#^\s*(</p>)+#i', '', $minecraft ); $minecraft = preg_replace( '#(</p>)+?\s*$#i', '', $minecraft ); if( count($minecraft_errors) ) { $this->registry->getClass('output')->showError( implode( '<br />', $minecraft_errors ), 10211 ); } /* Save HTML status */ $members_bitoptions = IPSBWOptions::thaw( $this->memberData['members_bitoptions'], 'members', 'global' ); $members_bitoptions['bw_html_minecraft'] = $isHtml; //----------------------------------------- // Write it to the DB. //----------------------------------------- IPSMember::save( $this->memberData['member_id'], array( 'members' => $members_bitoptions, 'extendedProfile' => array( 'minecraft' => $minecraft ) ) ); /* Update cache */ IPSContentCache::update( $this->memberData['member_id'], 'minecraft', $parser->display( $minecraft ) ); return TRUE; } Zostało wiele po resistance sygnaturki, tzn. ustawienia, które są w ACP. (Max lini, obrazków itd.) Spróbowałem usunąć większość ale pewnie zostało jeszcze.
  22. błąd wyświetla się pod adresem http://mojastrona.pl/index.php?app=core&module=usercp Kod błędu: Parse error: syntax error, unexpected T_VARIABLE, expecting T_FUNCTION in /home/u121283872/public_html/upload/admin/applications/core/extensions/usercpForms.php on line 1306 Linijka 1306 to ta z parsem, który podałem wcześniej.
  23. Wszystko [long] <?php /** * <pre> * Invision Power Services * IP.Board v3.4.5 * Core user control panel plugin * Last Updated: $Date: 2013-05-02 17:05:35 -0400 (Thu, 02 May 2013) $ * </pre> * * @author $Author: bfarber $ * @copyright © 2001 - 2009 Invision Power Services, Inc. * @license http://www.invisionpower.com/company/standards.php#license * @package IP.Board * @subpackage Core * @link http://www.invisionpower.com * @since 20th February 2002 * @version $Rev: 12216 $ * */ if ( ! defined( 'IN_IPB' ) ) { print "<h1>Incorrect access</h1>You cannot access this file directly. If you have recently upgraded, make sure you upgraded all the relevant files."; exit(); } class usercpForms_core extends public_core_usercp_manualResolver implements interface_usercp { /** * Tab name * This can be left blank and the application title will * be used * * @var string */ public $tab_name = "Settings"; /** * Default area code * * @var string */ public $defaultAreaCode = 'profileinfo'; /** * OK Message * This is an optional message to return back to the framework * to replace the standard 'Settings saved' message * * @var string */ public $ok_message = ''; /** * Hide 'save' button and form elements * Useful if you have custom output that doesn't * need to use it * * @var bool */ public $hide_form_and_save_button = false; /** * If you wish to allow uploads, set a value for this * * @var integer */ public $uploadFormMax = 0; /** * Flag to indicate that the user is a facebook logged in user doozer * * @var boolean */ protected $_isFBUser = false; /** * Flag to indicate compatibility * * @var int */ public $version = 32; /** * Initiate this module * * @return @e void */ public function init( ) { $this->tab_name = ipsRegistry::getClass('class_localization')->words['tab__core']; /* Facebook? */ if ( IPSLib::fbc_enabled() === TRUE AND $this->memberData['fb_uid'] ) { $this->_isFBUser = true; } if( !$this->memberData['g_edit_profile'] ) { $this->defaultAreaCode = 'email'; } } /** * Return links for this tab * You may return an empty array or FALSE to not have * any links show in the tab. * * The links must have 'area=xxxxx'. The rest of the URL * is added automatically. * 'area' can only be a-z A-Z 0-9 - _ * * @author Matt Mecham * @return array Links */ public function getLinks() { ipsRegistry::instance()->getClass('class_localization')->loadLanguageFile( array( 'public_usercp' ), 'core' ); $array = array(); if( $this->memberData['g_edit_profile'] ) { $array[] = array( 'url' => 'area=profileinfo', 'title' => ipsRegistry::instance()->getClass('class_localization')->words['change_settings'], 'active' => $this->request['tab'] == 'core' && $this->request['area'] == 'profileinfo' ? 1 : 0, 'area' => 'profileinfo' ); } if ( $this->memberData['gbw_allow_customization'] AND ! $this->memberData['bw_disable_customization'] ) { $array[] = array( 'url' => 'area=customize', 'title' => ipsRegistry::instance()->getClass('class_localization')->words['m_customize'], 'active' => $this->request['tab'] == 'core' && $this->request['area'] == 'customize' ? 1 : 0, 'area' => 'customize' ); } $array[] = array( 'url' => 'area=email', 'title' => ipsRegistry::instance()->getClass('class_localization')->words['m_email_pass_change'], 'active' => $this->request['tab'] == 'core' && $this->request['area'] == 'email' ? 1 : 0, 'area' => 'email' ); if ( $this->settings['auth_allow_dnames'] == 1 AND $this->memberData['g_dname_changes'] != 0 ) { $array[] = array( 'url' => 'area=displayname', 'title' => ipsRegistry::instance()->getClass('class_localization')->words['ucp_change_name'], 'active' => $this->request['tab'] == 'core' && $this->request['area'] == 'displayname' ? 1 : 0, 'area' => 'displayname' ); } $sig_restrictions = explode( ':', $this->memberData['g_signature_limits'] ); if ( ( ! $sig_restrictions[0] OR ( $sig_restrictions[0] AND $this->memberData['g_sig_unit'] ) ) AND $this->memberData['g_edit_profile'] ) { $array[] = array( 'url' => 'area=signature', 'title' => ipsRegistry::instance()->getClass('class_localization')->words['m_sig_info'], 'active' => $this->request['tab'] == 'core' && $this->request['area'] == 'signature' ? 1 : 0, 'area' => 'signature' ); } $array[] = array( 'url' => 'area=ignoredusers', 'title' => ipsRegistry::instance()->getClass('class_localization')->words['m_ignore_users'], 'active' => $this->request['tab'] == 'core' && $this->request['area'] == 'ignoredusers' ? 1 : 0, 'area' => 'ignoredusers' ); if ( IPSLib::fbc_enabled() === TRUE ) { $array[] = array( 'url' => 'area=facebook', 'title' => ipsRegistry::instance()->getClass('class_localization')->words['m_facebook'], 'active' => $this->request['tab'] == 'core' && $this->request['area'] == 'facebook' ? 1 : 0, 'area' => 'facebook' ); } if ( IPSLib::twitter_enabled() === TRUE ) { $array[] = array( 'url' => 'area=twitter', 'title' => ipsRegistry::instance()->getClass('class_localization')->words['m_twitter'], 'active' => $this->request['tab'] == 'core' && $this->request['area'] == 'twitter' ? 1 : 0, 'area' => 'twitter' ); } if ( $this->memberData['g_attach_max'] != -1 ) { $array[] = array( 'url' => 'area=attachments', 'title' => ipsRegistry::instance()->getClass('class_localization')->words['m_attach'], 'active' => $this->request['tab'] == 'core' && $this->request['area'] == 'attachments' ? 1 : 0, 'area' => 'attachments' ); } $array[] = array( 'url' => 'area=notifications', 'title' => ipsRegistry::instance()->getClass('class_localization')->words['m_notifications'], 'active' => $this->request['tab'] == 'core' && $this->request['area'] == 'notifications' ? 1 : 0, 'area' => 'notifications' ); $array[] = array( 'url' => 'area=notificationlog', 'title' => ipsRegistry::instance()->getClass('class_localization')->words['m_arch_notify'], 'active' => ( in_array( $this->request['area'], array( 'notificationlog', 'viewNotification', 'removeNotifications' ) ) ) ? 1 : 0, 'area' => 'notificationlog' ); return $array; } /** * Run custom event * * If you pass a 'do' in the URL / post form that is not either: * save / save_form or show / show_form then this function is loaded * instead. You can return a HTML chunk to be used in the UserCP (the * tabs and footer are auto loaded) or redirect to a link. * * If you are returning HTML, you can use $this->hide_form_and_save_button = 1; * to remove the form and save button that is automatically placed there. * * @author Matt Mecham * @param string Current area * @return mixed html or void */ public function runCustomEvent( $currentArea ) { //----------------------------------------- // INIT //----------------------------------------- $html = ''; //----------------------------------------- // What to do? //----------------------------------------- switch( $currentArea ) { case 'removeIgnoredUser': return $this->customEvent_removeIgnoredUser(); break; case 'toggleIgnoredUser': return $this->customEvent_toggleIgnoredUser(); break; case 'facebookSync': $html = $this->customEvent_facebookSync(); break; case 'facebookRemove': $html = $this->customEvent_facebookRemove(); break; case 'twitterRemove': $html = $this->customEvent_twitterRemove(); break; case 'facebookLink': $html = $this->customEvent_facebookLink(); break; case 'updateAttachments': return $this->customEvent_updateAttachments(); break; case 'viewNotification': $html = $this->customEvent_viewNotification(); break; case 'markNotification': return $this->customEvent_markNotification(); break; case 'removeNotifications': return $this->customEvent_removeNotifications(); break; } //----------------------------------------- // Turn off save button //----------------------------------------- $this->hide_form_and_save_button = 1; //----------------------------------------- // Return //----------------------------------------- return $html; } /** * Delete attachments * * @author Matt Mecham * @return string Processed HTML */ public function customEvent_updateAttachments() { //----------------------------------------- // Get the ID's to delete //----------------------------------------- $finalIDs = array(); //----------------------------------------- // Grab post IDs //----------------------------------------- if ( is_array( $_POST['attach'] ) and count( $_POST['attach'] ) ) { foreach( $_POST['attach'] as $id => $value ) { $finalIDs[ $id ] = intval( $id ); } } if ( count($finalIDs) > 0 ) { $this->DB->build( array( 'select' => 'a.*', 'from' => array( 'attachments' => 'a' ), 'where' => "a.attach_id IN (" . implode( ",", $finalIDs ) .") AND a.attach_rel_module IN( 'post', 'msg' ) AND attach_member_id=" . $this->memberData['member_id'], 'add_join' => array( array( 'select' => 'p.topic_id, p.pid', 'from' => array( 'posts' => 'p' ), 'where' => "p.pid=a.attach_rel_id AND a.attach_rel_module='post'", 'type' => 'left' ), array( 'select' => 'mt.msg_id, mt.msg_topic_id', 'from' => array( 'message_posts' => 'mt' ), 'where' => "mt.msg_id=a.attach_rel_id AND a.attach_rel_module='msg'", 'type' => 'left' ), ) ) ); $o = $this->DB->execute(); while ( $killmeh = $this->DB->fetch( $o ) ) { if ( $killmeh['attach_location'] ) { @unlink( $this->settings['upload_dir']."/".$killmeh['attach_location'] ); } if ( $killmeh['attach_thumb_location'] ) { @unlink( $this->settings['upload_dir']."/".$killmeh['attach_thumb_location'] ); } if ( $killmeh['topic_id'] ) { $this->DB->update( 'topics', 'topic_hasattach=topic_hasattach-1', 'tid='.$killmeh['topic_id'], true, true ); } else if( $killmeh['msg_id'] ) { $this->DB->update( 'message_topics', 'mt_hasattach=mt_hasattach-1', 'mt_id='.$killmeh['msg_topic_id'], true, true ); } } $this->DB->delete( 'attachments', 'attach_id IN ('.implode(",",$finalIDs).') and attach_member_id='.$this->memberData['member_id'] ); } $this->registry->getClass('output')->silentRedirect( $this->settings['base_url']."app=core&module=usercp&tab=core&area=attachments&do=show" ); } /** * UserCP handle our notifications * * @return boolean Successful */ public function customEvent_removeNotifications() { //----------------------------------------- // Check form hash //----------------------------------------- $this->request['secure_key'] = $this->request['secure_key'] ? $this->request['secure_key'] : $this->request['md5check']; if( $this->request['secure_key'] != $this->member->form_hash ) { $this->registry->output->showError( 'usercp_forums_bad_key', 1021523 ); } //----------------------------------------- // Notifications library //----------------------------------------- $classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . '/sources/classes/member/notifications.php', 'notifications' ); $notifyLibrary = new $classToLoad( $this->registry ); $notifyLibrary->setMember( $this->memberData ); //----------------------------------------- // Delete the notifications //----------------------------------------- $_toDelete = IPSLib::cleanIntArray( $this->request['notifications'] ); if( !count($_toDelete) ) { return $this->showInlineNotifications( $this->lang->words['no_notify_del'] ); } $this->DB->delete( 'inline_notifications', "notify_id IN(" . implode( ',', $_toDelete ) . ") AND notify_to_id=" . $this->memberData['member_id'] ); //----------------------------------------- // If member has 'unread' count, rebuild count //----------------------------------------- if( $this->memberData['notification_cnt'] ) { $notifyLibrary->rebuildUnreadCount(); } //----------------------------------------- // Redirect //----------------------------------------- $this->registry->getClass('output')->silentRedirect( $this->settings['base_url']."app=core&module=usercp&tab=core&area=notificationlog&confirm=1" ); } /** * Mark a notification * * @return string HTML */ public function customEvent_markNotification() { //----------------------------------------- // Notifications library //----------------------------------------- $classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . '/sources/classes/member/notifications.php', 'notifications' ); $notifyLibrary = new $classToLoad( $this->registry ); $notifyLibrary->setMember( $this->memberData ); //----------------------------------------- // Get notification //----------------------------------------- /* Marking them all as read? */ if ( $this->request['mark'] == 'all' ) { $this->DB->update( 'inline_notifications', array( 'notify_read' => time() ), 'notify_to_id=' . $this->memberData['member_id'] ); } else { $id = intval($this->request['mark']); $notification = $this->DB->buildAndFetch( array( 'select' => '*', 'from' => 'inline_notifications', 'where' => 'notify_id=' . $id ) ); //----------------------------------------- // Error checking //----------------------------------------- if( !$notification['notify_id'] ) { if( $this->request['ajax'] ) { print 'ok'; exit; } else { $this->registry->getClass('output')->silentRedirect( $this->settings['base_url'] . "app=core&module=usercp&tab=core&area=notificationlog" ); } } if( $notification['notify_to_id'] != $this->memberData['member_id'] ) { if( $this->request['ajax'] ) { print 'ok'; exit; } else { $this->registry->getClass('output')->silentRedirect( $this->settings['base_url'] . "app=core&module=usercp&tab=core&area=notificationlog" ); } } //----------------------------------------- // Update read timestamp //----------------------------------------- $this->DB->update( 'inline_notifications', array( 'notify_read' => time() ), 'notify_id=' . $id ); } //----------------------------------------- // If member has 'unread' count, rebuild count //----------------------------------------- if( $this->memberData['notification_cnt'] ) { $notifyLibrary->rebuildUnreadCount(); } if( $this->request['ajax'] ) { print 'ok'; exit; } else { $this->registry->output->silentRedirect( $this->settings['base_url'] . "app=core&module=usercp&tab=core&area=notificationlog" ); } } /** * View a notification * * @return string HTML */ public function customEvent_viewNotification() { //----------------------------------------- // Notifications library //----------------------------------------- $classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . '/sources/classes/member/notifications.php', 'notifications' ); $notifyLibrary = new $classToLoad( $this->registry ); $notifyLibrary->setMember( $this->memberData ); //----------------------------------------- // Get notification //----------------------------------------- $id = intval($this->request['view']); $notification = $this->DB->buildAndFetch( array( 'select' => '*', 'from' => 'inline_notifications', 'where' => 'notify_id=' . $id ) ); //----------------------------------------- // Error checking //----------------------------------------- if( !$notification['notify_id'] ) { $this->registry->output->showError( 'bad_notify_id', 10191 ); } if( $notification['notify_to_id'] != $this->memberData['member_id'] ) { $this->registry->output->showError( 'bad_notify_id', 10192 ); } //----------------------------------------- // Update read timestamp //----------------------------------------- $this->DB->update( 'inline_notifications', array( 'notify_read' => time() ), 'notify_id=' . $id ); //----------------------------------------- // If member has 'unread' count, rebuild count //----------------------------------------- if( $this->memberData['notification_cnt'] ) { $notifyLibrary->rebuildUnreadCount(); } //----------------------------------------- // Parse for display //----------------------------------------- /* As the email template parser makes an attempt to reparse 'safe' HTML, we need to make it safe here */ $notification['notify_text'] = IPSText::htmlspecialchars( $notification['notify_text'] ); IPSText::getTextClass('bbcode')->parse_smilies = 1; IPSText::getTextClass('bbcode')->parse_nl2br = 1; IPSText::getTextClass('bbcode')->parse_html = 0; IPSText::getTextClass('bbcode')->parse_bbcode = 1; IPSText::getTextClass('bbcode')->parsing_section = 'global'; $notification['notify_text'] = IPSText::getTextClass('bbcode')->preDisplayParse( nl2br( $notification['notify_text'] ) ); //----------------------------------------- // Show notification //----------------------------------------- $this->_nav[] = array( $this->lang->words['m_arch_notify'], 'app=core&module=usercp&tab=core&area=notificationlog' ); return $this->registry->getClass('output')->getTemplate('ucp')->showNotification( $notification ); } /** * Custom Event: Remove Twitter link * * @return @e void */ public function customEvent_twitterRemove() { //----------------------------------------- // Check secure hash... //----------------------------------------- if ( $this->request['secure_key'] != $this->member->form_hash ) { $this->registry->output->showError( 'authorization_error', 100, true, null, 403 ); } //----------------------------------------- // Okay... //----------------------------------------- if ( $this->memberData['twitter_id'] ) { /* Remove the link */ IPSMember::save( $this->memberData['member_id'], array( 'core' => array( 'twitter_id' => 0, 'twitter_token' => '', 'twitter_secret' => '' ) ) ); } /* Log the user out */ $this->registry->getClass('output')->silentRedirect( $this->settings['base_url']."app=core&module=global&section=login&do=logout&k=" . $this->member->form_hash ); } /** * Custom Event: Create facebook link * * @return @e void */ public function customEvent_facebookLink() { //----------------------------------------- // Check secure hash... //----------------------------------------- if ( $this->request['secure_key'] != $this->member->form_hash ) { $this->registry->output->showError( 'authorization_error', 100, true, null, 403 ); } /* Load application */ $classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/classes/facebook/connect.php', 'facebook_connect' ); $facebook = new $classToLoad( $this->registry ); try { $facebook->linkMember( $this->memberData['member_id'] ); } catch( Exception $error ) { $msg = $error->getMessage(); switch( $msg ) { default: case 'NO_FACEBOOK_USER_LOGGED_IN': case 'ALREADY_LINKED': $this->registry->getClass('output')->showError( 'fbc_authorization_screwup', 1005.99, null, null, 403 ); break; } } //----------------------------------------- // Return //----------------------------------------- $this->registry->getClass('output')->silentRedirect( $this->settings['base_url']."app=core&module=usercp&tab=core&area=facebook&do=show" ); } /** * Custom Event: Remove facebook link * * @return @e void */ public function customEvent_facebookRemove() { //----------------------------------------- // Check secure hash... //----------------------------------------- if ( $this->request['secure_key'] != $this->member->form_hash ) { $this->registry->output->showError( 'authorization_error', 100, true, null, 403 ); } $classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/classes/facebook/connect.php', 'facebook_connect' ); $facebook = new $classToLoad( $this->registry ); //----------------------------------------- // Okay... //----------------------------------------- if ( $this->memberData['fb_uid'] ) { /* Unauthorize application */ $facebook->revokeAuthorization(); /* Remove the link */ IPSMember::save( $this->memberData['member_id'], array( 'core' => array( 'fb_uid' => 0, 'fb_emailhash' => '', 'fb_token' => '', 'fb_lastsync' => 0 ) ) ); } /* Log the user out */ $this->registry->getClass('output')->silentRedirect( $this->settings['base_url']."app=core&module=global&section=login&do=logout&k=" . $this->member->form_hash ); } /** * Custom Event: Sync up facebook * NO LONGER USED. LEFT FOR FIX CONFIRMATION * * @return @e void */ public function customEvent_facebookSync() { if ( IPSLib::fbc_enabled() === TRUE ) { $classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/classes/facebook/connect.php', 'facebook_connect' ); $facebook = new $classToLoad( $this->registry ); try { $facebook->syncMember( $this->memberData ); } catch( Exception $error ) { $msg = $error->getMessage(); switch( $msg ) { case 'NOT_LINKED': case 'NO_MEMBER': default: $this->registry->getClass('output')->showError( 'fbc_authorization_screwup', 1005, null, null, 403 ); break; } } //----------------------------------------- // Return //----------------------------------------- $this->registry->getClass('output')->silentRedirect( $this->settings['base_url']."app=core&module=usercp&tab=core&area=facebook&do=show" ); } } /** * Custom Event: Run the find user tool * * @return @e void */ public function customEvent_toggleIgnoredUser() { //----------------------------------------- // INIT //----------------------------------------- $member_id = intval( $this->request['id'] ); $field = $this->request['field']; $update = array(); //----------------------------------------- // Grab user //----------------------------------------- $ignoredUser = $this->DB->buildAndFetch( array( 'select' => '*', 'from' => 'ignored_users', 'where' => 'ignore_ignore_id=' . $member_id . ' AND ignore_owner_id=' . $this->memberData['member_id'] ) ); if ( $ignoredUser['ignore_id'] ) { switch( $field ) { default: case 'topics': $update = array( 'ignore_topics' => ( $ignoredUser['ignore_topics'] == 1 ) ? 0 : 1 ); break; case 'messages': $update = array( 'ignore_messages' => ( $ignoredUser['ignore_messages'] == 1 ) ? 0 : 1 ); break; case 'signatures': $update = array( 'ignore_signatures' => ( $ignoredUser['ignore_signatures'] == 1 ) ? 0 : 1 ); break; case 'minecraft': $update = array( 'ignore_minecraft' => ( $ignoredUser['ignore_minecraft'] == 1 ) ? 0 : 1 ); break; case 'chats': $update = array( 'ignore_chats' => ( $ignoredUser['ignore_chats'] == 1 ) ? 0 : 1 ); break; } //----------------------------------------- // Update //----------------------------------------- $this->DB->update( 'ignored_users', $update, 'ignore_id=' . $ignoredUser['ignore_id'] ); /* Rebuild cache */ IPSMember::rebuildIgnoredUsersCache( $this->memberData ); } //----------------------------------------- // Return //----------------------------------------- $this->registry->getClass('output')->silentRedirect( $this->settings['base_url']."app=core&module=usercp&tab=core&area=ignoredusers&do=show&st={$this->request['st']}" ); } /** * Custom event: Remove ignored user * * @author Matt Mecham * @return string Processed HTML */ public function customEvent_removeIgnoredUser() { //----------------------------------------- // INIT //----------------------------------------- $removeID = intval( $this->request['id'] ); $this->DB->delete( 'ignored_users', 'ignore_owner_id=' . $this->memberData['member_id'] . ' AND ignore_ignore_id=' . $removeID ); /* Rebuild cache */ IPSMember::rebuildIgnoredUsersCache( $this->memberData ); $this->registry->getClass('output')->silentRedirect( $this->settings['base_url']."app=core&module=usercp&tab=core&area=ignoredusers&do=show" ); } /** * UserCP Form Show * * @author Matt Mecham * @param string Current area as defined by 'get_links' * @param array Array of errors * @return string Processed HTML */ public function showForm( $current_area, $errors=array() ) { //----------------------------------------- // Where to go, what to see? //----------------------------------------- if( !$current_area AND !$this->memberData['g_edit_profile'] ) { $current_area = 'email'; } switch( $current_area ) { default: case 'profileinfo': return $this->formProfileInfo(); break; case 'signature': return $this->formSignature(); break; case 'photo': return $this->formPhoto(); break; case 'ignoredusers': return $this->formIgnoredUsers(); break; case 'facebook': return $this->formFacebook(); break; case 'twitter': return $this->formTwitter(); break; case 'customize': return $this->formCustomize(); break; case 'email': return $this->showFormEmailPassword(); break; case 'displayname': return $this->showFormDisplayname(); break; case 'attachments': return $this->showFormAttachments(); break; case 'notifications': return $this->showFormNotifications(); break; case 'notificationlog': return $this->showInlineNotifications(); break; } } /** * Show the customization form * * @author Matt Mecham * @param string Any inline message to show * @return string Processed HTML */ public function formCustomize( $inlineMsg='' ) { /* Allow uploads */ $this->uploadFormMax = 10000 * 1024; if ( ! $this->memberData['gbw_allow_customization'] OR $this->memberData['bw_disable_customization'] ) { $this->registry->getClass('output')->showError( 'no_permission', 1005.5 ); } /* Grab current options */ $options = IPSLib::safeUnserialize( $this->memberData['pp_customization'] ); $options = is_array( $options ) ? $options : array(); /* Build input */ foreach( $options as $k => $v ) { $input[ $k ] = ( $this->request[ $k ] ) ? $this->request[ $k ] : $v; } /* Figure out preview URL */ if ( $options['type'] == 'url' AND $options['bg_url'] ) { $input['_preview'] = $options['bg_url']; } else if ( $options['type'] == 'upload' AND $options['bg_url'] ) { $input['_preview'] = $this->settings['upload_url'] . '/' . $options['bg_url']; $input['bg_url'] = ''; } /* Show form */ return $this->registry->getClass('output')->getTemplate('ucp')->membersProfileCustomize( $options, $input, $inlineMsg ); } /** * Show the twitter form * * @author Matt Mecham * @param string Any inline message to show * @return string Processed HTML */ public function formTwitter( $inlineMsg='' ) { //----------------------------------------- // INIT //----------------------------------------- if( !IPSLib::twitter_enabled() ) { $this->registry->getClass('output')->showError( 'twitter_disabled', 1005.1 ); } //----------------------------------------- // Twitter user logged in? //----------------------------------------- $classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/classes/twitter/connect.php', 'twitter_connect' ); $twitter = new $classToLoad( $this->registry, $this->memberData['twitter_token'], $this->memberData['twitter_secret'] ); //----------------------------------------- // Thaw bitfield options //----------------------------------------- $bwOptions = IPSBWOptions::thaw( $this->memberData['tc_bwoptions'], 'twitter' ); //----------------------------------------- // Merge.. //----------------------------------------- if ( is_array( $bwOptions ) ) { foreach( $bwOptions as $k => $v ) { $this->memberData[ $k ] = $v; } } if( ! $twitter->isConnected() ) { $this->hide_form_and_save_button = 1; } $userData = $twitter->fetchUserData(); if ( isset( $userData['status']['text'] ) ) { if ( IPS_DOC_CHAR_SET != 'UTF-8' ) { $userData['status']['text'] = IPSText::utf8ToEntities( $userData['status']['text'] ); } /* Make safe */ $userData['status']['text'] = str_replace( array( '<', '>' ), array( '<', '>' ), $userData['status']['text'] ); } return $this->registry->getClass('output')->getTemplate('ucp')->membersTwitterConnect( $twitter->isConnected(), $userData ); } /** * Show the member form * * @author Matt Mecham * @param string Any inline message to show * @return string Processed HTML */ public function formFacebook( $inlineMsg='' ) { //----------------------------------------- // INIT //----------------------------------------- if( !IPSLib::fbc_enabled() ) { $this->registry->getClass('output')->showError( 'fbc_disabled', 1005.2 ); } //----------------------------------------- // Shut off save button if not associated yet //----------------------------------------- if( !$this->memberData['fb_uid'] ) { $this->hide_form_and_save_button = true; $userData = array(); $linkedMemberData = array(); $perms = array(); } else { //----------------------------------------- // FB user logged in? //----------------------------------------- $classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/classes/facebook/connect.php', 'facebook_connect' ); $facebook = new $classToLoad( $this->registry ); /* Now get the linked user */ $linkedMemberData = IPSMember::load( intval($this->memberData['fb_uid']), 'all', 'fb_uid' ); $userData = $facebook->fetchUserData(); /* Email */ $perms['email'] = $facebook->fetchHasAppPermission( 'email' ); /* Publish Stream */ $perms['publish_stream'] = $facebook->fetchHasAppPermission( 'publish_stream' ); /* Read stream */ $perms['read_stream'] = $facebook->fetchHasAppPermission( 'read_stream' ); /* Offline access */ $perms['offline_access'] = $facebook->fetchHasAppPermission( 'offline_access' ); //----------------------------------------- // Thaw bitfield options //----------------------------------------- $bwOptions = IPSBWOptions::thaw( $this->memberData['fb_bwoptions'], 'facebook' ); //----------------------------------------- // Merge.. //----------------------------------------- if ( is_array( $bwOptions ) ) { foreach( $bwOptions as $k => $v ) { $this->memberData[ $k ] = $v; } } //----------------------------------------- // Able to update status? //----------------------------------------- $classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/classes/member/status.php', 'memberStatus' ); $this->registry->setClass( 'memberStatus', new $classToLoad( $this->registry ) ); $this->registry->memberStatus->setAuthor( $this->memberData ); $this->memberData['can_updated_status'] = $this->registry->memberStatus->canCreate(); $_updates = $facebook->fetchUserTimeline( $userData['id'], 0, true ); /* Got any? */ if ( count( $_updates ) ) { $update = array_shift( $_updates ); if ( count( $update ) AND is_array( $update ) ) { $userData['status'] = $update; } } if ( is_array( $userData ) AND $userData['status']['message'] AND IPS_DOC_CHAR_SET != 'UTF-8' ) { $userData['status']['message'] = IPSText::utf8ToEntities( $userData['status']['message'] ); } /* Make safe */ $userData['status']['message'] = str_replace( array( '<', '>' ), array( '<', '>' ), $userData['status']['message'] ); } return $this->registry->getClass('output')->getTemplate('ucp')->membersFacebookConnect( trim($this->memberData['fb_uid']), $userData, $linkedMemberData, $perms ); } /** * Show the ignored users * * @author Matt Mecham * @return string Processed HTML */ public function formIgnoredUsers() { //----------------------------------------- // INIT //----------------------------------------- $final_users = array(); $temp_users = array(); $uid = intval( $this->request['uid'] ); $ignoredUsers = array(); //----------------------------------------- // Do we have incoming? //----------------------------------------- if ( $uid ) { $newmem = IPSMember::load( $uid ); $this->request['newbox_1'] = $newmem['members_display_name']; } //----------------------------------------- // Get ignored users //----------------------------------------- $perPage = 25; /* Count */ $count = $this->DB->buildAndFetch( array( 'select' => 'count(*) as dracula', 'from' => 'ignored_users', 'where' => 'ignore_owner_id=' . $this->memberData['member_id'] ) ); /* Sort out pagination */ $st = intval($this->request['st']) >=0 ? intval($this->request['st']) : 0; $pagination = $this->registry->output->generatePagination( array( 'totalItems' => $count['dracula'], 'itemsPerPage' => $perPage, 'currentStartValue' => $st, 'baseUrl' => 'app=core&module=usercp&tab=core&area=ignoredusers', ) ); /* Get em */ $this->DB->build( array( 'select' => '*', 'from' => 'ignored_users', 'where' => 'ignore_owner_id=' . $this->memberData['member_id'], 'limit' => array( $st, $perPage ) ) ); $this->DB->execute(); while( $row = $this->DB->fetch() ) { $ignoredUsers[ $row['ignore_ignore_id'] ] = $row; } //----------------------------------------- // Get members and check to see if they've // since been moved into a group that cannot // be ignored //----------------------------------------- foreach( $ignoredUsers as $_id => $data ) { if ( intval($_id) ) { $temp_users[] = $_id; } } if ( count($temp_users) ) { $members = IPSMember::load( $temp_users, 'all' ); foreach( $members as $m ) { $m['g_title'] = IPSMember::makeNameFormatted( $this->caches['group_cache'][ $m['member_group_id'] ]['g_title'], $m['member_group_id'] ); $final_users[ $m['member_id'] ] = IPSMember::buildDisplayData( $m ); $final_users[ $m['member_id'] ]['ignoreData'] = $ignoredUsers[ $m['member_id'] ]; } } $this->request['newbox_1'] = $this->request['newbox_1'] ? $this->request['newbox_1'] : ''; return $this->registry->getClass('output')->getTemplate('ucp')->membersIgnoredUsersForm( $final_users, $pagination ); } /** * Show the signature page * * @author Matt Mecham * @return string Processed HTML */ public function formSignature() { /* Load editor stuff */ $classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/classes/editor/composite.php', 'classes_editor_composite' ); $this->editor = new $classToLoad(); /* HTML checkbox language strings */ $this->registry->getClass('class_localization')->loadLanguageFile( array( 'public_post' ), 'forums' ); //----------------------------------------- // Check to make sure that we can edit profiles.. //----------------------------------------- $sig_restrictions = explode( ':', $this->memberData['g_signature_limits'] ); if ( ! $this->memberData['g_edit_profile'] OR ( $sig_restrictions[0] AND ! $this->memberData['g_sig_unit'] ) ) { $this->registry->getClass('output')->showError( 'members_profile_disabled', 1024, null, null, 403 ); } /* Signature Limits */ if ( $sig_restrictions[0] AND $this->memberData['g_sig_unit'] ) { if ( $this->memberData['gbw_sig_unit_type'] ) { /* days */ if ( $this->memberData['joined'] > ( time() - ( 86400 * $this->memberData['g_sig_unit'] ) ) ) { $this->hide_form_and_save_button = 1; $form['_noPerm'] = sprintf( $this->lang->words['sig_group_restrict_date'], $this->lang->getDate( $this->memberData['joined'] + ( 86400 * $this->memberData['g_sig_unit'] ), 'long' ) ); } } else { /* Posts */ if ( $this->memberData['posts'] < $this->memberData['g_sig_unit'] ) { $this->hide_form_and_save_button = 1; $form['_noPerm'] = sprintf( $this->lang->words['sig_group_restrict_posts'], $this->memberData['g_sig_unit'] - $this->memberData['posts'] ); } } if( $form['_noPerm'] ) { return $this->registry->getClass('output')->getTemplate('ucp')->membersSignatureFormError( $form ); } } //----------------------------------------- // Set max length //----------------------------------------- $current_sig = ''; $t_sig = ''; /* Set content in editor */ $this->editor->setLegacyMode(false); $this->editor->setAllowBbcode( true ); $this->editor->setAllowSmilies( true ); $this->editor->setAllowHtml( $this->memberData['g_dohtml'] ); $this->editor->setIsHtml( $this->memberData['bw_html_sig'] ); $this->editor->setBbcodeSection('signatures'); $this->editor->setContent( $this->memberData['signature'] ); /* Load parser */ $classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/classes/text/parser.php', 'classes_text_parser' ); $parser = new $classToLoad(); $parser->set( array( 'memberData' => $this->memberData, 'parseBBCode' => 1, 'parseHtml' => ( $this->memberData['g_dohtml'] && $this->memberData['bw_html_sig'] ), 'parseArea' => 'signatures', 'parseEmoticons' => 1 ) ); $signature = $parser->display( $this->memberData['signature'] ); return $this->registry->getClass('output')->getTemplate('ucp')->membersSignatureForm( $this->editor->show( 'Post', array( 'noSmilies' => false ) ), $sig_restrictions, $signature ); } /** * Show the minecraft pages * * @author PGmajster * @return string Processed HTML */ public function formMinecraft() { /* Load editor stuff */ $classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/classes/editor/composite.php', 'classes_editor_composite' ); $this->editor = new $classToLoad(); /* HTML checkbox language strings */ $this->registry->getClass('class_localization')->loadLanguageFile( array( 'public_post' ), 'forums' ); //----------------------------------------- // Check to make sure that we can edit profiles.. //----------------------------------------- if ( ! $this->memberData['g_edit_profile'] AND ! $this->memberData['g_minecraft_unit'] ) { $this->registry->getClass('output')->showError( 'members_profile_disabled', 1024, null, null, 403 ); } if( $form['_noPerm'] ) { return $this->registry->getClass('output')->getTemplate('ucp')->membersMinecraftFormError( $form ); } } /* Set content in editor */ $this->editor->setAllowBbcode( true ); $this->editor->setAllowSmilies( true ); $this->editor->setAllowHtml( $this->memberData['g_dohtml'] ); $this->editor->setIsHtml( $this->memberData['bw_html_minecraft'] ); $this->editor->setBbcodeSection('minecraft'); $this->editor->setContent( $this->memberData['minecraft'] ); /* Load parser */ $classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/classes/text/parser.php', 'classes_text_parser' ); $parser = new $classToLoad(); $parser->set( array( 'memberData' => $this->memberData, 'parseBBCode' => 1, 'parseHtml' => ( $this->memberData['g_dohtml'] && $this->memberData['bw_html_minecraft'] ), 'parseArea' => 'minecraft', 'parseEmoticons' => 1 ) ); $minecraft = $parser->display( $this->memberData['minecraft'] ); return $this->registry->getClass('output')->getTemplate('ucp')->membersSignatureForm( $this->editor->show( 'Post', array( 'noSmilies' => false ) ), $minecraft ); } /** * Show the profile information * * @author Matt Mecham * @return string Processed HTML */ public function formProfileInfo() { /* Load Lang File */ $this->registry->class_localization->loadLanguageFile( array( 'public_profile' ), 'members' ); /* Load editor stuff */ $classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/classes/editor/composite.php', 'classes_editor_composite' ); $this->editor = new $classToLoad(); /* INIT */ $required_output = ""; $optional_output = ""; /* Permission Check */ if( ! $this->memberData['g_edit_profile'] ) { $this->registry->getClass('output')->showError( 'members_profile_disabled', 1026, null, null, 403 ); } /* Format the birthday drop boxes.. */ $date = getdate(); $day = array(); $mon = array(); $year = array(); $times = array(); /* Build the day options */ $day[] = array( '0', '--' ); for ( $i = 1 ; $i < 32 ; $i++ ) { $day[] = array( $i, $i ); } /* Build the month options */ $mon[] = array( '0', '--' ); for( $i = 1 ; $i < 13 ; $i++ ) { $mon[] = array( $i, $this->lang->words['M_' . $i ] ); } /* Build the years options */ $i = $date['year'] - 1; $j = $date['year'] - 100; $year[] = array( '0', '--' ); for( $i ; $j < $i ; $i-- ) { $year[] = array( $i, $i ); } /* Custom Fields */ $classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/classes/customfields/profileFields.php', 'customProfileFields' ); $fields = new $classToLoad(); $fields->member_data = $this->member->fetchMemberData(); $fields->initData( 'edit' ); $fields->parseToEdit(); $field_output = array(); if ( count( $fields->out_fields ) ) { foreach( $fields->out_fields as $id => $element ) { $data = $fields->cache_data[ $id ]; $field_output[ $data['pf_group_key'] ][ $id ] = array( 'field' => $this->registry->getClass('output')->getTemplate('ucp')->field_entry( $fields->field_names[ $id ], $fields->field_desc[ $id ], $fields->out_fields[ $id ], $id ), 'required' => $data['pf_not_null'] ); } /*foreach( $fields->out_fields as $id => $data ) { if ( $fields->cache_data[ $id ]['pf_not_null'] == 1 ) { $ftype = 'required_output'; } else { $ftype = 'optional_output'; } ${$ftype} .= $this->registry->getClass('output')->getTemplate('ucp')->field_entry( $fields->field_names[ $id ], $fields->field_desc[ $id ], $data, $id ); }*/ } /* About me */ $this->editor->setContent( $this->memberData['pp_about_me'] ); $amEditor = $this->editor->show( 'Post', array( 'delayInit' => 1 ) ); /* Times */ foreach ( $this->lang->words as $k => $v ) { if ( strpos( $k, "time_" ) === 0 ) { $k = str_replace( "time_", '', $k ); if( preg_match( '/^[\-\d\.]+$/', $k ) ) { $times[ $k ] = $v; } } } ksort( $times ); /* Build and return the form */ $template = $this->registry->getClass('output')->getTemplate('ucp')->membersProfileForm( $field_output, $fields->fetchGroupTitles(), $day, $mon, $year, $amEditor, $times ); return $template; } /** * Show the logged inline notifications * * @author Brandon Farber * @param string Error message * @return string Processed HTML */ public function showInlineNotifications( $error='' ) { /* Init */ $start = intval( $this->request['st'] ); $perPage = 50; //----------------------------------------- // Get class //----------------------------------------- $classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . '/sources/classes/member/notifications.php', 'notifications' ); $notifyLibrary = new $classToLoad( $this->registry ); $notifyLibrary->setMember( $this->memberData ); /* Clear them? - used in mobile skin */ if ( isset($this->request['clear']) && trim($this->request['clear']) == 'true' ) { $this->DB->update( 'inline_notifications', array( 'notify_read' => 1 ), 'notify_to_id=' . $this->memberData['member_id'] ); $notifyLibrary->rebuildUnreadCount(); } //----------------------------------------- // Turn off normal form //----------------------------------------- $this->hide_form_and_save_button = 1; //----------------------------------------- // Get notifications //----------------------------------------- $_notifications = array(); $mids = array(); $count = $this->DB->buildAndFetch( array( 'select' => 'COUNT(*) as er', 'from' => 'inline_notifications', 'where' => 'notify_to_id=' . $this->memberData['member_id'] ) ); if ( $count['er'] ) { $this->DB->build( array( 'select' => '*', 'from' => 'inline_notifications', 'where' => 'notify_to_id=' . $this->memberData['member_id'], 'limit' => array( $start, $perPage ), 'order' => 'notify_sent DESC' ) ); $outer = $this->DB->execute(); while( $r = $this->DB->fetch($outer) ) { $r['notify_icon'] = $notifyLibrary->getNotificationIcon( $r['notify_type_key'] ); $_notifications[] = $r; $mids[ $r['notify_from_id'] ] = $r['notify_from_id']; } /* Get members */ if ( count( $mids ) ) { $members = IPSMember::load( array_keys( $mids ), 'all' ); if ( count( $members ) ) { foreach( $_notifications as $key => $data ) { if ( isset($members[ $data['notify_from_id'] ]) ) { $_notifications[ $key ]['member'] = IPSMember::buildProfilePhoto( $members[ $data['notify_from_id'] ] ); } } } } } $pages = $this->registry->getClass('output')->generatePagination( array( 'totalItems' => $count['er'], 'itemsPerPage' => $perPage, 'currentStartValue' => $start, 'baseUrl' => "app=core&module=usercp&tab=core&area=notificationlog" ) ); //----------------------------------------- // Send to template //----------------------------------------- return $this->registry->getClass('output')->getTemplate('ucp')->notificationsLog( $_notifications, $error, $pages ); } /** * Show notification configuration form * * @author Brandon Farber * @return string Processed HTML * * @note Updating this function update also mobileApiRequest::_handleNotificationTypes() */ public function showFormNotifications() { //----------------------------------------- // Notifications library //----------------------------------------- $classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . '/sources/classes/member/notifications.php', 'notifications' ); $notifyLibrary = new $classToLoad( $this->registry ); $notifyLibrary->setMember( $this->memberData ); //----------------------------------------- // Show the form //----------------------------------------- $_basicOptions = array( array( 'email', $this->lang->words['notopt__email'] ), array( 'inline', $this->lang->words['notopt__inline'] ), array( 'mobile', $this->lang->words['notopt__mobile'] ) ); $_configOptions = $notifyLibrary->getNotificationData( TRUE ); $_notifyConfig = $notifyLibrary->getMemberNotificationConfig( $this->memberData ); $_defaultConfig = $notifyLibrary->getDefaultNotificationConfig(); $_formOptions = array(); foreach( $_configOptions as $option ) { $_thisConfig = isset($_notifyConfig[ $option['key'] ]) ? $_notifyConfig[ $option['key'] ] : $_defaultConfig[ $option['key'] ]; //----------------------------------------- // Determine available options //----------------------------------------- $_available = array(); foreach( $_basicOptions as $_bo ) // ewwww { if( !is_array($_defaultConfig[ $option['key'] ]['disabled']) OR !in_array( $_bo[0], $_defaultConfig[ $option['key'] ]['disabled'] ) ) { $_available[] = $_bo; } } //----------------------------------------- // If none available, at least give inline //----------------------------------------- if( !count($_available) ) { $_available[] = array( 'inline', $this->lang->words['notify__inline'] ); } //----------------------------------------- // Start setting data to pass to form //----------------------------------------- $_formOptions[ $option['key'] ] = array(); $_formOptions[ $option['key'] ]['key'] = $option['key']; $_formOptions[ $option['key'] ]['app'] = $option['app']; //----------------------------------------- // Rikki asked for this... //----------------------------------------- foreach( $_available as $_availOption ) { $_formOptions[ $option['key'] ]['options'][ $_availOption[0] ] = $_availOption; } //$_formOptions[ $option['key'] ]['options'] = $_available; $_formOptions[ $option['key'] ]['defaults'] = is_array($_thisConfig['selected']) ? $_thisConfig['selected'] : array(); $_formOptions[ $option['key'] ]['disabled'] = 0; //----------------------------------------- // Don't allow member to configure // Still show, but disable on form //----------------------------------------- if( $_defaultConfig[ $option['key'] ]['disable_override'] ) { $_formOptions[ $option['key'] ]['disabled'] = 1; $_formOptions[ $option['key'] ]['defaults'] = is_array($_defaultConfig[ $option['key'] ]['selected']) ? $_defaultConfig[ $option['key'] ]['selected'] : array(); } } //----------------------------------------- // Other settings //----------------------------------------- $_emailData = array(); //----------------------------------------- // Email settings... //----------------------------------------- $_emailData['auto_track'] = $this->memberData['auto_track'] ? 'checked="checked"' : ''; foreach( array( 'none', 'immediate', 'offline', 'daily', 'weekly' ) as $_opt ) { $_emailData['trackOption'][ $_opt ] = ( $this->memberData['auto_track'] == $_opt ) ? 'selected="selected"' : ''; } return $this->registry->getClass('output')->getTemplate('ucp')->notificationsForm( $_formOptions, $_emailData ); } /** * Show the attachments form * * @author Matt Mecham * @return string Processed HTML */ public function showFormAttachments() { //----------------------------------------- // INIT //----------------------------------------- $info = array(); $start = intval( $this->request['st'] ); $perpage = 15; $sort_key = ""; $attachments = array(); $this->hide_form_and_save_button = 1; //----------------------------------------- // Sort it //----------------------------------------- switch ( $this->request['sort'] ) { case 'date': $sort_key = 'a.attach_date ASC'; $info['date_order'] = 'rdate'; $info['size_order'] = 'size'; break; case 'rdate': $sort_key = 'a.attach_date DESC'; $info['date_order'] = 'date'; $info['size_order'] = 'size'; break; case 'size': $sort_key = 'a.attach_filesize DESC'; $info['date_order'] = 'date'; $info['size_order'] = 'rsize'; break; case 'rsize': $sort_key = 'a.attach_filesize ASC'; $info['date_order'] = 'date'; $info['size_order'] = 'size'; break; default: $sort_key = 'a.attach_date DESC'; $info['date_order'] = 'date'; $info['size_order'] = 'size'; break; } //----------------------------------------- // Get some stats... //----------------------------------------- $maxspace = intval($this->memberData['g_attach_max']); if ( $this->memberData['g_attach_max'] == -1 ) { $this->registry->getClass('output')->showError( 'no_permission_to_attach', 1010 ); } //----------------------------------------- // Limit by forums //----------------------------------------- $stats = $this->DB->buildAndFetch( array( 'select' => 'count(*) as count, ' . $this->DB->buildCoalesce( array( 'sum(attach_filesize)', 0 ) ) . ' as sum', 'from' => 'attachments', 'where' => 'attach_member_id=' . $this->memberData['member_id'] . " AND attach_rel_module IN( 'post', 'msg' )" ) ); if ( $maxspace > 0 ) { //----------------------------------------- // Figure out percentage used //----------------------------------------- $info['has_limit'] = 1; $info['full_percent'] = $stats['sum'] ? sprintf( "%.0f", ( ( $stats['sum'] / ($maxspace * 1024) ) * 100) ) : 0; if ( $info['full_percent'] > 100 ) { $info['full_percent'] = 100; } else if ( $info['full_percent'] < 1 AND $stats['count'] > 0 ) { $info['full_percent'] = 1; } $info['attach_space_count'] = sprintf( $this->lang->words['attach_space_count'], intval($stats['count']), intval($info['full_percent']) ); $info['attach_space_used'] = sprintf( $this->lang->words['attach_space_used'] , IPSLib::sizeFormat($stats['sum']), IPSLib::sizeFormat($maxspace * 1024) ); } else { $info['has_limit'] = 0; $info['attach_space_used'] = sprintf( $this->lang->words['attach_space_unl'] , IPSLib::sizeFormat($stats['sum']) ); } //----------------------------------------- // Pages //----------------------------------------- $pages = $this->registry->getClass('output')->generatePagination( array( 'totalItems' => $stats['count'], 'itemsPerPage' => $perpage, 'currentStartValue' => $start, 'baseUrl' => "app=core&module=usercp&tab=core&area=attachments&sort=" . $this->request['sort'] . "", ) ); //----------------------------------------- // Get attachments... //----------------------------------------- if( $stats['count'] ) { $this->DB->build( array( 'select' => 'a.*', 'from' => array( 'attachments' => 'a' ), 'where' => "a.attach_member_id=" . $this->memberData['member_id'] . " AND a.attach_rel_module IN( 'post', 'msg' )", 'order' => $sort_key, 'limit' => array( $start, $perpage ), 'add_join' => array( array( 'select' => 'p.topic_id', 'from' => array( 'posts' => 'p' ), 'where' => 'p.pid=a.attach_rel_id', 'type' => 'left' ), array( 'select' => 't.*', 'from' => array( 'topics' => 't' ), 'where' => 't.tid=p.topic_id', 'type' => 'left' ) ) ) ); $outer = $this->DB->execute(); $this->registry->getClass( 'class_localization')->loadLanguageFile( array( 'public_topic' ), 'forums' ); $cache = $this->cache->getCache('attachtypes'); /* Load topic class */ if ( ! $this->registry->isClassLoaded('topics') ) { $classToLoad = IPSLib::loadLibrary( IPSLib::getAppDir( 'forums' ) . "/sources/classes/topics.php", 'app_forums_classes_topics', 'forums' ); $this->registry->setClass( 'topics', new $classToLoad( $this->registry ) ); } while ( $row = $this->DB->fetch( $outer ) ) { $row['_link'] = true; if ( ! $this->registry->topics->canView( $row ) ) { $row['title'] = $this->lang->words['attach_topicmoved']; $row['_link'] = false; } //----------------------------------------- // Full attachment thingy //----------------------------------------- if ( $row['attach_rel_module'] == 'post' ) { $row['_type'] = 'post'; } else if ( $row['attach_rel_module'] == 'msg' ) { $row['_type'] = 'msg'; $row['title'] = $this->lang->words['attach_inpm']; } /* IPB 2.x conversion */ $row['image'] = str_replace( 'folder_mime_types', 'mime_types', $cache[ $row['attach_ext'] ]['atype_img'] ); $row['short_name'] = IPSText::truncate( $row['attach_file'], 30 ); $row['attach_date'] = $this->registry->getClass( 'class_localization')->getDate( $row['attach_date'], 'SHORT' ); $row['real_size'] = IPSLib::sizeFormat( $row['attach_filesize'] ); $attachments[] = $row; } } return $this->registry->getClass('output')->getTemplate('ucp')->coreAttachments( $info, $pages, $attachments ); } /** * Show the Email & Password form * * @author Matt Mecham * @param string Returned error message (if any) * @return string Processed HTML */ public function showFormEmailPassword( $_message='' ) { //----------------------------------------- // Do not allow validating members to change // email when admin validation is on // @see http://community.invisionpower.com/tracker/issue-19964-loophole-in-registration-procedure/ //----------------------------------------- if( $this->memberData['member_group_id'] == $this->settings['auth_group'] AND in_array( $this->settings['reg_auth_type'], array( 'admin', 'admin_user' ) ) ) { $this->registry->output->showError( $this->lang->words['admin_val_no_email_chg'], 10189 ); } //----------------------------------------- // Do we have another URL for email resets? //----------------------------------------- $classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/handlers/han_login.php', 'han_login' ); $this->han_login = new $classToLoad( $this->registry ); $this->han_login->init(); $this->han_login->checkMaintenanceRedirect(); //$txt = $this->lang->words['ce_current'] . $this->memberData['email']; if ( $this->settings['reg_auth_type']) { $txt .= $this->lang->words['ce_auth']; } $_message = $_message ? $this->lang->words[$_message] : ''; if( $this->memberData['g_access_cp'] ) { $this->hide_form_and_save_button = true; } return $this->registry->getClass('output')->getTemplate('ucp')->emailPasswordChangeForm( $txt, $_message, $this->_isFBUser ); } /** * Show the display name form * * @author Matt Mecham * @param string Error message (if any) * @return string Processed HTML */ public function showFormDisplayname( $error="" ) { //----------------------------------------- // INIT //----------------------------------------- $form = array(); //----------------------------------------- // CHECK (please) //----------------------------------------- if ( ! $this->settings['auth_allow_dnames'] OR $this->memberData['g_dname_changes'] == 0 OR $this->memberData['g_dname_date'] == 0 ) { $this->registry->getClass('output')->showError( 'no_permission_for_display_names', 1011 ); } $this->request['display_name'] = $this->request['display_name'] ? $this->request['display_name'] : ''; $this->settings['username_errormsg'] = str_replace( '{chars}', $this->settings['username_characters'], $this->settings['username_errormsg'] ); //----------------------------------------- // Grab # changes > 24 hours //----------------------------------------- $time_check = time() - 86400 * $this->memberData['g_dname_date']; if( $time_check < $this->memberData['joined'] ) { $time_check = $this->memberData['joined']; } $name_count = $this->DB->buildAndFetch( array( 'select' => 'COUNT(*) as count, MIN(dname_date) as min_date', 'from' => 'dnames_change', 'where' => "dname_member_id=" . $this->memberData['member_id'] . " AND dname_date > $time_check AND dname_discount=0" ) ); $name_count['count'] = intval( $name_count['count'] ); $name_count['min_date'] = intval( $name_count['min_date'] ) ? intval( $name_count['min_date'] ) : $time_check; //----------------------------------------- // Calculate # left //----------------------------------------- /* Check new permissions */ $_g = $this->caches['group_cache'][ $this->memberData['member_group_id'] ]; if ( $_g['g_displayname_unit'] ) { if ( $_g['gbw_displayname_unit_type'] ) { /* days */ if ( $this->memberData['joined'] > ( time() - ( 86400 * $_g['g_displayname_unit'] ) ) ) { $this->hide_form_and_save_button = 1; $form['_noPerm'] = sprintf( $this->lang->words['dname_group_restrict_date'], $this->lang->getDate( $this->memberData['joined'] + ( 86400 * $_g['g_displayname_unit'] ), 'long' ) ); } } else { /* Posts */ if ( $this->memberData['posts'] < $_g['g_displayname_unit'] ) { $this->hide_form_and_save_button = 1; $form['_noPerm'] = sprintf( $this->lang->words['dname_group_restrict_posts'], $_g['g_displayname_unit'] - $this->memberData['posts'] ); } } } if( !$form['_noPerm'] ) { if ( $this->memberData['g_dname_changes'] == -1 ) { $form['_lang_string'] = $this->lang->words['dname_string2']; } else { $form['_changes_left'] = $this->memberData['g_dname_changes'] - $name_count['count']; $form['_changes_done'] = $name_count['count']; # Make sure changes done isn't larger than allowed # This happens when changing via ACP if ( $form['_changes_done'] > $this->memberData['g_dname_changes'] ) { $form['_changes_done'] = $this->memberData['g_dname_changes']; } $form['_first_change'] = $this->registry->getClass( 'class_localization')->getDate( $name_count['min_date'], 'date', 1 ); $form['_lang_string'] = sprintf( $this->lang->words['dname_string'], $form['_changes_done'], $this->memberData['g_dname_changes'], $form['_first_change'], $this->memberData['g_dname_changes'], $this->memberData['g_dname_date'] ) . $this->lang->words['dname_string2']; } } //----------------------------------------- // Print //----------------------------------------- $this->_pageTitle = $this->lang->words['m_dname_change']; return $this->registry->getClass('output')->getTemplate('ucp')->displayNameForm( $form, $error, '', $this->_isFBUser ); } /** * UserCP Form Check * * @author Matt Mecham * @param string Current area as defined by 'get_links' * @return string Processed HTML */ public function saveForm( $current_area ) { //----------------------------------------- // Where to go, what to see? //----------------------------------------- switch( $current_area ) { default: case 'profileinfo': return $this->saveProfileInfo(); break; case 'signature': return $this->saveSignature(); break; case 'photo': return $this->savePhoto(); break; case 'ignoredusers': return $this->saveIgnoredUsers(); break; case 'facebook': return $this->saveFacebook(); break; case 'twitter': return $this->saveTwitter(); break; case 'customize': return $this->saveCustomize(); break; case 'email': return $this->saveFormEmailPassword(); break; case 'password': return $this->saveFormPassword(); break; case 'displayname': return $this->saveFormDisplayname(); break; case 'notifications': return $this->saveFormNotifications(); break; } } /** * UserCP Save Form: Customize * * @return array Errors */ public function saveCustomize() { /* Init */ $errors = array(); $custom = array(); $bg_nix = trim( $this->request['bg_nix'] ); $bg_url = trim( $this->request['bg_url'] ); $bg_tile = intval( $this->request['bg_tile'] ); $bg_color = trim( str_replace( '#', '', $this->request['bg_color'] ) ); /* reset custom */ $custom = IPSLib::safeUnserialize( $this->memberData['pp_customization'] ); /* Bug #21578 */ if( ! $bg_color && $custom['bg_color'] ) { $bg_color = $custom['bg_color']; } /* Delete all? */ if ( $bg_nix ) { /* reset array */ $custom = array( 'bg_url' => '', 'type' => '', 'bg_color' => '', 'bg_tile' => '' ); /* remove bg images */ IPSMember::getFunction()->removeUploadedBackgroundImages( $this->memberData['member_id'] ); } else { if ( $bg_url AND $this->memberData['gbw_allow_url_bgimage'] ) { /* Check */ { return array( 0 => $this->lang->words['pp_bgimg_url_bad'] ); } $image_extension = strtolower( pathinfo( $bg_url, PATHINFO_EXTENSION ) ); if( ! in_array( $image_extension, array( 'png', 'jpg', 'gif', 'jpeg' ) ) ) { return array( 0 => $this->lang->words['pp_bgimg_ext_bad'] ); } $custom['bg_url'] = $bg_url; $custom['type'] = 'url'; } else if ( $this->memberData['gbw_allow_upload_bgimage'] ) { /* Load more lang strings */ $this->registry->class_localization->loadLanguageFile( array( 'public_profile' ), 'members' ); /* Upload img */ $img = IPSMember::getFunction()->uploadBackgroundImage(); if ( $img['status'] == 'fail' ) { return array( 0 => sprintf( $this->lang->words[ 'pp_' . $img['error'] ], $img['maxSize'] ) ); } else if ( $img['final_location'] ) { $custom['bg_url'] = $img['final_location']; $custom['type'] = 'upload'; } } } /* BG color */ $custom['bg_color'] = $bg_nix ? '' : IPSText::alphanumericalClean( $bg_color ); /* Tile */ $custom['bg_tile'] = $bg_nix ? '' : $bg_tile; /* Save it */ if ( ! $this->memberData['bw_disable_customization'] AND $this->memberData['gbw_allow_customization'] ) { IPSMember::save( $this->memberData['member_id'], array( 'extendedProfile' => array( 'pp_profile_update' => IPS_UNIX_TIME_NOW, 'pp_customization' => serialize( $custom ) ) ) ); } return TRUE; } /** * UserCP Save Form: Twitter * * @return array Errors */ public function saveTwitter() { if( !IPSLib::twitter_enabled() ) { $this->registry->getClass('output')->showError( 'twitter_disabled', 1005.2 ); } //----------------------------------------- // Data //----------------------------------------- $toSave = IPSBWOptions::thaw( $this->memberData['tc_bwoptions'], 'twitter' ); //----------------------------------------- // Loop and save... simple //----------------------------------------- foreach( array( 'tc_s_pic', 'tc_s_status', 'tc_s_aboutme', 'tc_s_bgimg', 'tc_si_status' ) as $field ) { $toSave[ $field ] = intval( $this->request[ $field ] ); } $this->memberData['tc_bwoptions'] = IPSBWOptions::freeze( $toSave, 'twitter' ); $return = IPSMember::save( $this->memberData['member_id'], array( 'extendedProfile' => array( 'tc_bwoptions' => $this->memberData['tc_bwoptions'] ) ) ); //----------------------------------------- // Now sync //----------------------------------------- $classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/classes/twitter/connect.php', 'twitter_connect' ); $twitter = new $classToLoad( $this->registry, $this->memberData['twitter_token'], $this->memberData['twitter_secret'] ); try { $twitter->syncMember( $this->memberData ); } catch( Exception $error ) { $msg = $error->getMessage(); switch( $msg ) { case 'NOT_LINKED': case 'NO_MEMBER': break; } } return TRUE; } /** * UserCP Save Form: Facebook * * @return array Errors */ public function saveFacebook() { if( !IPSLib::fbc_enabled() ) { $this->registry->getClass('output')->showError( 'fbc_disabled', 1005 ); } //----------------------------------------- // Data //----------------------------------------- $toSave = IPSBWOptions::thaw( $this->memberData['members_bitoptions'], 'members' ); //----------------------------------------- // Loop and save... simple //----------------------------------------- foreach( array( 'fbc_s_pic', 'fbc_s_status', 'fbc_s_aboutme', 'fbc_si_status' ) as $field ) { $toSave[ $field ] = intval( $this->request[ $field ] ); } $this->memberData['fb_bwoptions'] = IPSBWOptions::freeze( $toSave, 'facebook' ); IPSMember::save( $this->memberData['member_id'], array( 'extendedProfile' => array( 'fb_bwoptions' => $this->memberData['fb_bwoptions'] ) ) ); //----------------------------------------- // Now sync //----------------------------------------- $classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/classes/facebook/connect.php', 'facebook_connect' ); $facebook = new $classToLoad( $this->registry ); try { $facebook->syncMember( $this->memberData ); } catch( Exception $error ) { $msg = $error->getMessage(); switch( $msg ) { case 'NOT_LINKED': case 'NO_MEMBER': break; } } return TRUE; } /** * UserCP Save Form: Ignore Users * * @return array Errors */ public function saveIgnoredUsers() { //----------------------------------------- // INIT //----------------------------------------- $newName = $this->request['newbox_1']; $dnvs = intval( $this->request['donot_view_sigs'] ); IPSMember::save( $this->memberData['member_id'], array( 'core' => array( 'view_sigs' => ( $dnvs ) ? 0 : 1 ) ) ); if ( trim( $newName ) && $_POST['newbox_1'] != $this->lang->words['ucp_members_name'] ) { //----------------------------------------- // Load //----------------------------------------- $member = IPSMember::load( $newName, 'core', 'displayname' ); if ( ! $member['member_id'] ) { return array( 0 => $this->lang->words['ignoreuser_nomem'] ); } if ( $member['member_id'] == $this->memberData['member_id'] ) { return array( 0 => $this->lang->words['ignoreuser_cannot'] ); } //----------------------------------------- // Already ignoring? //----------------------------------------- $ignoreMe = $this->DB->buildAndFetch( array( 'select' => '*', 'from' => 'ignored_users', 'where' => 'ignore_owner_id=' . $this->memberData['member_id'] . ' AND ignore_ignore_id=' . $member['member_id'] ) ); if ( $ignoreMe['ignore_id'] ) { return array( 0 => $this->lang->words['ignoreuser_already'] ); } //----------------------------------------- // Can we ignore them? //----------------------------------------- if ( $member['_canBeIgnored'] !== TRUE ) { return array( 0 => $this->lang->words['ignoreuser_cannot'] ); } //----------------------------------------- // Add it //----------------------------------------- $this->DB->insert( 'ignored_users', array( 'ignore_owner_id' => $this->memberData['member_id'], 'ignore_ignore_id' => $member['member_id'], 'ignore_messages' => !empty( $this->request['ignore_messages'] ) ? 1 : 0, 'ignore_topics' => !empty( $this->request['ignore_topics'] ) ? 1 : 0, 'ignore_signatures' => !empty( $this->request['ignore_signatures'] ) ? 1 : 0, 'ignore_chats' => !empty( $this->request['ignore_chats'] ) ? 1 : 0, ) ); /* Rebuild cache */ IPSMember::rebuildIgnoredUsersCache( $this->memberData ); } return TRUE; } /** * UserCP Save Form: Signature * * @return array Errors */ public function saveSignature() { /* Load editor stuff */ $classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/classes/editor/composite.php', 'classes_editor_composite' ); $this->editor = new $classToLoad(); $this->editor->setLegacyMode(false); $isHtml = intval( $this->request['sig_htmlstatus'] ); //----------------------------------------- // Check to make sure that we can edit profiles.. //----------------------------------------- $sig_restrictions = explode( ':', $this->memberData['g_signature_limits'] ); if ( ! $this->memberData['g_edit_profile'] OR ( $sig_restrictions[0] AND ! $this->memberData['g_sig_unit'] ) ) { $this->registry->getClass('output')->showError( 'members_profile_disabled', 1028, null, null, 403 ); } //----------------------------------------- // Post process the editor // Now we have safe HTML and bbcode //----------------------------------------- /* Set content in editor */ $this->editor->setAllowBbcode( true ); $this->editor->setAllowSmilies( true ); $this->editor->setIsHtml( $this->memberData['g_dohtml'] && $isHtml ); $this->editor->setBbcodeSection('signatures'); $this->editor->setContent( $this->memberData['signature'] ); $signature = $this->editor->process( $_POST['Post'] ); //----------------------------------------- // Parse post //----------------------------------------- /* Load parser */ $classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/classes/text/parser.php', 'classes_text_parser' ); $parser = new $classToLoad(); $parser->testForParsingLimits( $signature, array( 'quote', 'emoticons', 'urls' ) ); if ( is_array( $parser->getErrors() ) && count( $parser->getErrors() ) ) { $this->lang->loadLanguageFile( array( 'public_post' ), 'forums' ); $_error = array_pop( $parser->getErrors() ); $this->registry->getClass('output')->showError( $_error, 10210 ); } //----------------------------------------- // Signature restrictions... //----------------------------------------- $sig_errors = array(); //----------------------------------------- // Max number of images... //----------------------------------------- if( isset($sig_restrictions[1]) and $sig_restrictions[1] !== '' ) { if( $parser->getImageCount( $signature ) > $sig_restrictions[1] ) { $sig_errors[] = sprintf( $this->lang->words['sig_toomanyimages'], $sig_restrictions[1] ); } } //----------------------------------------- // Max number of urls... //----------------------------------------- if( isset($sig_restrictions[4]) and $sig_restrictions[4] !== '' ) { if( $parser->getUrlCount( $signature ) > $sig_restrictions[4] ) { $sig_errors[] = sprintf( $this->lang->words['sig_toomanyurls'], $sig_restrictions[4] ); } else { if( count($matches[1]) > $sig_restrictions[4] ) { $sig_errors[] = sprintf( $this->lang->words['sig_toomanyurls'], $sig_restrictions[4] ); } } } $this->settings['signature_line_length'] = $this->settings['signature_line_length'] > 0 ? $this->settings['signature_line_length'] : 200; /* You can't wordwrap on HTML http://community.invisionpower.com/resources/bugs.html/_/ip-board/signature-url-bbcode-r41254 */ //$signature = wordwrap( $signature, $this->settings['signature_line_length'], '</p>', true ); // http://community.invisionpower.com/tracker/issue-35105-signature-restriction-minor-bug $signature = preg_replace( '#^\s*(</p>)+#i', '', $signature ); $signature = preg_replace( '#(</p>)+?\s*$#i', '', $signature ); //----------------------------------------- // Max number of lines of text... //----------------------------------------- if( isset($sig_restrictions[5]) and $sig_restrictions[5] !== '' ) { $lineCount = substr_count( $signature, "</p>" ) + substr_count( $signature, "br>" ); if( $lineCount >= $sig_restrictions[5] ) { $sig_errors[] = sprintf( $this->lang->words['sig_toomanylines'], $sig_restrictions[5] ); } } //----------------------------------------- // Now the crappy part.. //----------------------------------------- if( isset($sig_restrictions[2]) and $sig_restrictions[2] !== '' AND isset($sig_restrictions[3]) and $sig_restrictions[3] !== '' ) { preg_match_all( '/\<img([^>]+?)>/i', $signature, $allImages ); if( count($allImages[1]) ) { foreach( $allImages[1] as $foundImage ) { preg_match( '#src=[\'"]([^\'"]+?)[\'"]#i', $foundImage, $url ); $imageProperties = @getimagesize( $url[1] ); if( is_array($imageProperties) AND count($imageProperties) ) { if( $imageProperties[0] > $sig_restrictions[2] OR $imageProperties[1] > $sig_restrictions[3] ) { $sig_errors[] = sprintf( $this->lang->words['sig_imagetoobig'], $url[1], $sig_restrictions[2], $sig_restrictions[3] ); } } else { $sig_errors[] = $this->lang->words['sig_imagenotretrievable']; } } } } if( count($sig_errors) ) { $this->registry->getClass('output')->showError( implode( '<br />', $sig_errors ), 10211 ); } /* Save HTML status */ $members_bitoptions = IPSBWOptions::thaw( $this->memberData['members_bitoptions'], 'members', 'global' ); $members_bitoptions['bw_html_sig'] = $isHtml; //----------------------------------------- // Write it to the DB. //----------------------------------------- IPSMember::save( $this->memberData['member_id'], array( 'members' => $members_bitoptions, 'extendedProfile' => array( 'signature' => $signature ) ) ); /* Update cache */ IPSContentCache::update( $this->memberData['member_id'], 'sig', $parser->display( $signature ) ); return TRUE; } /** * UserCP Save Form: Minecraft * * @return array Errors */ public function saveMinecraft() { /* Load editor stuff */ $classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/classes/editor/composite.php', 'classes_editor_composite' ); $this->editor = new $classToLoad(); $this->editor->setLegacyMode(false); $isHtml = intval( $this->request['minecraft_htmlstatus'] ); //----------------------------------------- // Check to make sure that we can edit profiles.. //----------------------------------------- if ( ! $this->memberData['g_edit_profile'] AND ! $this->memberData['g_minecraft_unit'] ) ) { $this->registry->getClass('output')->showError( 'members_profile_disabled', 1028, null, null, 403 ); } //----------------------------------------- // Post process the editor // Now we have safe HTML and bbcode //----------------------------------------- /* Set content in editor */ $this->editor->setAllowBbcode( true ); $this->editor->setAllowSmilies( true ); $this->editor->setIsHtml( $this->memberData['g_dohtml'] && $isHtml ); $this->editor->setBbcodeSection('minecraft'); $this->editor->setContent( $this->memberData['minecraft'] ); $minecraft = $this->editor->process( $_POST['Post'] ); //----------------------------------------- // Parse post //----------------------------------------- /* Load parser */ $classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/classes/text/parser.php', 'classes_text_parser' ); $parser = new $classToLoad(); $parser->testForParsingLimits( $minecraft, array( 'quote', 'emoticons', 'urls' ) ); if ( is_array( $parser->getErrors() ) && count( $parser->getErrors() ) ) { $this->lang->loadLanguageFile( array( 'public_post' ), 'forums' ); $_error = array_pop( $parser->getErrors() ); $this->registry->getClass('output')->showError( $_error, 10210 ); } //----------------------------------------- // Signature restrictions... //----------------------------------------- $minecraft_errors = array(); $minecraft = preg_replace( '#^\s*(</p>)+#i', '', $minecraft ); $minecraft = preg_replace( '#(</p>)+?\s*$#i', '', $minecraft ); if( count($minecraft_errors) ) { $this->registry->getClass('output')->showError( implode( '<br />', $minecraft_errors ), 10211 ); } /* Save HTML status */ $members_bitoptions = IPSBWOptions::thaw( $this->memberData['members_bitoptions'], 'members', 'global' ); $members_bitoptions['bw_html_minecraft'] = $isHtml; //----------------------------------------- // Write it to the DB. //----------------------------------------- IPSMember::save( $this->memberData['member_id'], array( 'members' => $members_bitoptions, 'extendedProfile' => array( 'minecraft' => $minecraft ) ) ); /* Update cache */ IPSContentCache::update( $this->memberData['member_id'], 'minecraft', $parser->display( $minecraft ) ); return TRUE; } /** * UserCP Save Form: Profile Info * * @return array Errors */ public function saveProfileInfo() { /* Load editor stuff */ if( $this->request['updateAboutMe'] ) { $classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/classes/editor/composite.php', 'classes_editor_composite' ); $this->editor = new $classToLoad(); $this->editor->setLegacyMode(false); } //----------------------------------------- // INIT //----------------------------------------- $pp_setting_moderate_comments = intval( $this->request['pp_setting_moderate_comments'] ); $pp_setting_moderate_friends = intval( $this->request['pp_setting_moderate_friends'] ); $pp_setting_count_visitors = intval( $this->request['pp_setting_count_visitors'] ); $pp_setting_count_comments = intval( $this->request['pp_setting_count_comments'] ); $pp_setting_count_friends = intval( $this->request['pp_setting_count_friends'] ); //----------------------------------------- // Check to make sure that we can edit profiles.. //----------------------------------------- if ( ! $this->memberData['g_edit_profile'] ) { $this->registry->getClass('output')->showError( 'members_profile_disabled', 10214, null, null, 403 ); } //----------------------------------------- // make sure that either we entered // all calendar fields, or we left them // all blank //----------------------------------------- $c_cnt = 0; foreach ( array('day','month','year') as $v ) { if ( $this->request[ $v ] ) { $c_cnt++; } } if( $c_cnt > 0 && $c_cnt < 2 ) { $this->registry->getClass('output')->showError( 'member_bad_birthday', 10215 ); } else if( $c_cnt > 0 ) { //----------------------------------------- // Make sure it's a legal date //----------------------------------------- $_year = $this->request['year'] ? $this->request['year'] : 2000; if ( ! checkdate( $this->request['month'], $this->request['day'], $_year ) ) { $this->registry->getClass('output')->showError( 'member_bad_birthday', 10216 ); } } //----------------------------------------- // Start off our array //----------------------------------------- $core = array( 'bday_day' => $this->request['day'], 'bday_month' => $this->request['month'], 'bday_year' => $this->request['year'], ); $extendedProfile = array( 'pp_setting_moderate_comments' => $pp_setting_moderate_comments, 'pp_setting_moderate_friends' => $pp_setting_moderate_friends, 'pp_setting_count_visitors' => $pp_setting_count_visitors, 'pp_setting_count_comments' => $pp_setting_count_comments, 'pp_setting_count_friends' => $pp_setting_count_friends ); //----------------------------------------- // check to see if we can enter a member title // and if one is entered, update it. //----------------------------------------- if( isset( $this->request['member_title'] ) and ( $this->settings['post_titlechange'] == -1 or ( $this->settings['post_titlechange'] and $this->memberData['posts'] >= $this->settings['post_titlechange'] ) ) ) { $core['title'] = IPSText::getTextClass('bbcode')->stripBadWords( $this->request['member_title'] ); } //----------------------------------------- // Custom profile field stuff //----------------------------------------- $classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/classes/customfields/profileFields.php', 'customProfileFields' ); $fields = new $classToLoad(); $fields->member_data = $this->member->fetchMemberData(); $fields->initData( 'edit' ); /* Use $_POST and not ipsRegistry::$request as the custom profile field kernel class has its own cleaning routines for saving and showing which means we end up with double & -> & conversion (&lt;, etc) */ $fields->parseToSave( $_POST ); if( $fields->error_messages ) { return $fields->error_messages; } /* Check the website url field */ $website_field = $fields->getFieldIDByKey( 'website' ); if( $website_field && $fields->out_fields[ 'field_' . $website_field ] ) { { } } //----------------------------------------- // Check... //----------------------------------------- if ( count( $fields->error_fields['empty'] ) ) { $this->registry->getClass('output')->showError( array( 'customfields_empty', $fields->error_fields['empty'][0]['pf_title'] ), 10217 ); } if ( count( $fields->error_fields['invalid'] ) ) { $this->registry->getClass('output')->showError( array( 'customfields_invalid', $fields->error_fields['invalid'][0]['pf_title'] ), 10218 ); } if ( count( $fields->error_fields['toobig'] ) ) { $this->registry->getClass('output')->showError( array( 'customfields_toobig', $fields->error_fields['toobig'][0]['pf_title'] ), 10219 ); } /* About me */ if( $this->request['updateAboutMe'] ) { $extendedProfile['pp_about_me'] = $this->editor->process( $_POST['Post'] ); } /* Open ID & times*/ $timeZone = IPSText::alphanumericalClean( $this->request['timeZone'], '+.' ); $dst_correct = intval( $this->request['dst_correct'] ); /* Add into array */ $core['time_offset'] = $timeZone; /* http://community.invisionpower.com/resources/bugs.html/_/ip-board/cannot-uncheck-my-timezone-is-currently-in-dst-checkbox-in-profile-r41510 */ //$core['dst_in_use'] = $this->settings['time_dst_auto_correction'] ? ( ( $this->request['dstOption'] AND intval($this->request['dstCheck']) == 0 ) ? intval($this->request['dstOption']) : 0 ) : $this->memberData['dst_in_use']; $core['dst_in_use'] = $this->settings['time_dst_auto_correction'] ? ( ( $this->request['dstOption'] AND intval($this->request['dstCheck']) == 0 ) ? intval($this->request['dstOption']) : 0 ) : intval($this->request['dstOption']); $core['members_auto_dst'] = $this->settings['time_dst_auto_correction'] ? intval($this->request['dstCheck']) : $this->memberData['members_auto_dst']; //----------------------------------------- // Update the DB //----------------------------------------- IPSMember::save( $this->memberData['member_id'], array( 'core' => $core, 'customFields' => $fields->out_fields, 'extendedProfile' => $extendedProfile ) ); //----------------------------------------- // Update birthdays cache if user set to today // or if birthday was today but isn't now //----------------------------------------- if( $core['bday_month'] == date('m') AND $core['bday_day'] == date('d') ) { $this->cache->rebuildCache( 'birthdays', 'calendar' ); } else if( $this->memberData['bday_month'] == date('m') AND $this->memberData['bday_day'] == date('d') AND ( $core['bday_month'] != date('m') OR $core['bday_day'] != date('d') ) ) { $this->cache->rebuildCache( 'birthdays', 'calendar' ); } return TRUE; } /** * UserCP Save Form: Notifications config * * @return boolean Successful */ public function saveFormNotifications() { //----------------------------------------- // Notifications library //----------------------------------------- $classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . '/sources/classes/member/notifications.php', 'notifications' ); $notifyLibrary = new $classToLoad( $this->registry ); $notifyLibrary->setMember( $this->memberData ); //----------------------------------------- // Show the form //----------------------------------------- $_basicOptions = array( array( 'email', $this->lang->words['notopt__email'] ), array( 'inline', $this->lang->words['notopt__inline'] ), array( 'mobile' => $this->lang->words['notopt__mobile'] ) ); $_configOptions = $notifyLibrary->getNotificationData(); $_notifyConfig = $notifyLibrary->getMemberNotificationConfig( $this->memberData ); $_defaultConfig = $notifyLibrary->getDefaultNotificationConfig(); $_saveConfig = array(); foreach( $_configOptions as $option ) { $_saveConfig[ $option['key'] ] = array(); $_saveConfig[ $option['key'] ]['selected'] = array(); //----------------------------------------- // Loop through and mark what we selected. // Do not allow changing of stuff from disable_override // and disabled, however //----------------------------------------- if( is_array($this->request['config_' . $option['key'] ]) AND count($this->request['config_' . $option['key'] ]) ) { foreach( $this->request['config_' . $option['key'] ] as $_selected ) { if( !is_array($_defaultConfig[ $option['key'] ]['disabled']) OR !in_array( $_selected, $_defaultConfig[ $option['key'] ]['disabled'] ) ) { $_saveConfig[ $option['key'] ]['selected'][] = $_selected; } } } if( $_defaultConfig[ $option['key'] ]['disable_override'] ) { $_saveConfig[ $option['key'] ]['selected'] = $_defaultConfig[ $option['key'] ]['selected']; } } //----------------------------------------- // Save //----------------------------------------- IPSMember::packMemberCache( $this->memberData['member_id'], array( 'notifications' => $_saveConfig, 'show_notification_popup' => intval($this->request['show_notification_popup']) ), $this->memberData['members_cache'] ); //----------------------------------------- // Topic preferences //----------------------------------------- $_trackChoice = ''; if ( $this->request['auto_track'] ) { if ( in_array( $this->request['trackchoice'], array( 'none', 'immediate', 'offline', 'daily', 'weekly' ) ) ) { $_trackChoice = $this->request['trackchoice']; } } //----------------------------------------- // Profile preferences //----------------------------------------- IPSMember::save( $this->memberData['member_id'], array( 'core' => array( 'allow_admin_mails' => intval( $this->request['admin_send'] ), 'auto_track' => $_trackChoice ) ) ); return TRUE; } /** * UserCP Save Form: Password * * @param array Array of member / core_sys_login information (if we're editing) * @return mixed Array of errors / boolean true */ public function saveFormPassword( $member=array() ) { //----------------------------------------- // INIT //----------------------------------------- $cur_pass = trim($this->request['current_pass']); $new_pass = trim($this->request['new_pass_1']); $chk_pass = trim($this->request['new_pass_2']); $isRemote = ( ! $this->memberData['bw_local_password_set'] AND $this->memberData['members_created_remote'] ) ? true : false; //----------------------------------------- // Checks... //----------------------------------------- if( $this->memberData['g_access_cp'] ) { return array( 0 => $this->lang->words['admin_emailpassword'] ); } if ( $isRemote === false AND ( ! $_POST['current_pass'] OR ( empty($new_pass) ) or ( empty($chk_pass) ) ) ) { return array( 0 => $this->lang->words['complete_entire_form'] ); } //----------------------------------------- // Do the passwords actually match? //----------------------------------------- if ( $new_pass != $chk_pass ) { return array( 0 => $this->lang->words['passwords_not_matchy'] ); } //----------------------------------------- // Check password... //----------------------------------------- if ( $isRemote === false ) { if ( $this->_checkPassword( $cur_pass ) !== TRUE ) { return array( 0 => $this->lang->words['current_pw_bad'] ); } } else { /* This is INIT in _checkPassword */ $classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/handlers/han_login.php', 'han_login' ); $this->han_login = new $classToLoad( $this->registry ); $this->han_login->init(); } //----------------------------------------- // Create new password... //----------------------------------------- $md5_pass = md5($new_pass); //----------------------------------------- // han_login was loaded during check_password //----------------------------------------- $this->han_login->changePass( $this->memberData['email'], $md5_pass, $new_pass, $this->memberData ); if ( $this->han_login->return_code AND $this->han_login->return_code != 'METHOD_NOT_DEFINED' AND $this->han_login->return_code != 'SUCCESS' ) { return array( 0 => $this->lang->words['hanlogin_pw_failed'] ); } //----------------------------------------- // Update the DB //----------------------------------------- IPSMember::updatePassword( $this->memberData['member_id'], $md5_pass ); IPSLib::runMemberSync( 'onPassChange', $this->memberData['member_id'], $new_pass ); //----------------------------------------- // Update members log in key... //----------------------------------------- $key = IPSMember::generateAutoLoginKey(); IPSMember::save( $this->memberData['member_id'], array( 'core' => array( 'member_login_key' => $key, 'bw_local_password_set' => 1 ) ) ); $this->ok_message = $this->lang->words['pw_change_successful']; return TRUE; } /** * UserCP Save Form: Display Name * * @return mixed Array of errors / boolean true */ public function saveFormDisplayname() { //----------------------------------------- // INIT //----------------------------------------- $members_display_name = trim($this->request['displayName']); $password_check = trim( $this->request['displayPassword'] ); //----------------------------------------- // Check for blanks... //----------------------------------------- if ( ! $members_display_name OR ( ! $this->_isFBUser AND ! $password_check ) ) { return array( 0 => $this->lang->words['complete_entire_form'] ); } //----------------------------------------- // Check password //----------------------------------------- if ( ! $this->_isFBUser ) { if ( $this->_checkPassword( $password_check ) === FALSE ) { return array( 0 => $this->lang->words['current_pw_bad'] ); } } try { if ( IPSMember::getFunction()->updateName( $this->memberData['member_id'], $members_display_name, 'members_display_name' ) === TRUE ) { $this->cache->rebuildCache( 'stats', 'global' ); return $this->showFormDisplayname( '', $this->lang->words['dname_change_ok'] ); } else { # We should absolutely never get here. So this is a fail-safe, really to # prevent a "false" positive outcome for the end-user return array( 0 => $this->lang->words['name_taken_change'] ); } } catch( Exception $error ) { switch( $error->getMessage() ) { case 'NO_MORE_CHANGES': return array( 0 => $this->lang->words['name_change_no_more'] ); break; case 'NO_USER': return array( 0 => $this->lang->words['name_change_noload'] ); break; case 'NO_PERMISSION': return array( 0 => $this->lang->words['name_change_noperm'] ); case 'NO_NAME': return array( 0 => sprintf( $this->lang->words['name_change_tooshort'], $this->settings['max_user_name_length'] ) ); break; case 'TOO_LONG': return array( 0 => sprintf( $this->lang->words['name_change_tooshort'], $this->settings['max_user_name_length'] ) ); break; case 'ILLEGAL_CHARS': return array( 0 => $this->lang->words['name_change_illegal'] ); break; case 'USER_NAME_EXISTS': return array( 0 => $this->lang->words['name_change_taken'] ); break; default: return array( 0 => $error->getMessage() ); break; } } return TRUE; } /** * UserCP Save Form: Email Address * * @return mixed Array of errors / boolean true */ public function saveFormEmailPassword() { //----------------------------------------- // INIT //----------------------------------------- $_emailOne = strtolower( trim($this->request['in_email_1']) ); $_emailTwo = strtolower( trim($this->request['in_email_2']) ); $cur_pass = trim($this->request['current_pass']); $new_pass = trim($this->request['new_pass_1']); $chk_pass = trim($this->request['new_pass_2']); $isRemote = ( ! $this->memberData['bw_local_password_set'] AND $this->memberData['members_created_remote'] ) ? true : false; if ( $cur_pass OR $new_pass ) { if( $this->memberData['g_access_cp'] ) { return array( 0 => $this->lang->words['admin_emailpassword'] ); } if ( $isRemote === false AND ( ! $_POST['current_pass'] OR ( empty($new_pass) ) or ( empty($chk_pass) ) ) ) { return array( 0 => $this->lang->words['complete_entire_form'] ); } //----------------------------------------- // Do the passwords actually match? //----------------------------------------- if ( $new_pass != $chk_pass ) { return array( 0 => $this->lang->words['passwords_not_matchy'] ); } //----------------------------------------- // Check password... //----------------------------------------- if ( $isRemote === false ) { if ( $this->_checkPassword( $cur_pass ) !== TRUE ) { return array( 0 => $this->lang->words['current_pw_bad'] ); } } else { /* This is INIT in _checkPassword */ $classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/handlers/han_login.php', 'han_login' ); $this->han_login = new $classToLoad( $this->registry ); $this->han_login->init(); } //----------------------------------------- // Create new password... //----------------------------------------- $md5_pass = md5($new_pass); //----------------------------------------- // han_login was loaded during check_password //----------------------------------------- $this->han_login->changePass( $this->memberData['email'], $md5_pass, $new_pass, $this->memberData ); if ( $this->han_login->return_code AND $this->han_login->return_code != 'METHOD_NOT_DEFINED' AND $this->han_login->return_code != 'SUCCESS' ) { return array( 0 => $this->lang->words['hanlogin_pw_failed'] ); } //----------------------------------------- // Update the DB //----------------------------------------- IPSMember::updatePassword( $this->memberData['email'], $md5_pass ); IPSLib::runMemberSync( 'onPassChange', $this->memberData['member_id'], $new_pass ); //----------------------------------------- // Update members log in key... //----------------------------------------- $key = IPSMember::generateAutoLoginKey(); IPSMember::save( $this->memberData['member_id'], array( 'core' => array( 'member_login_key' => $key, 'bw_local_password_set' => 1 ) ) ); $this->ok_message = $this->lang->words['pw_change_successful']; } if ( $_emailOne or $_emailTwo ) { //----------------------------------------- // Do not allow validating members to change // email when admin validation is on // @see http://community.invisionpower.com/tracker/issue-19964-loophole-in-registration-procedure/ //----------------------------------------- if( $this->memberData['member_group_id'] == $this->settings['auth_group'] AND in_array( $this->settings['reg_auth_type'], array( 'admin', 'admin_user' ) ) ) { $this->registry->output->showError( $this->lang->words['admin_val_no_email_chg'], 10190 ); } //----------------------------------------- // Check input //----------------------------------------- if( $this->memberData['g_access_cp'] ) { return array( 0 => $this->lang->words['admin_emailpassword'] ); } if ( ! $_POST['in_email_1'] OR ! $_POST['in_email_2'] ) { return array( 0 => $this->lang->words['complete_entire_form'] ); } //----------------------------------------- // Check password... //----------------------------------------- if ( ! $this->_isFBUser ) { if ( $this->_checkPassword( $this->request['password'] ) === FALSE ) { return array( 0 => $this->lang->words['current_pw_bad'] ); } } //----------------------------------------- // Test email addresses //----------------------------------------- if ( $_emailOne != $_emailTwo ) { return array( 0 => $this->lang->words['emails_no_matchy'] ); } if ( IPSText::checkEmailAddress( $_emailOne ) !== TRUE ) { return array( 0 => $this->lang->words['email_not_valid'] ); } //----------------------------------------- // Is this email addy taken? //----------------------------------------- if ( IPSMember::checkByEmail( $_emailOne ) == TRUE ) { return array( 0 => $this->lang->words['email_is_taken'] ); } //----------------------------------------- // Load ban filters //----------------------------------------- $banfilters = array(); $this->DB->build( array( 'select' => '*', 'from' => 'banfilters' ) ); $this->DB->execute(); while( $r = $this->DB->fetch() ) { $banfilters[ $r['ban_type'] ][] = $r['ban_content']; } //----------------------------------------- // Check in banned list //----------------------------------------- if ( isset($banfilters['email']) AND is_array( $banfilters['email'] ) and count( $banfilters['email'] ) ) { foreach ( $banfilters['email'] as $email ) { $email = str_replace( '\*', '.*' , preg_quote($email, "/") ); if ( preg_match( "/^{$email}$/i", $_emailOne ) ) { return array( 0 => $this->lang->words['email_is_taken'] ); } } } //----------------------------------------- // Load handler... //----------------------------------------- $classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/handlers/han_login.php', 'han_login' ); $this->han_login = new $classToLoad( $this->registry ); $this->han_login->init(); if ( $this->han_login->emailExistsCheck( $_emailOne ) !== FALSE ) { return array( 0 => $this->lang->words['email_is_taken'] ); } $this->han_login->changeEmail( $this->memberData['email'], $_emailOne, $this->memberData ); if ( $this->han_login->return_code AND $this->han_login->return_code != 'METHOD_NOT_DEFINED' AND $this->han_login->return_code != 'SUCCESS' ) { return array( 0 => $this->lang->words['email_is_taken'] ); } //----------------------------------------- // Want a new validation? NON ADMINS ONLY //----------------------------------------- if ( $this->settings['reg_auth_type'] AND !$this->memberData['g_access_cp'] ) { //----------------------------------------- // Remove any existing entries //----------------------------------------- $_previous = $this->DB->buildAndFetch( array( 'select' => 'prev_email, real_group', 'from' => 'validating', 'where' => "member_id={$this->memberData['member_id']} AND email_chg=1" ) ); if( $_previous['prev_email'] ) { $this->DB->delete( 'validating', "member_id={$this->memberData['member_id']} AND email_chg=1" ); $this->memberData['email'] = $_previous['prev_email']; $this->memberData['member_group_id'] = $_previous['real_group']; } $validate_key = md5( IPSMember::makePassword() . time() ); //----------------------------------------- // Update the new email, but enter a validation key // and put the member in "awaiting authorisation" // and send an email.. //----------------------------------------- $db_str = array( 'vid' => $validate_key, 'member_id' => $this->memberData['member_id'], 'temp_group' => $this->settings['auth_group'], 'entry_date' => time(), 'coppa_user' => 0, 'email_chg' => 1, 'ip_address' => $this->member->ip_address, 'prev_email' => $this->memberData['email'], ); if ( $this->memberData['member_group_id'] != $this->settings['auth_group'] ) { $db_str['real_group'] = $this->memberData['member_group_id']; } $this->DB->insert( 'validating', $db_str ); IPSLib::runMemberSync( 'onEmailChange', $this->memberData['member_id'], strtolower( $_emailOne ), $this->memberData['email'] ); IPSMember::save( $this->memberData['member_id'], array( 'core' => array( 'member_group_id' => $this->settings['auth_group'], 'email' => $_emailOne ) ) ); //----------------------------------------- // Update their session with the new member group //----------------------------------------- if ( $this->member->session_id ) { $this->member->sessionClass()->convertMemberToGuest(); } //----------------------------------------- // Kill the cookies to stop auto log in //----------------------------------------- IPSCookie::set( 'pass_hash' , '-1', 0 ); IPSCookie::set( 'member_id' , '-1', 0 ); IPSCookie::set( 'session_id' , '-1', 0 ); //----------------------------------------- // Dispatch the mail, and return to the activate form. //----------------------------------------- IPSText::getTextClass( 'email' )->getTemplate("newemail"); IPSText::getTextClass( 'email' )->buildMessage( array( 'NAME' => $this->memberData['members_display_name'], 'THE_LINK' => $this->settings['base_url']."app=core&module=global&section=register&do=auto_validate&type=newemail&uid=".$this->memberData['member_id']."&aid=".$validate_key, 'ID' => $this->memberData['member_id'], 'MAN_LINK' => $this->settings['base_url']."app=core&module=global&section=register&do=07", 'CODE' => $validate_key, ) ); IPSText::getTextClass( 'email' )->subject = $this->lang->words['lp_subject'].' '.$this->settings['board_name']; IPSText::getTextClass( 'email' )->to = $_emailOne; IPSText::getTextClass( 'email' )->sendMail(); $this->registry->getClass('output')->silentRedirect( $this->settings['base_url'] . 'app=core&module=global&section=register&do=07' ); } else { //----------------------------------------- // No authorisation needed, change email addy and return //----------------------------------------- IPSLib::runMemberSync( 'onEmailChange', $this->memberData['member_id'], strtolower( $_emailOne ), $this->memberData['email'] ); IPSMember::save( $this->memberData['member_id'], array( 'core' => array( 'email' => $_emailOne ) ) ); //----------------------------------------- // Add to OK message //----------------------------------------- $this->ok_message = $this->lang->words['ok_email_changed']; } } return TRUE; } /** * Password check * * @param string Plain Text Password * @return boolean Password matched or not */ protected function _checkPassword( $password_check ) { //----------------------------------------- // Ok, check password first //----------------------------------------- $classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/handlers/han_login.php', 'han_login' ); $this->han_login = new $classToLoad( $this->registry ); $this->han_login->init(); //----------------------------------------- // Is this a username or email address? //----------------------------------------- $this->han_login->loginPasswordCheck( $this->memberData['name'], $this->memberData['email'], $password_check ); if ( $this->han_login->return_code == 'SUCCESS' ) { return TRUE; } else { return FALSE; } } } [/long]
  24. 4 linijki pod tym /* Set content in editor */ $this->editor->setLegacyMode(false); $this->editor->setAllowBbcode( true ); $this->editor->setAllowSmilies( true ); $this->editor->setAllowHtml( $this->memberData['g_dohtml'] ); $this->editor->setIsHtml( $this->memberData['bw_html_minecraft'] ); $this->editor->setBbcodeSection('minecraft'); $this->editor->setContent( $this->memberData['minecraft'] );
  25. Nie skopiowałem całego kodu. public function formMinecraft() { /* Load editor stuff */ $classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/classes/editor/composite.php', 'classes_editor_composite' ); $this->editor = new $classToLoad(); /* HTML checkbox language strings */ $this->registry->getClass('class_localization')->loadLanguageFile( array( 'public_post' ), 'forums' ); //----------------------------------------- // Check to make sure that we can edit profiles.. //----------------------------------------- $minecraft_restrictions = explode( ':', $this->memberData['g_minecraft_limits'] ); if ( ! $this->memberData['g_edit_profile'] OR ( $minecraft_restrictions[0] AND ! $this->memberData['g_minecraft_unit'] ) ) { $this->registry->getClass('output')->showError( 'members_profile_disabled', 1024, null, null, 403 ); } if( $form['_noPerm'] ) { return $this->registry->getClass('output')->getTemplate('ucp')->membersMinecraftFormError( $form ); } } Klamr otwierających jest tyle co zamykających.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę.