Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php /*
- ocPortal
- Copyright (c) ocProducts, 2004-2012
- See text/EN/licence.txt for full licencing information.
- NOTE TO PROGRAMMERS:
- Do not edit this file. If you need to make changes, save your changed file to the appropriate *_custom folder
- **** If you ignore this advice, then your website upgrades (e.g. for bug fixes) will likely kill your changes ****
- */
- /**
- * @license http://opensource.org/licenses/cpal_1.0 Common Public Attribution License
- * @copyright ocProducts Ltd
- * @package core_forum_drivers
- */
- /**
- * Forum Driver.
- * @package core_forum_drivers
- */
- class forum_driver_phpbb2 extends forum_driver_base
- {
- /**
- * Check the connected DB is valid for this forum driver.
- *
- * @return boolean Whether it is valid
- */
- function check_db()
- {
- $test=$this->connection->query('SELECT COUNT(*) FROM '.$this->connection->get_table_prefix().'users',NULL,NULL,true);
- return !is_null($test);
- }
- /**
- * Get the rows for the top given number of posters on the forum.
- *
- * @param integer The limit to the number of top posters to fetch
- * @return array The rows for the given number of top posters in the forum
- */
- function get_top_posters($limit)
- {
- return $this->connection->query('SELECT * FROM '.$this->connection->get_table_prefix().'users WHERE user_id<>'.strval((integer)$this->get_guest_id()).' ORDER BY user_posts DESC',$limit);
- }
- /**
- * Attempt to to find the member's language from their forum profile. It converts between language-identifiers using a map (lang/map.ini).
- *
- * @param MEMBER The member who's language needs to be fetched
- * @return ?LANGUAGE_NAME The member's language (NULL: unknown)
- */
- function forum_get_lang($member)
- {
- return $this->get_member_row_field($member,'user_lang');
- }
- /**
- * Find if the login cookie contains the login name instead of the member id.
- *
- * @return boolean Whether the login cookie contains a login name or a member id
- */
- function is_cookie_login_name()
- {
- return false;
- }
- /**
- * Find if login cookie is md5-hashed.
- *
- * @return boolean Whether the login cookie is md5-hashed
- */
- function is_hashed()
- {
- return false;
- }
- /**
- * Find the member id of the forum guest member.
- *
- * @return MEMBER The member id of the forum guest member
- */
- function get_guest_id()
- {
- return (-1);
- }
- /**
- * Get the forums' table prefix for the database.
- *
- * @return string The forum database table prefix
- */
- function get_drivered_table_prefix()
- {
- global $SITE_INFO;
- return $SITE_INFO['phpbb_table_prefix'];
- }
- /**
- * Add the specified custom field to the forum (some forums implemented this using proper custom profile fields, others through adding a new field).
- *
- * @param string The name of the new custom field
- * @param integer The length of the new custom field
- * @return boolean Whether the custom field was created successfully
- */
- function install_create_custom_field($name,$length)
- {
- unset($length);
- $this->connection->query('ALTER TABLE '.$this->connection->get_table_prefix().'users ADD ocp_'.$name.' TEXT',NULL,NULL,true);
- return true;
- }
- /**
- * Get an array of attributes to take in from the installer. Almost all forums require a table prefix, which the requirement there-of is defined through this function.
- * The attributes have 4 values in an array
- * - name, the name of the attribute for info.php
- * - default, the default value (perhaps obtained through autodetection from forum config)
- * - description, a textual description of the attributes
- * - title, a textual title of the attribute
- *
- * @return array The attributes for the forum
- */
- function install_specifics()
- {
- global $INFO;
- $a=array();
- $a['name']='phpbb_table_prefix';
- $a['default']=array_key_exists('sql_tbl_prefix',$INFO)?$INFO['sql_tbl_prefix']:'phpbb_';
- $a['description']=do_lang('MOST_DEFAULT');
- $a['title']='phpBB '.do_lang('TABLE_PREFIX');
- return array($a);
- }
- /**
- * Searches for forum auto-config at this path.
- *
- * @param PATH The path in which to search
- * @return boolean Whether the forum auto-config could be found
- */
- function install_test_load_from($path)
- {
- global $INFO;
- if (@file_exists($path.'/config.php'))
- {
- $dbname='';
- $dbuser='';
- $dbpasswd='';
- $table_prefix='';
- @include($path.'/config.php');
- $INFO['sql_database']=$dbname;
- $INFO['sql_user']=$dbuser;
- $INFO['sql_pass']=$dbpasswd;
- $INFO['board_url']='';
- $INFO['sql_tbl_prefix']=$table_prefix;
- $INFO['cookie_member_id']='phpbb2mysql_data:userid';
- $INFO['cookie_member_hash']='phpbb2mysql_data:autologinid';
- return true;
- }
- return false;
- }
- /**
- * Get an array of paths to search for config at.
- *
- * @return array The paths in which to search for the forum config
- */
- function install_get_path_search_list()
- {
- return array(
- 0=>'forums',
- 1=>'forum',
- 2=>'boards',
- 3=>'board',
- 4=>'phpBB',
- 5=>'phpBB2',
- 6=>'upload',
- 7=>'uploads',
- 8=>'phpbb',
- 9=>'phpbb2',
- 10=>'../forums',
- 11=>'../forum',
- 12=>'../boards',
- 13=>'../board',
- 14=>'../phpBB',
- 15=>'../phpBB2',
- 16=>'../upload',
- 17=>'../uploads',
- 18=>'../phpbb',
- 19=>'../phpbb2');
- }
- /**
- * Get an emoticon chooser template.
- *
- * @param string The ID of the form field the emoticon chooser adds to
- * @return tempcode The emoticon chooser template
- */
- function get_emoticon_chooser($field_name='post')
- {
- require_code('comcode_text');
- $emoticons=$this->connection->query_select('smilies',array('*'),NULL,'GROUP BY code');
- $em=new ocp_tempcode();
- foreach ($emoticons as $emo)
- {
- $code=$emo['code'];
- $em->attach(do_template('EMOTICON_CLICK_CODE',array('_GUID'=>'37ca734c4aea443920632e36e48fabc0','FIELD_NAME'=>$field_name,'CODE'=>$code,'IMAGE'=>apply_emoticons($code))));
- }
- return $em;
- }
- /**
- * Pin a topic.
- *
- * @param AUTO_LINK The topic ID
- */
- function pin_topic($id)
- {
- $this->connection->query_update('topics',array('topic_type'=>1),array('topic_id'=>$id),'',1);
- }
- /**
- * Set a custom profile fields value. It should not be called directly.
- *
- * @param MEMBER The member id
- * @param string The field name
- * @param string The value
- */
- function set_custom_field($member,$field,$amount)
- {
- $this->connection->query_update('users',array('ocp_'.$field=>$amount),array('user_id'=>$member),'',NULL,NULL,false,true);
- }
- /**
- * Get custom profile fields values for all 'ocp_' prefixed keys.
- *
- * @param MEMBER The member id
- * @return ?array A map of the custom profile fields, key_suffix=>value (NULL: no fields)
- */
- function get_custom_fields($member)
- {
- $row=$this->get_member_row($member);
- $out=array();
- foreach ($row as $attribute=>$value)
- {
- if (substr($attribute,0,4)=='ocp_') $out[substr($attribute,4)]=$value;
- }
- return $out;
- }
- /**
- * Get a member profile-row for the member of the given name.
- *
- * @param SHORT_TEXT The member name
- * @return ?array The profile-row (NULL: not found)
- */
- function pget_row($name)
- {
- $rows=$this->connection->query_select('users',array('*'),array('username'=>$name),'',1);
- if (!array_key_exists(0,$rows)) return NULL;
- return $rows[0];
- }
- /**
- * From a member profile-row, get the member's primary usergroup.
- *
- * @param array The profile-row
- * @return GROUP The member's primary usergroup
- */
- function pname_group($r)
- {
- $id=$r['user_id'];
- // The first usergroup they're joined to
- $group=$this->connection->query_value_null_ok('user_group u LEFT JOIN '.$this->connection->get_table_prefix().'groups g ON u.group_id=g.group_id','g.group_id AS group_id',array('user_id'=>$id,'user_pending'=>0,'group_single_user'=>0));
- return $group;
- }
- /**
- * From a member profile-row, get the member's member id.
- *
- * @param array The profile-row
- * @return MEMBER The member id
- */
- function pname_id($r)
- {
- return $r['user_id'];
- }
- /**
- * From a member profile-row, get the member's last visit date.
- *
- * @param array The profile-row
- * @return TIME The last visit date
- */
- function pnamelast_visit($r)
- {
- return $r['user_lastvisit'];
- }
- /**
- * From a member profile-row, get the member's name.
- *
- * @param array The profile-row
- * @return string The member name
- */
- function pname_name($r)
- {
- return $r['username'];
- }
- /**
- * From a member profile-row, get the member's e-mail address.
- *
- * @param array The profile-row
- * @return SHORT_TEXT The member e-mail address
- */
- function pname_email($r)
- {
- return $r['user_email'];
- }
- /**
- * Get a URL to the specified member's home (control panel).
- *
- * @param MEMBER The member id
- * @return URLPATH The URL to the members home
- */
- function member_home_url($id)
- {
- unset($id);
- return get_forum_base_url().'/profile.php?mode=editprofile';
- }
- /**
- * Get the photo thumbnail URL for the specified member id.
- *
- * @param MEMBER The member id
- * @return URLPATH The URL (blank: none)
- */
- function get_member_photo_url($member)
- {
- unset($member);
- return '';
- }
- /**
- * Get the avatar URL for the specified member id.
- *
- * @param MEMBER The member id
- * @return URLPATH The URL (blank: none)
- */
- function get_member_avatar_url($member)
- {
- $options=$this->connection->query('SELECT * FROM '.$this->connection->get_table_prefix().'config WHERE '.db_string_equal_to('config_name','avatar_path').' OR '.db_string_equal_to('config_name','avatar_gallery_path'));
- $avatar_path=$options[0]['config_value'];
- $avatar_gallery_path=$options[1]['config_value'];
- $type=$this->get_member_row_field($member,'user_avatar_type');
- $filename=$this->get_member_row_field($member,'user_avatar');
- switch ($type)
- {
- case '1': // Upload
- return get_forum_base_url().'/'.$avatar_path.'/'.$filename;
- case '2': // Remote
- return $filename;
- case '3': // Gallery
- return get_forum_base_url().'/'.$avatar_gallery_path.'/'.$filename;
- }
- return '';
- }
- /**
- * Get a URL to the specified member's profile.
- *
- * @param MEMBER The member id
- * @return URLPATH The URL to the member profile
- */
- function _member_profile_url($id)
- {
- return get_forum_base_url().'/profile.php?mode=viewprofile&u='.strval($id);
- }
- /**
- * Get a URL to the registration page (for people to create member accounts).
- *
- * @return URLPATH The URL to the registration page
- */
- function _join_url()
- {
- return get_forum_base_url().'/profile.php?mode=register';
- }
- /**
- * Get a URL to the members-online page.
- *
- * @return URLPATH The URL to the members-online page
- */
- function _online_members_url()
- {
- return get_forum_base_url().'/viewonline.php';
- }
- /**
- * Get a URL to send a private/personal message to the given member.
- *
- * @param MEMBER The member id
- * @return URLPATH The URL to the private/personal message page
- */
- function _member_pm_url($id)
- {
- return get_forum_base_url().'/privmsg.php?mode=post&u='.strval($id);
- }
- /**
- * Get a URL to the specified forum.
- *
- * @param integer The forum ID
- * @return URLPATH The URL to the specified forum
- */
- function _forum_url($id)
- {
- return get_forum_base_url().'/viewforum.php?f='.strval($id);
- }
- /**
- * Get the forum ID from a forum name.
- *
- * @param SHORT_TEXT The forum name
- * @return integer The forum ID
- */
- function forum_id_from_name($forum_name)
- {
- return is_numeric($forum_name)?intval($forum_name):$this->connection->query_value_null_ok('forums','forum_id',array('forum_name'=>$forum_name));
- }
- /**
- * Convert an IP address into phpBB hexadecimal string format.
- *
- * @param IP The normal IP address
- * @return string The phpBB IP address
- */
- function _phpbb_ip($ip)
- {
- $ip_apart=explode('.',$ip);
- $_ip=dechex($ip_apart[0]).dechex($ip_apart[1]).dechex($ip_apart[2]).dechex($ip_apart[3]);
- return $_ip;
- }
- /**
- * Convert an IP address from phpBB hexadecimal string format.
- *
- * @param string The phpBB IP address
- * @return IP The normal IP address
- */
- function _un_phpbb_ip($ip)
- {
- $_ip=strval(hexdec($ip[0].$ip[1])).'.'.strval(hexdec($ip[2].$ip[3])).'.'.strval(hexdec($ip[4].$ip[5])).'.'.strval(hexdec($ip[6].$ip[7]));
- return $_ip;
- }
- /**
- * Makes a post in the specified forum, in the specified topic according to the given specifications. If the topic doesn't exist, it is created along with a spacer-post.
- * Spacer posts exist in order to allow staff to delete the first true post in a topic. Without spacers, this would not be possible with most forum systems. They also serve to provide meta information on the topic that cannot be encoded in the title (such as a link to the content being commented upon).
- *
- * @param SHORT_TEXT The forum name
- * @param SHORT_TEXT The topic identifier (usually <content-type>_<content-id>)
- * @param MEMBER The member ID
- * @param LONG_TEXT The post title
- * @param LONG_TEXT The post content in Comcode format
- * @param string The topic title; must be same as content title if this is for a comment topic
- * @param string This is put together with the topic identifier to make a more-human-readable topic title or topic description (hopefully the latter and a $content_title title, but only if the forum supports descriptions)
- * @param ?URLPATH URL to the content (NULL: do not make spacer post)
- * @param ?TIME The post time (NULL: use current time)
- * @param ?IP The post IP address (NULL: use current members IP address)
- * @param ?BINARY Whether the post is validated (NULL: unknown, find whether it needs to be marked unvalidated initially). This only works with the OCF driver.
- * @param ?BINARY Whether the topic is validated (NULL: unknown, find whether it needs to be marked unvalidated initially). This only works with the OCF driver.
- * @param boolean Whether to skip post checks
- * @param SHORT_TEXT The name of the poster
- * @param ?AUTO_LINK ID of post being replied to (NULL: N/A)
- * @param boolean Whether the reply is only visible to staff
- * @return array Topic ID (may be NULL), and whether a hidden post has been made
- */
- function make_post_forum_topic($forum_name,$topic_identifier,$member,$post_title,$_post,$content_title,$topic_identifier_encapsulation_prefix,$content_url=NULL,$time=NULL,$ip=NULL,$validated=NULL,$topic_validated=1,$skip_post_checks=false,$poster_name_if_guest='',$parent_id=NULL,$staff_only=false)
- {
- $__post=comcode_to_tempcode($_post);
- $post=$__post->evaluate();
- if (is_null($time)) $time=time();
- if (is_null($ip)) $ip=get_ip_address();
- $forum_id=$this->forum_id_from_name($forum_name);
- if (is_null($forum_id)) warn_exit(do_lang_tempcode('MISSING_FORUM',escape_html($forum_name)));
- $test=$this->connection->query_select('forums',array('*'),NULL,'',1);
- $fm=array_key_exists('hide_forum_in_cat',$test[0]);
- $topic_id=$this->find_topic_id_for_topic_identifier($forum_name,$topic_identifier);
- $ip_address=$this->_phpbb_ip($ip);
- $local_ip_address=$this->_phpbb_ip('127.0.0.1');
- if (is_null($topic_id))
- {
- $map=array('forum_id'=>$forum_id,'topic_title'=>$content_title.', '.$topic_identifier_encapsulation_prefix.': #'.$topic_identifier,'topic_poster'=>$member,'topic_time'=>$time,'topic_views'=>0,'topic_replies'=>0,'topic_status'=>0,'topic_vote'=>0,'topic_type'=>0,'topic_first_post_id'=>0,'topic_last_post_id'=>0,'topic_moved_id'=>0);
- if ($fm) $map=array_merge($map,array('answer_status'=>0,'topic_attachment'=>0,'topic_icon'=>0,'rating_rank_id'=>0,'title_compl_infos'=>NULL,'topic_priority'=>0));
- $topic_id=$this->connection->query_insert('topics',$map,true);
- $map=array('topic_id'=>$topic_id,'forum_id'=>$forum_id,'poster_id'=>-1,'post_time'=>$time,'poster_ip'=>$local_ip_address,'post_username'=>NULL,'enable_bbcode'=>1,'enable_html'=>0,'enable_smilies'=>1,'enable_sig'=>1,'post_edit_time'=>NULL,'post_edit_count'=>0);
- if ($fm) $map=array_merge($map,array('post_attachment'=>0,'post_edit_user'=>NULL,'post_icon'=>0,'post_bluecard'=>NULL,'rating_rank_id'=>0,'user_avatar'=>NULL,'user_avatar_type'=>0,'urgent_post'=>0));
- $post_id=$this->connection->query_insert('posts',$map,true);
- $home_link=hyperlink($content_url,escape_html($content_title));
- $map=array('post_id'=>$post_id,'bbcode_uid'=>'','post_subject'=>'','post_text'=>do_lang('SPACER_POST',$home_link->evaluate(),'','',get_site_default_lang()));
- $this->connection->query_insert('posts_text',$map);
- $this->connection->query('UPDATE '.$this->connection->get_table_prefix().'topics SET topic_first_post_id='.strval((integer)$post_id).' WHERE topic_id='.strval((integer)$topic_id),1);
- $this->connection->query('UPDATE '.$this->connection->get_table_prefix().'forums SET forum_topics=(forum_topics+1),forum_posts=(forum_posts+1) WHERE forum_id='.strval((integer)$forum_id),1);
- }
- if ($post=='') return array($topic_id,false);
- $map=array('topic_id'=>$topic_id,'forum_id'=>$forum_id,'poster_id'=>$member,'post_time'=>$time,'poster_ip'=>$ip_address,'post_username'=>NULL,'enable_bbcode'=>1,'enable_html'=>0,'enable_smilies'=>1,'enable_sig'=>1,'post_edit_time'=>NULL,'post_edit_count'=>0);
- if ($fm) $map=array_merge($map,array('post_attachment'=>0,'post_edit_user'=>NULL,'post_icon'=>0,'post_bluecard'=>NULL,'rating_rank_id'=>0,'user_avatar'=>NULL,'user_avatar_type'=>0,'urgent_post'=>0));
- $post_id=$this->connection->query_insert('posts',$map,true);
- $map=array('post_id'=>$post_id,'bbcode_uid'=>'','post_subject'=>$post_title,'post_text'=>$post);
- $this->connection->query_insert('posts_text',$map);
- $this->connection->query('UPDATE '.$this->connection->get_table_prefix().'forums SET forum_posts=(forum_posts+1), forum_last_post_id='.strval((integer)$post_id).' WHERE forum_id='.strval((integer)$forum_id),1);
- $this->connection->query('UPDATE '.$this->connection->get_table_prefix().'topics SET topic_replies=(topic_replies+1), topic_last_post_id='.strval((integer)$post_id).' WHERE topic_id='.strval((integer)$topic_id),1);
- return array($topic_id,false);
- }
- /**
- * Get an array of maps for the topic in the given forum.
- *
- * @param integer The topic ID
- * @param integer The comment count will be returned here by reference
- * @param integer Maximum comments to returned
- * @param integer Comment to start at
- * @param boolean Whether to mark the topic read (ignored for this forum driver)
- * @param boolean Whether to show in reverse
- * @return mixed The array of maps (Each map is: title, message, member, date) (-1 for no such forum, -2 for no such topic)
- */
- function get_forum_topic_posts($topic_id,&$count,$max=100,$start=0,$mark_read=true,$reverse=false)
- {
- if (is_null($topic_id)) return (-2);
- $order=$reverse?'post_time DESC':'post_time';
- $rows=$this->connection->query('SELECT * FROM '.$this->connection->get_table_prefix().'posts p LEFT JOIN '.$this->connection->get_table_prefix().'posts_text d ON p.post_id=d.post_id WHERE topic_id='.strval((integer)$topic_id).' AND post_text NOT LIKE \''.db_encode_like(substr(do_lang('SPACER_POST','','','',get_site_default_lang()),0,20).'%').'\' ORDER BY '.$order,$max,$start);
- $count=$this->connection->query_value_null_ok_full('SELECT COUNT(*) FROM '.$this->connection->get_table_prefix().'posts p LEFT JOIN '.$this->connection->get_table_prefix().'posts_text d ON p.post_id=d.post_id WHERE topic_id='.strval((integer)$topic_id).' AND post_text NOT LIKE \''.db_encode_like(substr(do_lang('SPACER_POST','','','',get_site_default_lang()),0,20).'%').'\'');
- $out=array();
- foreach ($rows as $myrow)
- {
- $temp=array();
- $temp['title']=$myrow['post_subject'];
- if (is_null($temp['title'])) $temp['title']='';
- global $LAX_COMCODE;
- $temp2=$LAX_COMCODE;
- $LAX_COMCODE=true;
- $temp['message']=($myrow['bbcode_uid']!='')?comcode_to_tempcode($myrow['post_text'],$myrow['poster_id']):$myrow['post_text'];
- $LAX_COMCODE=$temp2;
- $temp['user']=$myrow['poster_id'];
- $temp['date']=$myrow['post_time'];
- $out[]=$temp;
- }
- return $out;
- }
- /**
- * Get a URL to the specified topic ID. Most forums don't require the second parameter, but some do, so it is required in the interface.
- *
- * @param integer The topic ID
- * @param string The forum ID
- * @return URLPATH The URL to the topic
- */
- function topic_url($id,$forum)
- {
- unset($forum);
- return get_forum_base_url().'/viewtopic.php?t='.strval($id);
- }
- /**
- * Get a URL to the specified post id.
- *
- * @param integer The post id
- * @param string The forum ID
- * @return URLPATH The URL to the post
- */
- function post_url($id,$forum)
- {
- unset($forum);
- $topic_id=$this->connection->query_value_null_ok('posts','tid',array('pid'=>$id));
- if (is_null($topic_id)) return '?';
- $url=get_forum_base_url().'/viewtopic.php?t='.strval($topic_id).'#'.strval($id);
- return $url;
- }
- /**
- * Get the topic ID from a topic identifier in the specified forum. It is used by comment topics, which means that the unique-topic-name assumption holds valid.
- *
- * @param string The forum name / ID
- * @param SHORT_TEXT The topic identifier
- * @return integer The topic ID
- */
- function find_topic_id_for_topic_identifier($forum,$topic_identifier)
- {
- if (is_integer($forum)) $forum_id=$forum;
- else $forum_id=$this->forum_id_from_name($forum);
- return $this->connection->query_value_null_ok_full('SELECT topic_id FROM '.$this->connection->get_table_prefix().'topics WHERE forum_id='.strval((integer)$forum_id).' AND ('.db_string_equal_to('topic_title',$topic_identifier).' OR topic_title LIKE \'%: #'.db_encode_like($topic_identifier).'\')');
- }
- /**
- * Get an array of topics in the given forum. Each topic is an array with the following attributes:
- * - id, the topic ID
- * - title, the topic title
- * - lastusername, the username of the last poster
- * - lasttime, the timestamp of the last reply
- * - closed, a Boolean for whether the topic is currently closed or not
- * - firsttitle, the title of the first post
- * - firstpost, the first post (only set if $show_first_posts was true)
- *
- * @param mixed The forum name or an array of forum IDs
- * @param integer The limit
- * @param integer The start position
- * @param integer The total rows (not a parameter: returns by reference)
- * @param SHORT_TEXT The topic title filter
- * @param boolean Whether to show the first posts
- * @param string The date key to sort by
- * @set lasttime firsttime
- * @param boolean Whether to limit to hot topics
- * @param SHORT_TEXT The topic description filter
- * @return ?array The array of topics (NULL: error)
- */
- function show_forum_topics($name,$limit,$start,&$max_rows,$filter_topic_title='',$show_first_posts=false,$date_key='lasttime',$hot=false,$filter_topic_description='')
- {
- if (is_integer($name)) $id_list='forum_id='.strval((integer)$name);
- elseif (!is_array($name))
- {
- $id=$this->forum_id_from_name($name);
- if (is_null($id)) return NULL;
- $id_list='forum_id='.strval((integer)$id);
- } else
- {
- $id_list='';
- foreach (array_keys($name) as $id)
- {
- if ($id_list!='') $id_list.=' OR ';
- $id_list.='forum_id='.strval((integer)$id);
- }
- if ($id_list=='') return NULL;
- }
- $topic_filter=($filter_topic_title!='')?'AND topic_title LIKE \''.db_encode_like($filter_topic_title).'\'':'';
- $topic_filter.=' ORDER BY '.(($date_key=='lasttime')?'topic_last_post_id':'topic_time').' DESC';
- $rows=$this->connection->query('SELECT * FROM '.$this->connection->get_table_prefix().'topics WHERE ('.$id_list.') '.$topic_filter,$limit,$start);
- $max_rows=$this->connection->query_value_null_ok_full('SELECT COUNT(*) FROM '.$this->connection->get_table_prefix().'topics WHERE ('.$id_list.') '.$topic_filter);
- $i=0;
- $firsttime=array();
- $username=array();
- $memberid=array();
- $datetimes=array();
- $rs=array();
- while (array_key_exists($i,$rows))
- {
- $r=$rows[$i];
- $id=$r['topic_id'];
- $firsttime[$id]=$r['topic_time'];
- $post_rows=$this->connection->query('SELECT * FROM '.$this->connection->get_table_prefix().'posts p LEFT JOIN '.$this->connection->get_table_prefix().'posts_text t ON p.post_id=t.post_id WHERE topic_id='.strval((integer)$id).' AND post_text NOT LIKE \''.db_encode_like(substr(do_lang('SPACER_POST','','','',get_site_default_lang()),0,20).'%').'\' ORDER BY post_time DESC',1);
- if (!array_key_exists(0,$post_rows))
- {
- $i++;
- continue;
- }
- $r2=$post_rows[0];
- $username[$id]=$this->get_username($r2['poster_id']);
- $memberid[$id]=$r2['poster_id'];
- $datetimes[$id]=$r2['post_time'];
- $rs[$id]=$r;
- $i++;
- }
- if ($i>0)
- {
- arsort($datetimes);
- $i=0;
- $out=array();
- if (count($datetimes)>0)
- {
- foreach ($datetimes as $id=>$datetime)
- {
- $r=$rs[$id];
- $out[$i]=array();
- $out[$i]['id']=$id;
- $out[$i]['num']=$r['topic_replies']+1;
- $out[$i]['title']=$r['topic_title'];
- $out[$i]['description']=$r['topic_title'];
- $out[$i]['firsttime']=$r['topic_time'];
- $out[$i]['firstusername']=$this->get_username($r['topic_poster']);
- $out[$i]['lastusername']=$username[$id];
- $out[$i]['firstmemberid']=$r['topic_poster'];
- $out[$i]['lastmemberid']=$memberid[$id];
- $out[$i]['lasttime']=$datetime;
- $out[$i]['closed']=($r['topic_status']==1);
- $fp_rows=$this->connection->query('SELECT post_subject,post_text,bbcode_uid,poster_id FROM '.$this->connection->get_table_prefix().'posts p LEFT JOIN '.$this->connection->get_table_prefix().'posts_text t ON p.post_id=t.post_id WHERE post_text NOT LIKE \''.db_encode_like(substr(do_lang('SPACER_POST','','','',get_site_default_lang()),0,20).'%').'\' AND post_time='.strval((integer)$firsttime[$id]).' AND topic_id='.strval((integer)$id),1);
- if (!array_key_exists(0,$fp_rows))
- {
- unset($out[$i]);
- continue;
- }
- $out[$i]['firsttitle']=$fp_rows[0]['post_subject'];
- if ($show_first_posts)
- {
- global $LAX_COMCODE;
- $temp=$LAX_COMCODE;
- $LAX_COMCODE=true;
- $out[$i]['firstpost']=($fp_rows[0]['bbcode_uid']!='')?comcode_to_tempcode($fp_rows[0]['post_text'],$fp_rows[0]['poster_id']):$fp_rows[0]['post_text'];
- $LAX_COMCODE=$temp;
- }
- $i++;
- if ($i==$limit) break;
- }
- }
- return $out;
- }
- return NULL;
- }
- /**
- * Get an array of members who are in at least one of the given array of usergroups.
- *
- * @param array The array of usergroups
- * @param ?integer Return up to this many entries for primary members and this many entries for secondary members (NULL: no limit, only use no limit if querying very restricted usergroups!)
- * @param integer Return primary members after this offset and secondary members after this offset
- * @return ?array The array of members (NULL: no members)
- */
- function member_group_query($groups,$max=NULL,$start=0)
- {
- $_groups='';
- foreach ($groups as $group)
- {
- if ($_groups!='') $_groups.=' OR ';
- $_groups.='g.group_id='.strval((integer)$group);
- }
- if ($_groups=='') return array();
- return $this->connection->query('SELECT * FROM '.$this->connection->get_table_prefix().'user_group g LEFT JOIN '.$this->connection->get_table_prefix().'users u ON u.user_id=g.user_id WHERE '.$_groups.' AND user_pending=0 ORDER BY g.group_id ASC',$max,$start);
- }
- /**
- * This is the opposite of the get_next_member function.
- *
- * @param MEMBER The member id to decrement
- * @return ?MEMBER The previous member id (NULL: no previous member)
- */
- function get_previous_member($member)
- {
- $tempid=$this->connection->query_value_null_ok_full('SELECT user_id FROM '.$this->connection->get_table_prefix().'users WHERE user_id<'.strval((integer)$member).' AND user_id>0 ORDER BY user_id DESC');
- return $tempid;
- }
- /**
- * Get the member id of the next member after the given one, or NULL.
- * It cannot be assumed there are no gaps in member ids, as members may be deleted.
- *
- * @param MEMBER The member id to increment
- * @return ?MEMBER The next member id (NULL: no next member)
- */
- function get_next_member($member)
- {
- $tempid=$this->connection->query_value_null_ok_full('SELECT user_id FROM '.$this->connection->get_table_prefix().'users WHERE user_id>'.strval((integer)$member).' ORDER BY user_id');
- return $tempid;
- }
- /**
- * Try to find a member with the given IP address
- *
- * @param IP The IP address
- * @return array The distinct rows found
- */
- function probe_ip($ip)
- {
- $_ip=$this->_phpbb_ip($ip);
- return $this->connection->query_select('posts',array('DISTINCT poster_id AS id'),array('poster_ip'=>$_ip));
- }
- /**
- * Get the name relating to the specified member id.
- * If this returns NULL, then the member has been deleted. Always take potential NULL output into account.
- *
- * @param MEMBER The member id
- * @return ?SHORT_TEXT The member name (NULL: member deleted)
- */
- function _get_username($member)
- {
- if ($member==$this->get_guest_id()) return do_lang('GUEST');
- return $this->get_member_row_field($member,'username');
- }
- /**
- * Get the e-mail address for the specified member id.
- *
- * @param MEMBER The member id
- * @return SHORT_TEXT The e-mail address
- */
- function _get_member_email_address($member)
- {
- return $this->get_member_row_field($member,'user_email');
- }
- /**
- * Find if this member may have e-mails sent to them
- *
- * @param MEMBER The member id
- * @return boolean Whether the member may have e-mails sent to them
- */
- function get_member_email_allowed($member)
- {
- $v=$this->get_member_row_field($member,'user_viewemail');
- if ($v==1) return true;
- return false;
- }
- /**
- * Get the timestamp of a member's join date.
- *
- * @param MEMBER The member id
- * @return TIME The timestamp
- */
- function get_member_join_timestamp($member)
- {
- return $this->get_member_row_field($member,'user_regdate');
- }
- /**
- * Find all members with a name matching the given SQL LIKE string.
- *
- * @param string The pattern
- * @param ?integer Maximum number to return (limits to the most recent active) (NULL: no limit)
- * @return ?array The array of matched members (NULL: none found)
- */
- function get_matching_members($pattern,$limit=NULL)
- {
- $rows=$this->connection->query('SELECT * FROM '.$this->connection->get_table_prefix().'users WHERE username LIKE \''.db_encode_like($pattern).'\' AND user_id<>'.strval($this->get_guest_id()).' ORDER BY user_lastvisit DESC',$limit);
- global $M_SORT_KEY;
- $M_SORT_KEY='username';
- uasort($rows,'multi_sort');
- return $rows;
- }
- /**
- * Get the given member's post count.
- *
- * @param MEMBER The member id
- * @return integer The post count
- */
- function get_post_count($member)
- {
- return $this->get_member_row_field($member,'user_posts');
- }
- /**
- * Get the given member's topic count.
- *
- * @param MEMBER The member id
- * @return integer The topic count
- */
- function get_topic_count($member)
- {
- return $this->connection->query_value('topics','COUNT(*)',array('topic_poster'=>$member));
- }
- /**
- * Find out if the given member id is banned.
- *
- * @param MEMBER The member id
- * @return boolean Whether the member is banned
- */
- function is_banned($member)
- {
- $banned=$this->connection->query_value_null_ok('banlist','ban_userid',array('ban_userid'=>$member));
- if (!is_null($banned)) return true;
- return false;
- }
- /**
- * Find the base URL to the emoticons.
- *
- * @return URLPATH The base URL
- */
- function get_emo_dir()
- {
- return get_forum_base_url().'/images/smiles/';
- }
- /**
- * Get a map between smiley codes and templates representing the HTML-image-code for this smiley. The smilies present of course depend on the forum involved.
- *
- * @return array The map
- */
- function find_emoticons()
- {
- global $EMOTICON_CACHE;
- if (!is_null($EMOTICON_CACHE)) return $EMOTICON_CACHE;
- $rows=$this->connection->query_select('smilies',array('*'));
- $EMOTICON_CACHE=array();
- foreach ($rows as $myrow)
- {
- $src=$myrow['smile_url'];
- if (url_is_local($src)) $src=$this->get_emo_dir().$src;
- $EMOTICON_CACHE[$myrow['code']]=array('EMOTICON_IMG_CODE_DIR',$src,$myrow['code']);
- }
- uksort($EMOTICON_CACHE,'strlen_sort');
- $EMOTICON_CACHE=array_reverse($EMOTICON_CACHE);
- return $EMOTICON_CACHE;
- }
- /**
- * Find a list of all forum skins (aka themes).
- *
- * @return array The list of skins
- */
- function get_skin_list()
- {
- $table='themes';
- $codename='style_name';
- $rows=$this->connection->query_select($table,array($codename));
- return collapse_1d_complexity($codename,$rows);
- }
- /**
- * Try to find the theme that the logged-in/guest member is using, and map it to an ocPortal theme.
- * The themes/map.ini file functions to provide this mapping between forum themes, and ocPortal themes, and has a slightly different meaning for different forum drivers. For example, some drivers map the forum themes theme directory to the ocPortal theme name, whilst others made the humanly readeable name.
- *
- * @param boolean Whether to avoid member-specific lookup
- * @return ID_TEXT The theme
- */
- function _get_theme($skip_member_specific=false)
- {
- $def='';
- // Load in remapper
- $map=file_exists(get_file_base().'/themes/map.ini')?better_parse_ini_file(get_file_base().'/themes/map.ini'):array();
- // Work out
- if (!$skip_member_specific)
- {
- $member=get_member();
- if ($member>0)
- $skin=$this->get_member_row_field($member,'user_style'); else $skin=0;
- if ($skin>0) // User has a custom theme
- {
- $phpbb=$this->connection->query_value_null_ok('themes','style_name',array('themes_id'=>$skin));
- if (!is_null($phpbb))
- $def=array_key_exists($phpbb,$map)?$map[$phpbb]:$phpbb;
- }
- }
- // Look for a skin according to our site name (we bother with this instead of 'default' because ocPortal itself likes to never choose a theme when forum-theme integration is on: all forum [via map] or all ocPortal seems cleaner, although it is complex)
- if ((!(strlen($def)>0)) || (!file_exists(get_custom_file_base().'/themes/'.$def)))
- {
- $phpbb=$this->connection->query_value_null_ok('themes','style_name',array('style_name'=>get_site_name()));
- if (!is_null($phpbb)) $def=array_key_exists($phpbb,$map)?$map[$phpbb]:$phpbb;
- }
- // Default then!
- if ((!(strlen($def)>0)) || (!file_exists(get_custom_file_base().'/themes/'.$def)))
- $def=array_key_exists('default',$map)?$map['default']:'default';
- return $def;
- }
- /**
- * Find if the specified member id is marked as staff or not.
- *
- * @param MEMBER The member id
- * @return boolean Whether the member is staff
- */
- function _is_staff($member)
- {
- $user_level=$this->get_member_row_field($member,'user_level');
- if ($user_level==1) return true;
- return false;
- }
- /**
- * Find if the specified member id is marked as a super admin or not.
- *
- * @param MEMBER The member id
- * @return boolean Whether the member is a super admin
- */
- function _is_super_admin($member)
- {
- $user_level=$this->get_member_row_field($member,'user_level');
- if ($user_level==1) return true;
- return false;
- }
- /**
- * If we can't get a list of admins via a usergroup query, we have to disable the staff filter - else the staff filtering can cause disaster at the point of being turned on (because it can't automatically sync).
- *
- * @return boolean Whether to disable the staff filter
- */
- function _disable_staff_filter()
- {
- return true;
- }
- /**
- * Get the number of members currently online on the forums.
- *
- * @return integer The number of members
- */
- function get_num_users_forums()
- {
- return $this->connection->query_value_null_ok_full('SELECT COUNT(*) FROM '.$this->connection->get_table_prefix().'sessions WHERE session_time>'.strval(time()-60*intval(get_option('users_online_time'))));
- }
- /**
- * Get the number of members registered on the forum.
- *
- * @return integer The number of members
- */
- function get_members()
- {
- return $this->connection->query_value('users','COUNT(*)')-1;
- }
- /**
- * Get the total topics ever made on the forum.
- *
- * @return integer The number of topics
- */
- function get_topics()
- {
- return $this->connection->query_value('topics','COUNT(*)');
- }
- /**
- * Get the total posts ever made on the forum.
- *
- * @return integer The number of posts
- */
- function get_num_forum_posts()
- {
- return $this->connection->query_value('posts','COUNT(*)');
- }
- /**
- * Get the number of new forum posts.
- *
- * @return integer The number of posts
- */
- function _get_num_new_forum_posts()
- {
- return $this->connection->query_value_null_ok_full('SELECT COUNT(*) FROM '.$this->connection->get_table_prefix().'posts WHERE post_time>'.strval(time()-60*60*24));
- }
- /**
- * Get a member id from the given member's username.
- *
- * @param SHORT_TEXT The member name
- * @return MEMBER The member id
- */
- function get_member_from_username($name)
- {
- return $this->connection->query_value_null_ok('users','user_id',array('username'=>$name));
- }
- /**
- * Get the ids of the admin usergroups.
- *
- * @return array The admin usergroup ids
- */
- function _get_super_admin_groups()
- {
- $admin_group=$this->connection->query_value_null_ok('groups','group_id',array('group_name'=>'Administrators'),'ORDER BY group_single_user DESC');
- if (is_null($admin_group)) return array();
- return array($admin_group);
- }
- /**
- * Get the ids of the moderator usergroups.
- * It should not be assumed that a member only has one usergroup - this depends upon the forum the driver works for. It also does not take the staff site filter into account.
- *
- * @return array The moderator usergroup ids
- */
- function _get_moderator_groups()
- {
- $moderator_group=$this->connection->query_value_null_ok_full('SELECT group_id FROM '.$this->connection->get_table_prefix().'groups WHERE group_single_user=0 AND (group_name=\'Moderator\' OR group_name=\'Moderators\')');
- if (is_null($moderator_group)) return array();
- return array($moderator_group);
- }
- /**
- * Get the forum usergroup list.
- *
- * @return array The usergroup list
- */
- function _get_usergroup_list()
- {
- $results=$this->connection->query('SELECT group_id,group_name FROM '.$this->connection->get_table_prefix().'groups WHERE group_single_user=0 OR group_id=1');
- $results2=collapse_2d_complexity('group_id','group_name',$results);
- return $results2;
- }
- /**
- * Get the forum usergroup relating to the specified member id.
- *
- * @param MEMBER The member id
- * @return array The array of forum usergroups
- */
- function _get_members_groups($member)
- {
- if ($member==$this->get_guest_id()) return array(1);
- $groups=collapse_1d_complexity('group_id',$this->connection->query_select('user_group',array('group_id'),array('user_pending'=>0,'user_id'=>$member)));
- if (count($groups)<=1)
- {
- $all_groups=$this->get_usergroup_list();
- if (!array_key_exists($groups[0],$all_groups)) $groups[]=1;
- }
- return $groups;
- }
- /**
- * Create a member login cookie.
- *
- * @param MEMBER The member id
- * @param ?SHORT_TEXT The username (NULL: lookup)
- * @param string The password
- */
- function forum_create_cookie($id,$name,$password)
- {
- unset($name);
- unset($password);
- $member_cookie_name=get_member_cookie();
- $colon_pos=strpos($member_cookie_name,':');
- $base=substr($member_cookie_name,0,$colon_pos);
- $real_member_cookie=substr($member_cookie_name,$colon_pos+1);
- $real_pass_cookie=substr(get_pass_cookie(),$colon_pos+1);
- $hash=substr(uniqid(strval(mt_rand(0,32000)),true),0,17);
- $cookie=serialize(array($real_member_cookie=>strval($id),$real_pass_cookie=>$hash));
- $this->connection->query_insert('sessions',array('session_id'=>md5($hash),'session_user_id'=>$id,'session_ip'=>ip2long(get_ip_address()),'session_time'=>time()));
- ocp_setcookie($base,$cookie);
- $_COOKIE[$base]=$cookie;
- }
- /**
- * Find if the given member id and password is valid. If username is NULL, then the member id is used instead.
- * All authorisation, cookies, and form-logins, are passed through this function.
- * Some forums do cookie logins differently, so a Boolean is passed in to indicate whether it is a cookie login.
- *
- * @param ?SHORT_TEXT The member username (NULL: don't use this in the authentication - but look it up using the ID if needed)
- * @param MEMBER The member id
- * @param MD5 The md5-hashed password
- * @param string The raw password
- * @param boolean Whether this is a cookie login
- * @return array A map of 'id' and 'error'. If 'id' is NULL, an error occurred and 'error' is set
- */
- function forum_authorise_login($username,$userid,$password_hashed,$password_raw,$cookie_login=false)
- {
- $out=array();
- $out['id']=NULL;
- if (is_null($userid))
- {
- $rows=$this->connection->query_select('users',array('*'),array('username'=>$username),'',1);
- if (array_key_exists(0,$rows))
- {
- $this->MEMBER_ROWS_CACHED[$rows[0]['user_id']]=$rows[0];
- }
- } else
- {
- $rows[0]=$this->get_member_row($userid);
- }
- if (!array_key_exists(0,$rows)) // All hands to lifeboats
- {
- $out['error']=(do_lang_tempcode('_USER_NO_EXIST',$username));
- return $out;
- }
- $row=$rows[0];
- if ($this->is_banned($row['user_id'])) // All hands to the guns
- {
- $out['error']=(do_lang_tempcode('USER_BANNED'));
- return $out;
- }
- if ($cookie_login)
- {
- $lookup=$this->connection->query_value_null_ok('sessions','session_user_id',array('session_id'=>md5($password_raw)));
- if ($row['user_id']!==$lookup)
- {
- $out['error']=(do_lang_tempcode('USER_BAD_PASSWORD'));
- return $out;
- }
- } else
- {
- if ($row['user_password']!=$password_hashed)
- {
- $out['error']=(do_lang_tempcode('USER_BAD_PASSWORD'));
- return $out;
- }
- }
- $pos=strpos(get_member_cookie(),'_data:userid');
- ocp_eatcookie(substr(get_member_cookie(),0,$pos).'_sid');
- $out['id']=$row['user_id'];
- return $out;
- }
- /**
- * Get a first known IP address of the given member.
- *
- * @param MEMBER The member id
- * @return IP The IP address
- */
- function get_member_ip($member)
- {
- $ip=$this->connection->query_value_null_ok('posts','poster_ip',array('poster_id'=>$member));
- if (!is_null($ip)) return $this->_un_phpbb_ip($ip);
- return '';
- }
- /**
- * Gets a whole member row from the database.
- *
- * @param MEMBER The member id
- * @return ?array The member row (NULL: no such member)
- */
- function get_member_row($member)
- {
- if (array_key_exists($member,$this->MEMBER_ROWS_CACHED)) return $this->MEMBER_ROWS_CACHED[$member];
- $rows=$this->connection->query_select('users',array('*'),array('user_id'=>$member),'',1);
- if (!array_key_exists(0,$rows)) return NULL;
- $this->MEMBER_ROWS_CACHED[$member]=$rows[0];
- return $this->MEMBER_ROWS_CACHED[$member];
- }
- /**
- * Gets a named field of a member row from the database.
- *
- * @param MEMBER The member id
- * @param string The field identifier
- * @return mixed The field
- */
- function get_member_row_field($member,$field)
- {
- $row=$this->get_member_row($member);
- return is_null($row)?NULL:$row[$field];
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement