3420 lines
125 KiB
PHP
3420 lines
125 KiB
PHP
<?php
|
|
/***************************************************************
|
|
* Mobiquo-Functions.php *
|
|
* Copyright 2009 Quoord Systems Ltd. All Rights Reserved. *
|
|
* Created by Dragooon (http://smf-media.com) *
|
|
****************************************************************
|
|
* This file or any content of the file should not be *
|
|
* redistributed in any form of matter. This file is a part of *
|
|
* Tapatalk package and should not be used and distributed *
|
|
* in any form not approved by Quoord Systems Ltd. *
|
|
* http://tapatalk.com | http://taptatalk.com/license.html *
|
|
****************************************************************
|
|
* Contains functions for various methods on mobiquo *
|
|
***************************************************************/
|
|
|
|
// @TODO - Fix up unread_count in get_forum
|
|
// @TODO - Fix up shortened_message in get_topic - currently it strips of all the tags, we need to keep img and url
|
|
|
|
if (!defined('SMF'))
|
|
die('Hacking Attempt...');
|
|
|
|
loadLanguage('Errors');
|
|
|
|
// Returns the configuration for the forum
|
|
function method_get_config()
|
|
{
|
|
global $modSettings, $mobiquo_config, $context;
|
|
|
|
// Return the forum configuration
|
|
$response = '
|
|
<params>
|
|
<param>
|
|
<value>
|
|
<struct>
|
|
<member>
|
|
<name>is_open</name>
|
|
<value><boolean>' . (!empty($context['in_maintenance']) || empty($mobiquo_config['is_open']) ? 0 : 1) . '</boolean></value>
|
|
</member>
|
|
<member>
|
|
<name>guest_okay</name>
|
|
<value><boolean>' . (empty($modSettings['allow_guestAccess']) || empty($mobiquo_config['guest_okay']) ? 0 : 1). '</boolean></value>
|
|
</member>
|
|
<member>
|
|
<name>forum_name</name>
|
|
<value><base64>' . base64_encode($context['forum_name']) . '</base64></value>
|
|
</member>
|
|
<member>
|
|
<name>charset</name>
|
|
<value><string>' . $context['character_set'] . '</string></value>
|
|
</member>';
|
|
foreach($mobiquo_config as $key => $value) {
|
|
if (in_array($key, array('is_open', 'guest_okay'))) continue;
|
|
$response .= '
|
|
<member>
|
|
<name>'.$key.'</name>
|
|
<value><string>'. $value .'</string></value>
|
|
</member>';
|
|
}
|
|
|
|
$response .= '
|
|
</struct>
|
|
</value>
|
|
</param>
|
|
</params>';
|
|
|
|
outputRPCResponse($response);
|
|
}
|
|
|
|
// Returns the complete board structure
|
|
function method_get_forum()
|
|
{
|
|
global $mobdb, $mobsettings, $modSettings, $user_info, $scripturl, $ID_MEMBER;
|
|
|
|
// Fetch all the boards
|
|
$cats = array();
|
|
$mobdb->query('
|
|
SELECT b.ID_BOARD AS id_board, b.name, b.description, IFNULL(mem.memberName, m.posterName) AS posterName, ' . ($mobsettings['is_smf2'] ? 'IFNULL(b.redirect, 0) AS redirect, ' : '') . 'b.ID_PARENT AS id_parent,
|
|
c.ID_CAT AS id_cat, c.name AS cat_name'. ($user_info['is_guest'] ? ", 1 AS isRead, 0 AS new_from" : ", (IFNULL(lb.ID_MSG, 0) >= b.ID_MSG_UPDATED) AS isRead, IFNULL(ln.sent, -1) AS is_notify") . '
|
|
FROM {db_prefix}categories AS c
|
|
LEFT JOIN {db_prefix}boards AS b ON (b.ID_CAT = c.ID_CAT)
|
|
LEFT JOIN {db_prefix}messages AS m ON (m.ID_MSG = b.ID_LAST_MSG)
|
|
LEFT JOIN {db_prefix}members AS mem ON (mem.ID_MEMBER = m.ID_MEMBER)' . (!$user_info['is_guest'] ? "
|
|
LEFT JOIN {db_prefix}log_boards AS lb ON (lb.ID_BOARD = b.ID_BOARD AND lb.ID_MEMBER = $ID_MEMBER)
|
|
LEFT JOIN {db_prefix}log_notify AS ln ON (ln.ID_BOARD = b.ID_BOARD AND ln.ID_MEMBER = $ID_MEMBER)" : '') . '
|
|
WHERE {query_see_board}
|
|
ORDER BY c.catOrder, b.childLevel, b.boardOrder',
|
|
array()
|
|
);
|
|
|
|
while ($row = $mobdb->fetch_assoc())
|
|
{
|
|
if (!isset($cats[$row['id_cat']]))
|
|
{
|
|
$cats[$row['id_cat']] = array(
|
|
'id' => 'c' . $row['id_cat'],
|
|
'parent' => -1,
|
|
'name' => html_entity_decode($row['cat_name']),
|
|
'description' => '',
|
|
'sub_only' => 1,
|
|
'unread_count' => 0,
|
|
'children' => array(),
|
|
'new' => false,
|
|
'is_notify' => false,
|
|
'can_notify' => false,
|
|
'icon' => get_board_icon('c'.$row['id_cat']),
|
|
);
|
|
}
|
|
|
|
// If this board has new posts in it (and isn't the recycle bin!) then the category is new.
|
|
if (empty($modSettings['recycle_enable']) || $modSettings['recycle_board'] != $row['ID_BOARD'])
|
|
$cats[$row['id_cat']]['new'] |= empty($row['isRead']) && $row['posterName'] != '';
|
|
|
|
$cats[$row['id_cat']]['children'][$row['id_board']] = array(
|
|
'id' => $row['id_board'],
|
|
'parent' => empty($row['id_parent']) ? 'c' . $row['id_cat'] : $row['id_parent'],
|
|
'act_parent' => $row['id_parent'],
|
|
'name' => html_entity_decode($row['name']),
|
|
'description' => $row['description'],
|
|
'redirect' => isset($row['redirect']) ? $row['redirect'] : '',
|
|
'unread_count' => 0,
|
|
'children' => array(),
|
|
'new' => empty($row['isRead']) && $row['posterName'] != '',
|
|
'is_notify' => isset($row['is_notify']) && $row['is_notify'] != -1,
|
|
'can_notify' => allowedTo('mark_notify', $row['id_board']) && !$user_info['is_guest'],
|
|
'icon' => get_board_icon($row['id_board']),
|
|
);
|
|
}
|
|
$mobdb->free_result();
|
|
|
|
// Load up the tree
|
|
foreach ($cats as $id_cat => $cat_data)
|
|
foreach ($cat_data['children'] as $id_board => $board_data)
|
|
if (!empty($board_data['act_parent']))
|
|
$cats[$id_cat]['children'][$board_data['act_parent']]['children'][$id_board] = &$cats[$id_cat]['children'][$id_board];
|
|
|
|
// Only add the base item to this array
|
|
foreach ($cats as $id_cat => $cat_data)
|
|
foreach ($cat_data['children'] as $id_board => $board_data)
|
|
if (!empty($board_data['act_parent']))
|
|
unset($cats[$id_cat]['children'][$id_board]);
|
|
|
|
// Output the board tree
|
|
outputRPCBoardTree($cats);
|
|
}
|
|
|
|
function method_get_topic()
|
|
{
|
|
global $mobdb, $mobsettings, $modSettings, $context, $scripturl, $user_info, $board;
|
|
|
|
// Load the parameters
|
|
|
|
// Our first parameter - forum_id(Or as we say, id_board)
|
|
$id_board = $context['mob_request']['params'][0][0];
|
|
if (empty($id_board))
|
|
createErrorResponse(4);
|
|
|
|
$board = $id_board;
|
|
loadBoard();
|
|
loadPermissions();
|
|
|
|
// Do we have start num defined?
|
|
if (isset($context['mob_request']['params'][1]))
|
|
$start_num = (int) $context['mob_request']['params'][1][0];
|
|
|
|
// Do we have last number defined?
|
|
if (isset($context['mob_request']['params'][2]))
|
|
$last_num = (int) $context['mob_request']['params'][2][0];
|
|
|
|
$sticky = false;
|
|
// Are we requesting sticky topics only?
|
|
if (isset($context['mob_request']['params'][3]) && strtolower($context['mob_request']['params'][3][0]) == 'top')
|
|
$sticky = true;
|
|
|
|
// Can you access this board?
|
|
$mobdb->query('
|
|
SELECT b.ID_BOARD AS id_board, b.name AS board_name
|
|
FROM {db_prefix}boards AS b
|
|
WHERE {query_see_board}
|
|
AND b.ID_BOARD = {string:board}',
|
|
array(
|
|
'board' => $id_board,
|
|
)
|
|
);
|
|
if ($mobdb->num_rows() == 0)
|
|
createErrorResponse(4);
|
|
$board_info = $mobdb->fetch_assoc();
|
|
$mobdb->free_result();
|
|
|
|
$board_info['can_post_new'] = allowedTo('post_new');
|
|
|
|
// Perform some start/last num checks
|
|
if (isset($start_num) && isset($last_num))
|
|
if ($start_num > $last_num)
|
|
createErrorResponse(3);
|
|
elseif ($last_num - $start_num > 50)
|
|
$last_num = $start_num + 50;
|
|
|
|
// Default number of topics per page
|
|
$topics_per_page = 20;
|
|
|
|
// Generate the limit clause
|
|
$limit = '';
|
|
if (!isset($start_num) && !isset($last_num))
|
|
$limit = $topics_per_page;
|
|
elseif (isset($start_num) && !isset($last_num))
|
|
$limit = $start_num . ', ' . $topics_per_page;
|
|
elseif (isset($start_num) && isset($last_num))
|
|
$limit = $start_num . ', ' . (($last_num - $start_num) + 1);
|
|
elseif (empty($start_num) && empty($last_num))
|
|
$limit = 1;
|
|
|
|
// Perform the query to fetch the topics
|
|
$mobdb->query('
|
|
SELECT t.ID_TOPIC AS id_topic, t.isSticky AS is_sticky, t.locked, fm.subject AS topic_title, t.numViews AS views, t.numReplies AS replies,
|
|
IFNULL(mem.ID_MEMBER, 0) AS id_member, mem.realName, mem.memberName, mem.avatar, IFNULL(a.ID_ATTACH, 0) AS id_attach, a.filename, a.attachmentType AS attachment_type,
|
|
IFNULL(lm.posterTime, fm.posterTime) AS last_message_time, ' . ($user_info['is_guest'] ? '0' : 'IFNULL(lt.ID_MSG, IFNULL(lmr.ID_MSG, -1)) + 1') . ' AS new_from,
|
|
fm.body, lm.ID_MSG_MODIFIED AS id_msg_modified
|
|
FROM {db_prefix}topics AS t
|
|
INNER JOIN {db_prefix}messages AS fm ON (t.ID_FIRST_MSG = fm.ID_MSG)
|
|
LEFT JOIN {db_prefix}messages AS lm ON (t.ID_LAST_MSG = lm.ID_MSG)
|
|
LEFT JOIN {db_prefix}members AS mem ON (t.ID_MEMBER_STARTED = mem.ID_MEMBER)' . ($user_info['is_guest'] ? '' : '
|
|
LEFT JOIN {db_prefix}log_topics AS lt ON (lt.ID_TOPIC = t.ID_TOPIC AND lt.ID_MEMBER = {int:current_member})
|
|
LEFT JOIN {db_prefix}log_mark_read AS lmr ON (lmr.ID_BOARD = {int:board} AND lmr.ID_MEMBER = {int:current_member})') . '
|
|
LEFT JOIN {db_prefix}attachments AS a ON (a.ID_MEMBER = mem.ID_MEMBER)
|
|
WHERE t.ID_BOARD = {int:board}
|
|
AND t.isSticky = ' . ($sticky ? 1 : 0) . ($mobsettings['is_smf2'] ? '
|
|
AND t.approved = 1' : '') . '
|
|
ORDER BY IFNULL(lm.posterTime, fm.posterTime) DESC
|
|
LIMIT ' . $limit,
|
|
array(
|
|
'current_member' => $user_info['id'],
|
|
'board' => $id_board,
|
|
)
|
|
);
|
|
$topics = array();
|
|
$tids = array();
|
|
while ($row = $mobdb->fetch_assoc())
|
|
{
|
|
// Get a shortened version of this topic's first message
|
|
//$shortened_message = shorten_subject($row['body'], 200);
|
|
$shortened_message = $row['body'];
|
|
// Replace all bug [img] tags to nowhere(Does that even make sense?)!
|
|
//$shortened_message = preg_replace('/&#?[a-z0-9]{2,8};/i','', strip_tags(parse_bbc($shortened_message)));
|
|
$shortened_message = processShortContent($shortened_message);
|
|
// Add stuff to the array
|
|
$topics[$row['id_topic']] = array(
|
|
'id' => $row['id_topic'],
|
|
'title' => processSubject($row['topic_title']),
|
|
'replies' => $row['replies'],
|
|
'views' => $row['views'],
|
|
'poster' => array(
|
|
'id' => $row['id_member'],
|
|
'name' => $row['realName'],
|
|
'username' => $row['memberName'],
|
|
'avatar' => str_replace(' ', '%20', $row['avatar'] == '' ? ($row['id_attach'] > 0 ? (empty($row['attachment_type']) ? $scripturl . '?action=dlattach;attach=' . $row['id_attach'] . ';type=avatar' : $modSettings['custom_avatar_url'] . '/' . $row['filename']) : '') : (stristr($row['avatar'], 'http://') ? $row['avatar'] : $modSettings['avatar_url'] . '/' . $row['avatar'])),
|
|
),
|
|
'last_msg_time' => mobiquo_time($row['last_message_time']),
|
|
'is_new' => $user_info['is_guest'] ? 0 : $row['new_from'] <= $row['id_msg_modified'],
|
|
'short_msg' => $shortened_message,
|
|
'board' => $id_board,
|
|
'is_marked_notify' => false,
|
|
'is_locked' => !empty($row['locked']),
|
|
);
|
|
$tids[] = $row['id_topic'];
|
|
}
|
|
$mobdb->free_result();
|
|
|
|
if (!empty($tids))
|
|
{
|
|
// Check for notifications on this topic OR board.
|
|
$mobdb->query("
|
|
SELECT sent, ID_TOPIC
|
|
FROM {db_prefix}log_notify
|
|
WHERE (ID_TOPIC IN ({array_int:topic_ids}) OR ID_BOARD = {int:board})
|
|
AND ID_MEMBER = {int:member}",
|
|
array(
|
|
'topic_ids' => $tids,
|
|
'board' => $id_board,
|
|
'member' => $user_info['id']
|
|
)
|
|
);
|
|
|
|
while ($row = $mobdb->fetch_assoc())
|
|
{
|
|
// Find if this topic is marked for notification...
|
|
if (!empty($row['ID_TOPIC']))
|
|
$topics[$row['ID_TOPIC']]['is_marked_notify'] = true;
|
|
}
|
|
$mobdb->free_result();
|
|
}
|
|
|
|
// Get unread sticky topics num
|
|
$board_info['unread_sticky_count'] = 0;
|
|
if (!$user_info['is_guest'])
|
|
{
|
|
$mobdb->query('
|
|
SELECT IFNULL(lt.ID_MSG, IFNULL(lmr.ID_MSG, -1)) + 1 AS new_from, lm.ID_MSG_MODIFIED AS id_msg_modified
|
|
FROM {db_prefix}topics AS t
|
|
LEFT JOIN {db_prefix}messages AS lm ON (t.ID_LAST_MSG = lm.ID_MSG)
|
|
LEFT JOIN {db_prefix}log_topics AS lt ON (lt.ID_TOPIC = t.ID_TOPIC AND lt.ID_MEMBER = {int:current_member})
|
|
LEFT JOIN {db_prefix}log_mark_read AS lmr ON (lmr.ID_BOARD = {int:board} AND lmr.ID_MEMBER = {int:current_member})
|
|
WHERE t.ID_BOARD = {int:board}
|
|
AND t.isSticky = 1',
|
|
array(
|
|
'current_member' => $user_info['id'],
|
|
'board' => $id_board,
|
|
)
|
|
);
|
|
|
|
while ($row = $mobdb->fetch_assoc())
|
|
{
|
|
if ($row['new_from'] <= $row['id_msg_modified'])
|
|
$board_info['unread_sticky_count']++;
|
|
}
|
|
$mobdb->free_result();
|
|
}
|
|
|
|
// Get the total
|
|
$mobdb->query('
|
|
SELECT COUNT(*)
|
|
FROM {db_prefix}topics AS t
|
|
WHERE t.ID_BOARD = {int:board}
|
|
AND t.isSticky = ' . ($sticky ? 1 : 0) . ($mobsettings['is_smf2'] ? '
|
|
AND t.approved = 1' : ''),
|
|
array(
|
|
'board' => $id_board,
|
|
)
|
|
);
|
|
list($board_info['total_topic_num']) = $mobdb->fetch_row();
|
|
$mobdb->free_result();
|
|
|
|
// Return the output
|
|
outputRPCTopics($topics, $board_info);
|
|
}
|
|
|
|
// Logs in an user
|
|
function method_authorize_user()
|
|
{
|
|
global $context, $mobdb, $mobsettings, $modSettings, $scripturl, $user_info, $sourcedir, $txt;
|
|
|
|
loadLanguage('Login');
|
|
|
|
// Call this file for authentication
|
|
require_once($sourcedir . '/Subs-Auth.php');
|
|
|
|
// We are performing a nobel function, let the user log in!
|
|
$username = base64_decode($context['mob_request']['params'][0][0]);
|
|
$password = $context['mob_request']['params'][1][0];
|
|
|
|
if (empty($username))
|
|
outputRPCResult(false, $txt[37]);
|
|
|
|
if (empty($password))
|
|
outputRPCResult(false, $txt[38]);
|
|
|
|
// Load the data up! (This is a shameless copy from LogInOut.php)
|
|
$mobdb->query('
|
|
SELECT passwd, ID_MEMBER AS id_member, ID_GROUP AS id_group, emailAddress AS email_address, additionalGroups AS additional_groups, memberName AS member_name,
|
|
passwordSalt AS password_salt
|
|
FROM {db_prefix}members
|
|
WHERE memberName = {string:user_name}
|
|
AND is_activated = 1
|
|
LIMIT 1',
|
|
array(
|
|
'user_name' => $username,
|
|
)
|
|
);
|
|
// Probably mistyped or their email, try it as an email address. (member_name first, though!)
|
|
if ($mobdb->num_rows() == 0)
|
|
{
|
|
$mobdb->free_result();
|
|
|
|
$mobdb->query('
|
|
SELECT passwd, ID_MEMBER AS id_member, ID_GROUP AS id_group, emailAddress AS email_address, additionalGroups AS additional_groups, memberName AS member_name,
|
|
passwordSalt AS password_salt
|
|
FROM {db_prefix}members
|
|
WHERE emailAddress = {string:user_name}
|
|
AND is_activated = 1
|
|
LIMIT 1',
|
|
array(
|
|
'user_name' => $username,
|
|
)
|
|
);
|
|
// Let them try again, it didn't match anything...
|
|
if ($mobdb->num_rows() == 0)
|
|
outputRPCAuthorizeResult(false);
|
|
}
|
|
|
|
$user = $mobdb->fetch_assoc();
|
|
$mobdb->free_result();
|
|
|
|
file_put_contents('/tmp/mobile-auth', var_export($user, true));
|
|
// Hash the password
|
|
$sha_passwd = md5_hmac($password, strtolower($user['member_name']));
|
|
file_put_contents('/tmp/mobile-auth-hash', $sha_passwd);
|
|
|
|
// Are we having an incorrect password?
|
|
if ($user['passwd'] != $sha_passwd)
|
|
outputRPCAuthorizeResult(false);
|
|
|
|
$user_info['id'] = $user['id_member'];
|
|
|
|
// Set the login cookie
|
|
setLoginCookie(60 * $modSettings['cookieTime'], $user['id_member'], sha1($user['passwd'] . $user['password_salt']));
|
|
|
|
$user_info['is_guest'] = false;
|
|
$user_info['is_admin'] = $user['id_group'] == 1 || in_array(1, explode(',', $user['additional_groups']));
|
|
|
|
// Banned?
|
|
is_not_banned(true);
|
|
|
|
// Delete any old session
|
|
$mobdb->query('
|
|
DELETE FROM {db_prefix}log_online
|
|
WHERE session = {string:session}',
|
|
array(
|
|
'session' => 'ip' . $user_info['ip'],
|
|
)
|
|
);
|
|
|
|
// Update last logged in time
|
|
if ($mobsettings['is_smf2'])
|
|
updateMemberData($user_info['id'], array('last_login' => time(), 'member_ip' => $user_info['ip'], 'member_ip2' => $_SERVER['BAN_CHECK_IP']));
|
|
else
|
|
updateMemberData($user_info['id'], array('lastLogin' => time(), 'memberIP' => '\'' . $user_info['ip'] . '\'', 'memberIP2' => '\'' . $_SERVER['BAN_CHECK_IP'] . '\''));
|
|
|
|
// We got this far? return a positive response....
|
|
outputRPCAuthorizeResult(true);
|
|
}
|
|
|
|
function method_login()
|
|
{
|
|
global $context, $mobdb, $mobsettings, $modSettings, $scripturl, $user_info, $sourcedir, $txt;
|
|
|
|
loadLanguage('Login');
|
|
|
|
// Call this file for authentication
|
|
require_once($sourcedir . '/Subs-Auth.php');
|
|
|
|
// We are performing a nobel function, let the user log in!
|
|
$username = base64_decode($context['mob_request']['params'][0][0]);
|
|
$password = base64_decode($context['mob_request']['params'][1][0]);
|
|
|
|
if (empty($username))
|
|
outputRPCResult(false, $txt[37]);
|
|
|
|
if (empty($password))
|
|
outputRPCResult(false, $txt[38]);
|
|
|
|
// Load the data up! (This is a shameless copy from LogInOut.php)
|
|
$mobdb->query('
|
|
SELECT passwd, ID_MEMBER AS id_member, ID_GROUP AS id_group, emailAddress AS email_address, additionalGroups AS additional_groups, memberName AS member_name,
|
|
passwordSalt AS password_salt
|
|
FROM {db_prefix}members
|
|
WHERE memberName = {string:user_name}
|
|
AND is_activated = 1
|
|
LIMIT 1',
|
|
array(
|
|
'user_name' => $username,
|
|
)
|
|
);
|
|
|
|
// Probably mistyped or their email, try it as an email address. (member_name first, though!)
|
|
if ($mobdb->num_rows() == 0)
|
|
{
|
|
$mobdb->free_result();
|
|
|
|
$mobdb->query('
|
|
SELECT passwd, ID_MEMBER AS id_member, ID_GROUP AS id_group, emailAddress AS email_address, additionalGroups AS additional_groups, memberName AS member_name,
|
|
passwordSalt AS password_salt
|
|
FROM {db_prefix}members
|
|
WHERE emailAddress = {string:user_name}
|
|
AND is_activated = 1
|
|
LIMIT 1',
|
|
array(
|
|
'user_name' => $username,
|
|
)
|
|
);
|
|
// Let them try again, it didn't match anything...
|
|
if ($mobdb->num_rows() == 0)
|
|
outputRPCResult(false);
|
|
}
|
|
|
|
$user = $mobdb->fetch_assoc();
|
|
$mobdb->free_result();
|
|
|
|
// Hash the password
|
|
$sha_passwd = sha1(strtolower($user['member_name']) . $password);
|
|
|
|
// Are we having an incorrect password?
|
|
if ($user['passwd'] != $sha_passwd)
|
|
outputRPCResult(false);
|
|
|
|
$user_info['id'] = $user['id_member'];
|
|
|
|
// Set the login cookie
|
|
setLoginCookie(60 * $modSettings['cookieTime'], $user['id_member'], sha1($user['passwd'] . $user['password_salt']));
|
|
|
|
$user_info['is_guest'] = false;
|
|
$user_info['is_admin'] = $user['id_group'] == 1 || in_array(1, explode(',', $user['additional_groups']));
|
|
$user_info['id'] = $user['id_member'];
|
|
$user_info['groups'][] = $user['id_group'];
|
|
|
|
// Banned?
|
|
is_not_banned(true);
|
|
|
|
// Delete any old session
|
|
$mobdb->query('
|
|
DELETE FROM {db_prefix}log_online
|
|
WHERE session = {string:session}',
|
|
array(
|
|
'session' => 'ip' . $user_info['ip'],
|
|
)
|
|
);
|
|
|
|
// Update last logged in time
|
|
if ($mobsettings['is_smf2'])
|
|
updateMemberData($user_info['id'], array('last_login' => time(), 'member_ip' => $user_info['ip'], 'member_ip2' => $_SERVER['BAN_CHECK_IP']));
|
|
else
|
|
updateMemberData($user_info['id'], array('lastLogin' => time(), 'memberIP' => '\'' . $user_info['ip'] . '\'', 'memberIP2' => '\'' . $_SERVER['BAN_CHECK_IP'] . '\''));
|
|
|
|
loadPermissions();
|
|
|
|
$pm_read = !$user_info['is_guest'] && allowedTo('pm_read');
|
|
$pm_send = !$user_info['is_guest'] && allowedTo('pm_send');
|
|
|
|
// We got this far? return a positive response....
|
|
outputRPCLogin(true, '', $pm_read, $pm_send, $user);
|
|
}
|
|
|
|
// Logs an user out
|
|
function method_logout_user()
|
|
{
|
|
global $context, $mobdb, $mobsettings, $modSettings, $user_info, $sourcedir, $ID_MEMBER, $user_settings;
|
|
|
|
require_once($sourcedir . '/Subs-Auth.php');
|
|
|
|
if (isset($_SESSION['pack_ftp']))
|
|
$_SESSION['pack_ftp'] = null;
|
|
|
|
// Just ensure they aren't a guest!
|
|
if (!$user_info['is_guest'])
|
|
{
|
|
if (isset($modSettings['integrate_logout']) && function_exists($modSettings['integrate_logout']))
|
|
call_user_func($modSettings['integrate_logout'], $user_settings['memberName']);
|
|
|
|
// If you log out, you aren't online anymore :P.
|
|
$mobdb->query("
|
|
DELETE FROM {db_prefix}log_online
|
|
WHERE ID_MEMBER = {int:current_member}
|
|
LIMIT 1",
|
|
array(
|
|
'current_member' => $ID_MEMBER,
|
|
)
|
|
);
|
|
}
|
|
|
|
$_SESSION['log_time'] = 0;
|
|
|
|
// Empty the cookie! (set it in the past, and for ID_MEMBER = 0)
|
|
setLoginCookie(-3600, 0);
|
|
|
|
}
|
|
|
|
// Gets newest topics from the forum
|
|
function method_get_new_topic()
|
|
{
|
|
global $context, $mobdb, $mobsettings, $modSettings, $user_info, $sourcedir;
|
|
|
|
// Figure out the parameters
|
|
if (isset($context['mob_request']['params'][0]))
|
|
$start_num = (int) $context['mob_request']['params'][0][0];
|
|
if (isset($context['mob_request']['params'][1]))
|
|
$last_num = (int) $context['mob_request']['params'][1][0];
|
|
|
|
// Some start_num/last_num checks
|
|
if (isset($start_num) && isset($last_num))
|
|
if ($start_num > $last_num)
|
|
createErrorResponse(3);
|
|
elseif ($last_num - $start_num > 50)
|
|
$last_num = $start_num + 50;
|
|
|
|
// Generate the limit clause
|
|
$topics_per_page = 20;
|
|
if (!isset($start_num) && !isset($last_num))
|
|
$limit = $topics_per_page;
|
|
elseif (isset($start_num) && !isset($last_num))
|
|
$limit = $start_num . ', ' . $topics_per_page;
|
|
elseif (isset($start_num) && isset($last_num))
|
|
$limit = $start_num . ', ' . (($last_num - $start_num) + 1);
|
|
|
|
// Grab the topics
|
|
$mobdb->query('
|
|
SELECT t.ID_TOPIC AS id_topic, t.isSticky AS is_sticky, t.locked, fm.subject AS topic_title, t.numViews AS views, t.numReplies AS replies,
|
|
IFNULL(mem.ID_MEMBER, 0) AS id_member, mem.realName, mem.memberName, mem.avatar, IFNULL(a.ID_ATTACH, 0) AS id_attach, a.filename, a.attachmentType AS attachment_type,
|
|
IFNULL(lm.posterTime, fm.posterTime) AS last_message_time, ' . ($user_info['is_guest'] ? '0' : 'ln.ID_TOPIC AS is_notify, IFNULL(lt.ID_MSG, IFNULL(lmr.ID_MSG, -1)) + 1') . ' AS new_from,
|
|
IFNULL(lm.body, fm.body) AS body, lm.ID_MSG_MODIFIED AS id_msg_modified, b.name AS board_name, b.ID_BOARD AS id_board
|
|
FROM {db_prefix}topics AS t
|
|
INNER JOIN {db_prefix}messages AS fm ON (t.ID_FIRST_MSG = fm.ID_MSG)
|
|
INNER JOIN {db_prefix}boards AS b ON (b.ID_BOARD = t.ID_BOARD)
|
|
LEFT JOIN {db_prefix}messages AS lm ON (t.ID_LAST_MSG = lm.ID_MSG)
|
|
LEFT JOIN {db_prefix}members AS mem ON (lm.ID_MEMBER = mem.ID_MEMBER)' . ($user_info['is_guest'] ? '' : '
|
|
LEFT JOIN {db_prefix}log_topics AS lt ON (lt.ID_TOPIC = t.ID_TOPIC AND lt.ID_MEMBER = {int:current_member})
|
|
LEFT JOIN {db_prefix}log_notify AS ln ON ((ln.ID_TOPIC = t.ID_TOPIC OR ln.ID_BOARD = t.ID_BOARD) AND ln.ID_MEMBER = {int:current_member})
|
|
LEFT JOIN {db_prefix}log_mark_read AS lmr ON (lmr.ID_BOARD = t.ID_BOARD AND lmr.ID_MEMBER = {int:current_member})') . '
|
|
LEFT JOIN {db_prefix}attachments AS a ON (a.ID_MEMBER = mem.ID_MEMBER)
|
|
WHERE {query_see_board}' . ($mobsettings['is_smf2'] ? '
|
|
AND t.approved = 1' : '') . '
|
|
ORDER BY lm.posterTime DESC
|
|
LIMIT ' . $limit,
|
|
array(
|
|
'current_member' => $user_info['id'],
|
|
)
|
|
);
|
|
$topics = array();
|
|
while ($row = $mobdb->fetch_assoc())
|
|
{
|
|
// Add stuff to the array
|
|
$topics[$row['id_topic']] = array(
|
|
'id' => $row['id_topic'],
|
|
'title' => processSubject($row['topic_title']),
|
|
'short_msg' => processShortContent($row['body']),
|
|
'replies' => $row['replies'],
|
|
'views' => $row['views'],
|
|
'poster' => array(
|
|
'id' => $row['id_member'],
|
|
'username' => $row['memberName'],
|
|
'post_name' => $row['realName'],
|
|
'avatar' => str_replace(' ', '%20', $row['avatar'] == '' ? ($row['id_attach'] > 0 ? (empty($row['attachment_type']) ? $scripturl . '?action=dlattach;attach=' . $row['id_attach'] . ';type=avatar' : $modSettings['custom_avatar_url'] . '/' . $row['filename']) : '') : (stristr($row['avatar'], 'http://') ? $row['avatar'] : $modSettings['avatar_url'] . '/' . $row['avatar'])),
|
|
),
|
|
'is_new' => $user_info['is_guest'] ? 0 : $row['new_from'] <= $row['id_msg_modified'],
|
|
'board' => $row['id_board'],
|
|
'board_name' => $row['board_name'],
|
|
'post_time' => mobiquo_time($row['last_message_time']),
|
|
'is_marked_notify' => !empty($row['is_notify']),
|
|
'is_locked' => !empty($row['locked']),
|
|
);
|
|
}
|
|
$mobdb->free_result();
|
|
|
|
// Return the output...
|
|
outputRPCNewTopics($topics);
|
|
}
|
|
|
|
function method_get_thread_by_unread()
|
|
{
|
|
method_get_thread('unread');
|
|
}
|
|
|
|
function method_get_thread_by_post()
|
|
{
|
|
method_get_thread('post');
|
|
}
|
|
|
|
// Get the posts from a topic
|
|
function method_get_thread($type)
|
|
{
|
|
global $mobdb, $mobsettings, $context, $scripturl, $modSettings, $user_info, $user_profile, $topic, $board;
|
|
|
|
if (!isset($context['mob_request']['params'][0]))
|
|
createErrorResponse(7);
|
|
|
|
if ($type == 'post') {
|
|
$msg = $id_msg = (int) $context['mob_request']['params'][0][0];
|
|
|
|
$mobdb->query('
|
|
SELECT t.ID_TOPIC as topic_id, t.ID_BOARD AS board_id, t.numReplies, t.locked, ms.subject, t.ID_MEMBER_STARTED, b.name AS board_name, t.ID_LAST_MSG, t.ID_FIRST_MSG
|
|
FROM ({db_prefix}topics AS t, {db_prefix}messages AS ms)
|
|
INNER JOIN {db_prefix}boards AS b ON (b.ID_BOARD = t.ID_BOARD)
|
|
WHERE {query_see_board}
|
|
AND ms.ID_MSG = {int:msg}
|
|
AND t.ID_TOPIC = ms.ID_TOPIC' . ($mobsettings['is_smf2'] ? '
|
|
AND t.approved = 1' : ''),
|
|
array(
|
|
'msg' => $id_msg,
|
|
)
|
|
);
|
|
} else {
|
|
$id_topic = (int) $context['mob_request']['params'][0][0];
|
|
|
|
$mobdb->query('
|
|
SELECT t.ID_TOPIC as topic_id, t.ID_BOARD AS board_id, t.numReplies, t.locked, ms.subject, t.ID_MEMBER_STARTED, b.name AS board_name, t.ID_LAST_MSG, t.ID_FIRST_MSG
|
|
FROM ({db_prefix}topics AS t, {db_prefix}messages AS ms)
|
|
INNER JOIN {db_prefix}boards AS b ON (b.ID_BOARD = t.ID_BOARD)
|
|
WHERE {query_see_board}
|
|
AND ms.ID_MSG = t.ID_FIRST_MSG
|
|
AND t.ID_TOPIC = {int:topic}' . ($mobsettings['is_smf2'] ? '
|
|
AND t.approved = 1' : ''),
|
|
array(
|
|
'topic' => $id_topic,
|
|
)
|
|
);
|
|
}
|
|
if ($mobdb->num_rows() == 0)
|
|
createErrorResponse(1);
|
|
$topicinfo = $mobdb->fetch_assoc();
|
|
$context = array_merge($context, $topicinfo);
|
|
$topic = $id_topic = $topicinfo['topic_id'];
|
|
$board = $id_board = $topicinfo['board_id'];
|
|
$mobdb->free_result();
|
|
|
|
loadBoard();
|
|
loadPermissions();
|
|
|
|
if ($type == 'unread')
|
|
{
|
|
$posts_per_page = (int) $context['mob_request']['params'][1][0];
|
|
$posts_per_page || $posts_per_page = 20;
|
|
$GLOBALS['return_html'] = isset($context['mob_request']['params'][2][0]) ? $context['mob_request']['params'][2][0] : false;
|
|
|
|
if ($user_info['is_guest']) {
|
|
$context['start_from'] = 0;
|
|
} else {
|
|
$mobdb->query('
|
|
SELECT IFNULL(lt.ID_MSG, IFNULL(lmr.ID_MSG, -1)) + 1 AS new_from
|
|
FROM {db_prefix}topics AS t
|
|
LEFT JOIN {db_prefix}log_topics AS lt ON (lt.ID_TOPIC = t.ID_TOPIC AND lt.ID_MEMBER = {int:member})
|
|
LEFT JOIN {db_prefix}log_mark_read AS lmr ON (lmr.ID_BOARD = {int:board} AND lmr.ID_MEMBER = {int:member})
|
|
WHERE t.ID_TOPIC = {int:topic}
|
|
LIMIT 1',
|
|
array(
|
|
'topic' => $id_topic,
|
|
'board' => $id_board,
|
|
'member' => $user_info['id'],
|
|
)
|
|
);
|
|
list($virtual_msg) = $mobdb->fetch_row();
|
|
$mobdb->free_result();
|
|
|
|
if ($virtual_msg >= $topicinfo['ID_LAST_MSG'])
|
|
$context['start_from'] = $topicinfo['numReplies'];
|
|
elseif ($virtual_msg <= $topicinfo['ID_FIRST_MSG'])
|
|
$context['start_from'] = 0;
|
|
else
|
|
{
|
|
// Find the start value for that message......
|
|
$mobdb->query('
|
|
SELECT COUNT(*)
|
|
FROM {db_prefix}messages
|
|
WHERE ID_MSG < {int:msg}
|
|
AND ID_TOPIC = {int:topic}',
|
|
array(
|
|
'topic' => $id_topic,
|
|
'msg' => $virtual_msg,
|
|
)
|
|
);
|
|
list ($context['start_from']) = $mobdb->fetch_row();
|
|
$mobdb->free_result();
|
|
}
|
|
}
|
|
|
|
if (!empty($options['view_newest_first'])) {
|
|
$context['start_from'] = $topicinfo['numReplies'] - $context['start_from'] + 1;
|
|
}
|
|
|
|
if ($context['start_from'] >= $topicinfo['numReplies'] + 1)
|
|
$context['new_position'] = $topicinfo['numReplies'] + 1;
|
|
else
|
|
$context['new_position'] = $context['start_from'] + 1;
|
|
|
|
$start = $context['start_from'] - ($context['start_from'] % $posts_per_page);
|
|
$limit = $start . ', ' . $posts_per_page;
|
|
} elseif ($type == 'post') {
|
|
$posts_per_page = (int) $context['mob_request']['params'][1][0];
|
|
$posts_per_page || $posts_per_page = 20;
|
|
$GLOBALS['return_html'] = isset($context['mob_request']['params'][2][0]) ? $context['mob_request']['params'][2][0] : false;
|
|
|
|
if ($msg >= $topicinfo['ID_LAST_MSG'])
|
|
$context['start_from'] = $topicinfo['numReplies'];
|
|
elseif ($msg <= $topicinfo['ID_FIRST_MSG'])
|
|
$context['start_from'] = 0;
|
|
else
|
|
{
|
|
// Find the start value for that message......
|
|
$mobdb->query('
|
|
SELECT COUNT(*)
|
|
FROM {db_prefix}messages
|
|
WHERE ID_MSG < {int:msg}
|
|
AND ID_TOPIC = {int:topic}',
|
|
array(
|
|
'topic' => $id_topic,
|
|
'msg' => $msg,
|
|
)
|
|
);
|
|
list ($context['start_from']) = $mobdb->fetch_row();
|
|
$mobdb->free_result();
|
|
}
|
|
|
|
if (!empty($options['view_newest_first'])) {
|
|
$context['start_from'] = $topicinfo['numReplies'] - $context['start_from'] + 1;
|
|
}
|
|
|
|
if ($context['start_from'] >= $topicinfo['numReplies'] + 1)
|
|
$context['new_position'] = $topicinfo['numReplies'] + 1;
|
|
else
|
|
$context['new_position'] = $context['start_from'] + 1;
|
|
|
|
$start = $context['start_from'] - ($context['start_from'] % $posts_per_page);
|
|
$limit = $start . ', ' . $posts_per_page;
|
|
} else {
|
|
$GLOBALS['return_html'] = isset($context['mob_request']['params'][3][0]) ? $context['mob_request']['params'][3][0] : false;
|
|
|
|
if (isset($context['mob_request']['params'][1]))
|
|
$start_num = (int) $context['mob_request']['params'][1][0];
|
|
if (isset($context['mob_request']['params'][2]))
|
|
$last_num = (int) $context['mob_request']['params'][2][0];
|
|
|
|
$posts_per_page = 20;
|
|
if (!isset($start_num) && !isset($last_num))
|
|
$limit = $posts_per_page;
|
|
elseif (isset($start_num) && !isset($last_num))
|
|
$limit = $start_num . ', ' . $posts_per_page;
|
|
elseif (isset($start_num) && isset($last_num))
|
|
$limit = $start_num . ', ' . (($last_num - $start_num) + 1);
|
|
|
|
$context['new_position'] = $start_num ? $start_num + 1 : 1;
|
|
}
|
|
|
|
// Default this topic to not marked for notifications... of course...
|
|
$context['is_marked_notify'] = false;
|
|
|
|
// Did this user start the topic or not?
|
|
$context['user']['started'] = $user_info['id'] == $topicinfo['ID_MEMBER_STARTED'] && !$user_info['is_guest'];
|
|
|
|
$context['can_mark_notify'] = allowedTo('mark_any_notify') && !$user_info['is_guest'];
|
|
$context['can_reply'] = allowedTo('post_reply_any') || ($context['user']['started'] && allowedTo($perm . '_own'));
|
|
$context['can_reply'] &= empty($topicinfo['locked']) || allowedTo('moderate_board');
|
|
|
|
// Up the views!
|
|
if (empty($_SESSION['last_read_topic']) || $_SESSION['last_read_topic'] != $id_topic)
|
|
$mobdb->query('
|
|
UPDATE {db_prefix}topics
|
|
SET numViews = numViews + 1
|
|
WHERE ID_TOPIC = {int:topic}',
|
|
array(
|
|
'topic' => $id_topic,
|
|
)
|
|
);
|
|
|
|
// If this user is not a guest, mark this topic as read
|
|
if (!$user_info['is_guest'])
|
|
{
|
|
$mobdb->query('
|
|
REPLACE INTO {db_prefix}log_topics
|
|
(id_member, id_topic, id_msg)
|
|
VALUES
|
|
({int:member}, {int:topic}, {int:msg})',
|
|
array(
|
|
'member' => $user_info['id'],
|
|
'topic' => $id_topic,
|
|
'msg' => $modSettings['maxMsgID'],
|
|
)
|
|
);
|
|
|
|
// Check for notifications on this topic OR board.
|
|
$mobdb->query("
|
|
SELECT sent, ID_TOPIC
|
|
FROM {db_prefix}log_notify
|
|
WHERE (ID_TOPIC = {int:topic} OR ID_BOARD = {int:board})
|
|
AND ID_MEMBER = {int:member}
|
|
LIMIT 2",
|
|
array(
|
|
'topic' => $id_topic,
|
|
'board' => $id_board,
|
|
'member' => $user_info['id']
|
|
)
|
|
);
|
|
|
|
while ($row = $mobdb->fetch_assoc())
|
|
{
|
|
// Find if this topic is marked for notification...
|
|
if (!empty($row['ID_TOPIC']))
|
|
$context['is_marked_notify'] = true;
|
|
}
|
|
}
|
|
|
|
// Set the last read topic
|
|
$_SESSION['last_read_topic'] = $id_topic;
|
|
|
|
// Get each post and poster in this topic.
|
|
$mobdb->query("
|
|
SELECT ID_MSG, ID_MEMBER
|
|
FROM {db_prefix}messages
|
|
WHERE ID_TOPIC = {int:topic}
|
|
LIMIT $limit",
|
|
array(
|
|
'topic' => $id_topic,
|
|
)
|
|
);
|
|
|
|
$messages = array();
|
|
$posters = array();
|
|
while ($row = $mobdb->fetch_assoc())
|
|
{
|
|
if (!empty($row['ID_MEMBER']))
|
|
$posters[] = $row['ID_MEMBER'];
|
|
$messages[] = $row['ID_MSG'];
|
|
}
|
|
$posters = array_unique($posters);
|
|
if (!empty($posters))
|
|
loadMemberData($posters);
|
|
|
|
// Get the messages
|
|
$mobdb->query('
|
|
SELECT m.ID_MSG AS id_msg, m.body, m.subject, m.smileysEnabled, mem.realName, mem.memberName, mem.ID_MEMBER AS id_member, mem.avatar,
|
|
IFNULL(a.ID_ATTACH, 0) AS id_attach, a.filename, a.attachmentType AS attachment_type,
|
|
m.posterTime AS poster_time, IFNULL(thumb.id_attach, 0) AS id_thumb,
|
|
t.locked, t.ID_MEMBER_STARTED as id_member_started
|
|
FROM {db_prefix}messages AS m
|
|
LEFT JOIN {db_prefix}members AS mem ON (mem.ID_MEMBER = m.ID_MEMBER)
|
|
LEFT JOIN {db_prefix}attachments AS a ON (a.ID_MEMBER = mem.ID_MEMBER)
|
|
LEFT JOIN {db_prefix}attachments AS thumb ON (thumb.id_attach = a.id_thumb)
|
|
LEFT JOIN {db_prefix}topics AS t ON (t.ID_TOPIC = m.ID_TOPIC)
|
|
WHERE m.ID_TOPIC = {int:topic}' . ($mobsettings['is_smf2'] ? '
|
|
AND m.approved = 1' : '') . '
|
|
ORDER BY m.posterTime ASC
|
|
LIMIT ' . $limit,
|
|
array(
|
|
'topic' => $id_topic,
|
|
)
|
|
);
|
|
$posts = array();
|
|
$matches = array();
|
|
$board_permission = allowedTo('modify_own', $id_board);
|
|
|
|
while ($row = $mobdb->fetch_assoc())
|
|
{
|
|
$is_started = ($user_info['id'] == $row['id_member_started'] && !$user_info['is_guest']);
|
|
if ($mobsettings['is_smf2']) {
|
|
$can_edit = (!$row['locked'] || allowedTo('moderate_board', $id_board)) && (allowedTo('modify_any', $id_board) || (allowedTo('modify_replies', $id_board) && $is_started) || (allowedTo('modify_own', $id_board) && $row['id_member'] == $user_info['id'] && (empty($modSettings['edit_disable_time']) || !$row['approved'] || $row['poster_time'] + $modSettings['edit_disable_time'] * 60 > time())));
|
|
} else {
|
|
$can_edit = (!$row['locked'] || allowedTo('moderate_board', $id_board)) && (allowedTo('modify_any', $id_board) || (allowedTo('modify_replies', $id_board) && $is_started) || (allowedTo('modify_own', $id_board) && $row['id_member'] == $user_info['id'] && (empty($modSettings['edit_disable_time']) || $row['poster_time'] + $modSettings['edit_disable_time'] * 60 > time())));
|
|
}
|
|
$posts[$row['id_msg']] = array(
|
|
'id' => $row['id_msg'],
|
|
'subject' => processSubject(censorText($row['subject'])),
|
|
'body' => processBody(censorText($row['body'])),
|
|
'poster' => array(
|
|
'id' => $row['id_member'],
|
|
'username' => $row['memberName'],
|
|
'name' => $row['realName'],
|
|
'is_online' => (!empty($user_profile[$row['id_member']]['showOnline']) || allowedTo('moderate_forum')) && $user_profile[$row['id_member']]['isOnline'] > 0,
|
|
'avatar' => str_replace(' ', '%20', $row['avatar'] == '' ? ($row['id_attach'] > 0 ? (empty($row['attachment_type']) ? $scripturl . '?action=dlattach;attach=' . $row['id_attach'] . ';type=avatar' : $modSettings['custom_avatar_url'] . '/' . $row['filename']) : '') : (stristr($row['avatar'], 'http://') ? $row['avatar'] : $modSettings['avatar_url'] . '/' . $row['avatar'])),
|
|
),
|
|
'attachment_authority' => allowedTo('view_attachments', $id_board) ? 0 : 4,
|
|
'time' => mobiquo_time($row['poster_time']),
|
|
'attachments' => array(),
|
|
'topic' => $id_topic,
|
|
'allow_smilies' => $row['smileysEnabled'],
|
|
'can_edit' => $can_edit,
|
|
'can_delete' => allowedTo('delete_any', $id_board) || (allowedTo('delete_replies', $id_board) && $is_started) || (allowedTo('delete_own', $id_board) && $row['id_member'] == $user_info['id'] && (empty($modSettings['edit_disable_time']) || $row['poster_time'] + $modSettings['edit_disable_time'] * 60 > time())),
|
|
//'can_edit' => !empty($user_info['id']) && $row['id_member'] == $user_info['id'] && $board_permission,
|
|
);
|
|
}
|
|
$mobdb->free_result();
|
|
|
|
// Figure out the attachments!
|
|
if (allowedTo('view_attachments', $id_board) && !empty($posts))
|
|
{
|
|
$mobdb->query('
|
|
SELECT a.ID_ATTACH AS id_attach, a.ID_MSG AS id_msg, a.width, a.height, a.filename, a.attachmentType AS attachment_type,
|
|
thumb.ID_ATTACH AS id_thumb
|
|
FROM {db_prefix}attachments AS a
|
|
LEFT JOIN {db_prefix}attachments AS thumb ON (thumb.ID_ATTACH = a.ID_THUMB)
|
|
WHERE a.ID_MSG IN ({array_int:messages})
|
|
AND a.attachmentType = 0' . ($mobsettings['is_smf2'] ? '
|
|
AND a.approved = 1' : ''),
|
|
array(
|
|
'messages' => array_keys($posts),
|
|
)
|
|
);
|
|
while ($row = $mobdb->fetch_assoc())
|
|
{
|
|
// How is this even possible?
|
|
if (empty($posts[$row['id_msg']]))
|
|
continue;
|
|
|
|
$posts[$row['id_msg']]['attachments'][$row['id_attach']] = array(
|
|
'id' => $row['id_attach'],
|
|
'is_image' => !empty($row['width']) && !empty($row['height']),
|
|
'href' => $scripturl . '?action=dlattach;topic=' . $id_topic . '.0;attach=' . $row['id_attach'],
|
|
'thumbnail' => !empty($row['id_thumb']) ? $scripturl . '?action=dlattach;topic=' . $id_topic . '.0;attach=' . $row['id_thumb'] : '',
|
|
);
|
|
}
|
|
$mobdb->free_result();
|
|
}
|
|
|
|
$context['posts'] = $posts;
|
|
|
|
outputRPCPosts();
|
|
}
|
|
|
|
// Gets the user's information
|
|
function method_get_user_info()
|
|
{
|
|
global $context, $mobdb, $mobsettings, $modSettings, $scripturl, $func, $smcFunc, $memberContext, $txt;
|
|
|
|
// Invalid username? Non-existant username?
|
|
if (!isset($context['mob_request']['params'][0]))
|
|
createErrorResponse(7);
|
|
$username = base64_decode($context['mob_request']['params'][0][0]);
|
|
|
|
######## Added by Sean##############
|
|
if ($mobsettings['is_smf2']) {
|
|
if (function_exists('get_magic_quotes_gpc') && @get_magic_quotes_gpc() != 0 && empty($modSettings['integrate_magic_quotes'])) {
|
|
$removeMagicQuoteFunction = @ini_get('magic_quotes_sybase') || strtolower(@ini_get('magic_quotes_sybase')) == 'on' ? 'unescapestring__recursive' : 'stripslashes__recursive';
|
|
$username = $removeMagicQuoteFunction($username);
|
|
}
|
|
$username = htmltrim__recursive($username);
|
|
$username = htmlspecialchars__recursive($username);
|
|
} else {
|
|
if (@get_magic_quotes_gpc() == 0 && empty($modSettings['integrate_magic_quotes'])) {
|
|
$username = addslashes__recursive($username);
|
|
}
|
|
$username = htmltrim__recursive($username);
|
|
$username = stripslashes__recursive($username);
|
|
$username = htmlspecialchars__recursive($username);
|
|
$username = addslashes__recursive($username);
|
|
}
|
|
##################################################################
|
|
|
|
// // Load the information
|
|
// $mobdb->query('
|
|
// SELECT mem.ID_MEMBER, mem.memberName AS username, mem.realName AS name, mem.dateRegistered AS date_registered, mem.lastLogin AS last_login, mem.posts, mem.avatar,
|
|
// a.ID_ATTACH AS id_attach, a.filename, a.attachmentType AS attachment_type
|
|
// FROM {db_prefix}members AS mem
|
|
// LEFT JOIN {db_prefix}attachments AS a ON (a.ID_MEMBER = mem.ID_MEMBER)
|
|
// WHERE mem.memberName = {string:name} OR mem.realName = {string:name}
|
|
// LIMIT 1',
|
|
// array(
|
|
// 'name' => $username,
|
|
// )
|
|
// );
|
|
// if ($mobdb->num_rows() == 0)
|
|
// createErrorResponse(7);
|
|
// $user_data = $mobdb->fetch_assoc();
|
|
// $user_data['avatar'] = $user_data['avatar'] == '' ? ($user_data['id_attach'] > 0 ? (empty($user_data['attachment_type']) ? $scripturl . '?action=dlattach;attach=' . $user_data['id_attach'] . ';type=avatar' : $modSettings['custom_avatar_url'] . '/' . $user_data['filename']) : '') : (stristr($user_data['avatar'], 'http://') ? $user_data['avatar'] : $modSettings['avatar_url'] . '/' . $user_data['avatar']);
|
|
// $user_data['date_registered'] = mobiquo_time($user_data['date_registered']);
|
|
// $user_data['last_login'] = mobiquo_time($user_data['last_login']);
|
|
// $user_data['can_send_pm'] = allowedTo('pm_send');
|
|
// $mobdb->free_result();
|
|
|
|
list($member_id) = loadMemberData($username, true);
|
|
if (!loadMemberContext($member_id) || !isset($memberContext[$member_id]))
|
|
fatal_error($txt[453] . ' - ' . $member_id, false);
|
|
|
|
$user_data = $memberContext[$member_id];
|
|
|
|
loadLanguage('Profile');
|
|
if (!empty($modSettings['titlesEnable']) && $user_data['title'] != '')
|
|
$user_data['custom_fields_list'][$txt['title1']] = $user_data['title'];
|
|
|
|
$user_data['custom_fields_list'][$txt[87]] = (!empty($user_data['group']) ? $user_data['group'] : $user_data['post_group']);
|
|
|
|
if (allowedTo('moderate_forum') && $user_data['ip'])
|
|
{
|
|
$user_data['custom_fields_list'][$txt[512]] = $user_data['ip'];
|
|
|
|
if (preg_match('/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/', $user_data['ip']) == 1 && empty($modSettings['disableHostnameLookup']))
|
|
$user_data['custom_fields_list'][$txt['hostname']] = host_from_ip($user_data['ip']);
|
|
}
|
|
|
|
// If karma enabled show the members karma.
|
|
if ($modSettings['karmaMode'] == '1')
|
|
$user_data['custom_fields_list'][$modSettings['karmaLabel']] = ($user_data['karma']['good'] - $user_data['karma']['bad']);
|
|
elseif ($modSettings['karmaMode'] == '2')
|
|
$user_data['custom_fields_list'][$modSettings['karmaLabel']] = '+'.$user_data['karma']['good'].'/-'.$user_data['karma']['bad'];
|
|
|
|
if ($user_data['icq']['name'])
|
|
$user_data['custom_fields_list'][$txt[513]] = $user_data['icq']['name'];
|
|
|
|
if ($user_data['aim']['name'])
|
|
$user_data['custom_fields_list'][$txt[603]] = $user_data['aim']['name'];
|
|
|
|
if ($user_data['msn']['name'])
|
|
$user_data['custom_fields_list'][$txt['MSN']] = $user_data['msn']['name'];
|
|
|
|
if ($user_data['yim']['name'])
|
|
$user_data['custom_fields_list'][$txt[604]] = $user_data['yim']['name'];
|
|
|
|
$user_data['custom_fields_list'][$txt[69]] = ($user_data['email_public'] || !$user_data['hide_email']) ? $user_data['email'] : $txt[722];
|
|
if ($user_data['website']['title'] != '' || $user_data['website']['url'] != '')
|
|
$user_data['custom_fields_list'][$txt[96]] = $user_data['website']['title'] . ($user_data['website']['url'] ? '('.$user_data['website']['url'].')' : '');
|
|
|
|
if ($user_data['gender']['name'])
|
|
$user_data['custom_fields_list'][$txt[231]] = $user_data['gender']['name'];
|
|
|
|
if (!empty($user_data['birth_date']))
|
|
{
|
|
list ($birth_year, $birth_month, $birth_day) = sscanf($user_data['birth_date'], '%d-%d-%d');
|
|
$datearray = getdate(forum_time());
|
|
if ($birth_year > 4)
|
|
{
|
|
$user_data['custom_fields_list'][$txt[420]] = ($datearray['year'] - $birth_year - (($datearray['mon'] > $birth_month || ($datearray['mon'] == $birth_month && $datearray['mday'] >= $birth_day)) ? 0 : 1));
|
|
$user_data['custom_fields_list'][$txt[420]] .= ($datearray['mon'] == $birth_month && $datearray['mday'] == $birth_day) ? ' ('. substr($txt['calendar3'], 0, -1) .')' : '';
|
|
}
|
|
}
|
|
|
|
if ($user_data['location'])
|
|
$user_data['custom_fields_list'][$txt[227]] = $user_data['location'];
|
|
|
|
if ($user_data['local_time'])
|
|
$user_data['custom_fields_list'][$txt['local_time']] = $user_data['local_time'];
|
|
|
|
if (!empty($modSettings['userLanguage']) && $user_data['language'])
|
|
$user_data['custom_fields_list'][$txt['smf225']] = $user_data['language'];
|
|
|
|
if ($user_data['signature'])
|
|
$user_data['custom_fields_list'][$txt[85]] = $user_data['signature'];
|
|
|
|
// Return the output
|
|
outputRPCUserInfo($user_data);
|
|
}
|
|
|
|
// Gets inbox unread statistics
|
|
function method_get_inbox_stat()
|
|
{
|
|
global $user_info;
|
|
|
|
if ($user_info['is_guest'] || !allowedTo('pm_read'))
|
|
createErrorResponse(28);
|
|
|
|
// Best. Function. Ever.
|
|
outputRPCResponse('
|
|
<params>
|
|
<param>
|
|
<value>
|
|
<struct>
|
|
<member>
|
|
<name>inbox_unread_count</name>
|
|
<value><int>' . $user_info['unread_messages'] . '</int></value>
|
|
</member>
|
|
</struct>
|
|
</value>
|
|
</param>
|
|
</params>'
|
|
);
|
|
}
|
|
|
|
// Returns inbox and sent item boxes(OR as we say, folders) statistics
|
|
function method_get_box_info()
|
|
{
|
|
global $user_info, $mobdb, $mobsettings, $modSettings, $txt;
|
|
|
|
if ($user_info['is_guest'] || !allowedTo('pm_read'))
|
|
createErrorResponse(28);
|
|
|
|
loadLanguage('PersonalMessage');
|
|
|
|
// Figure out the box count
|
|
$box_count = allowedTo('pm_send') ? 2 : 1;
|
|
|
|
// Get the message count from inbox
|
|
$mobdb->query('
|
|
SELECT COUNT(*)
|
|
FROM {db_prefix}pm_recipients AS pmr
|
|
WHERE pmr.ID_MEMBER = {int:current_member}
|
|
AND pmr.deleted = 0',
|
|
array(
|
|
'current_member' => $user_info['id'],
|
|
)
|
|
);
|
|
list($inbox_count) = $mobdb->fetch_row();
|
|
$mobdb->free_result();
|
|
|
|
// Get the sent statistics
|
|
if (allowedTo('pm_send'))
|
|
{
|
|
$mobdb->query('
|
|
SELECT COUNT(*)
|
|
FROM {db_prefix}personal_messages AS pm
|
|
WHERE pm.ID_MEMBER_FROM = {int:current_member}
|
|
AND pm.deletedBySender = 0',
|
|
array(
|
|
'current_member' => $user_info['id'],
|
|
)
|
|
);
|
|
list($sent_count) = $mobdb->fetch_row();
|
|
$mobdb->free_result();
|
|
}
|
|
|
|
// Get the boxes up
|
|
$boxes = array(
|
|
'inbox' => array(
|
|
'id' => 'inbox',
|
|
'name' => $txt[316],
|
|
'msg_count' => $inbox_count,
|
|
'unread_count' => $user_info['unread_messages'],
|
|
'box_type' => 'INBOX',
|
|
),
|
|
);
|
|
|
|
if (isset($sent_count))
|
|
$boxes['outbox'] = array(
|
|
'id' => 'outbox',
|
|
'name' => $txt[320],
|
|
'msg_count' => $sent_count,
|
|
'unread_count' => 0,
|
|
'box_type' => 'SENT',
|
|
);
|
|
|
|
// Send the response
|
|
outputRPCBoxInfo($boxes, $box_count);
|
|
}
|
|
|
|
// Gets the specific box
|
|
function method_get_box()
|
|
{
|
|
global $mobdb, $mobsettings, $modSettings, $context, $scripturl, $user_info, $txt, $memberContext;
|
|
|
|
// Load the parameters
|
|
if (!isset($context['mob_request']['params'][0]))
|
|
createErrorResponse(7);
|
|
elseif ($user_info['is_guest'] || !allowedTo('pm_read'))
|
|
outputRPCResult(false, $txt['cannot_pm_read']);
|
|
$id_box = $context['mob_request']['params'][0][0];
|
|
|
|
if (!in_array($id_box, array('inbox', 'outbox')) || ($id_box == 'outbox' && !allowedTo('pm_send')))
|
|
outputRPCResult(false, $txt['cannot_pm_send']);
|
|
|
|
// Star/end
|
|
if (isset($context['mob_request']['params'][1]))
|
|
$start_num = (int) $context['mob_request']['params'][1][0];
|
|
if (isset($context['mob_request']['params'][2]))
|
|
$last_num = (int) $context['mob_request']['params'][2][0];
|
|
|
|
$topics_per_page = 20;
|
|
if (!isset($start_num) && !isset($last_num))
|
|
$limit = $topics_per_page;
|
|
elseif (isset($start_num) && !isset($last_num))
|
|
$limit = $start_num . ', ' . $topics_per_page;
|
|
elseif (isset($start_num) && isset($last_num))
|
|
$limit = $start_num . ', ' . (($last_num - $start_num) + 1);
|
|
|
|
// Load thix box's info
|
|
if ($id_box == 'inbox')
|
|
{
|
|
$mobdb->query('
|
|
SELECT COUNT(*)
|
|
FROM {db_prefix}pm_recipients AS pmr
|
|
WHERE pmr.ID_MEMBER = {int:current_member}
|
|
AND pmr.deleted = 0',
|
|
array(
|
|
'current_member' => $user_info['id'],
|
|
)
|
|
);
|
|
list($count) = $mobdb->fetch_row();
|
|
$mobdb->free_result();
|
|
}
|
|
else
|
|
{
|
|
$mobdb->query('
|
|
SELECT COUNT(*)
|
|
FROM {db_prefix}personal_messages AS pm
|
|
WHERE pm.ID_MEMBER_FROM = {int:current_member}
|
|
AND pm.deletedBySender = 0',
|
|
array(
|
|
'current_member' => $user_info['id'],
|
|
)
|
|
);
|
|
list($count) = $mobdb->fetch_row();
|
|
$mobdb->free_result();
|
|
}
|
|
|
|
$unread_count = $id_box == 'outbox' ? 0 : $user_info['unread_messages'];
|
|
|
|
// Get the ID of messages to load
|
|
$mobdb->query('
|
|
SELECT pm.ID_PM AS id_pm, pm.subject, pm.ID_MEMBER_FROM AS id_member_from, pm.body, pm.msgtime, mem_from.realName AS from_name, mem_from.memberName AS from_username,
|
|
mem_from.avatar as avatar, IFNULL(a.ID_ATTACH, 0) AS id_attach, a.filename as filename, a.attachmentType AS attachment_type
|
|
FROM {db_prefix}personal_messages AS pm ' . ($id_box == 'outbox' ? '' : '
|
|
INNER JOIN {db_prefix}pm_recipients AS pmr ON (pmr.ID_PM = pm.ID_PM
|
|
AND pmr.ID_MEMBER = {int:current_member}
|
|
AND pmr.deleted = 0)') . '
|
|
LEFT JOIN {db_prefix}members AS mem_from ON (mem_from.ID_MEMBER = pm.ID_MEMBER_FROM)
|
|
LEFT JOIN {db_prefix}attachments AS a ON (a.ID_MEMBER = mem_from.ID_MEMBER)
|
|
WHERE ' . ($id_box == 'outbox' ? 'pm.ID_MEMBER_FROM = {int:current_member}
|
|
AND pm.deletedBySender = 0' : '1=1') . '
|
|
ORDER BY pm.ID_PM DESC
|
|
LIMIT ' . $limit,
|
|
array(
|
|
'current_member' => $user_info['id'],
|
|
)
|
|
);
|
|
$pms = array();
|
|
while ($row = $mobdb->fetch_assoc())
|
|
$pms[$row['id_pm']] = array(
|
|
'id' => $row['id_pm'],
|
|
'recipients' => array(),
|
|
'subject' => processSubject($row['subject']),
|
|
'id_member_from' => $row['id_member_from'],
|
|
'from_name' => $row['from_name'],
|
|
'from_username' => $row['from_username'],
|
|
'time' => mobiquo_time($row['msgtime']),
|
|
'body' => processShortContent($row['body']),
|
|
'is_replied' => null,
|
|
'is_unread' => null,
|
|
);
|
|
$mobdb->free_result();
|
|
|
|
// Load the PM recipients
|
|
if (!empty($pms))
|
|
{
|
|
$mobdb->query('
|
|
SELECT pmr.ID_PM AS id_pm, mem_to.ID_MEMBER AS id_member_to, mem_to.realName AS to_name, mem_to.memberName AS to_username, pmr.bcc, pmr.labels, pmr.is_read
|
|
FROM {db_prefix}pm_recipients AS pmr
|
|
LEFT JOIN {db_prefix}members AS mem_to ON (mem_to.ID_MEMBER = pmr.ID_MEMBER)
|
|
WHERE pmr.ID_PM IN ({array_int:pm_list})',
|
|
array(
|
|
'pm_list' => array_keys($pms),
|
|
)
|
|
);
|
|
while ($row = $mobdb->fetch_assoc())
|
|
{
|
|
$pms[$row['id_pm']]['recipients'][] = array('name' => $row['to_name'], 'username' => $row['to_username']);
|
|
|
|
if ($id_box == 'inbox')
|
|
$display_id = $pms[$row['id_pm']]['id_member_from'];
|
|
else
|
|
$display_id = $row['id_member_to'];
|
|
|
|
if (!isset($pms[$row['id_pm']]['icon_url'])) {
|
|
loadMemberData($display_id);
|
|
loadMemberContext($display_id);
|
|
$pms[$row['id_pm']]['is_online'] = $memberContext[$display_id]['online']['is_online'];
|
|
$pms[$row['id_pm']]['icon_url'] = $memberContext[$display_id]['avatar']['href'];
|
|
}
|
|
|
|
if ($row['id_member_to'] == $user_info['id'] && $id_box != 'outbox')
|
|
{
|
|
$pms[$row['id_pm']]['is_replied'] = $row['is_read'] & 2;
|
|
$pms[$row['id_pm']]['is_unread'] = $row['is_read'] == 0;
|
|
}
|
|
}
|
|
$mobdb->free_result();
|
|
}
|
|
|
|
// Outut the PM Box information
|
|
outputRPCBox($pms, $count, $unread_count);
|
|
}
|
|
|
|
// Loads a single PM
|
|
function method_get_message()
|
|
{
|
|
global $context, $mobsettings, $mobdb, $modSettings, $scripturl, $user_info, $sourcedir, $txt, $memberContext;
|
|
|
|
if ($user_info['is_guest'] || !allowedTo('pm_read'))
|
|
createErrorResponse(21);
|
|
|
|
require_once($sourcedir . '/PersonalMessage.php');
|
|
loadLanguage('PersonalMessage');
|
|
|
|
// Get the message ID
|
|
if (!isset($context['mob_request']['params'][0]))
|
|
createErrorResponse(27);
|
|
$id_pm = $context['mob_request']['params'][0][0];
|
|
|
|
$id_box = 'inbox';
|
|
if (isset($context['mob_request']['params'][1]))
|
|
$id_box = $context['mob_request']['params'][1][0];
|
|
$context['folder'] = ($id_box == 'inbox') ? 'inbox' : 'outbox';
|
|
$context['labels'][-1] = array('id' => -1, 'name' => $txt['pm_msg_label_inbox'], 'messages' => 0, 'unread_messages' => 0);
|
|
|
|
$GLOBALS['return_html'] = isset($context['mob_request']['params'][2][0]) ? $context['mob_request']['params'][2][0] : false;
|
|
|
|
// Load this message...
|
|
$mobdb->query('
|
|
SELECT pm.ID_PM AS id_pm, pm.subject, pm.body, pm.ID_MEMBER_FROM AS id_member_from, mem_from.realName AS from_name, mem_from.memberName AS from_username, pm.msgtime
|
|
FROM {db_prefix}personal_messages AS pm
|
|
LEFT JOIN {db_prefix}members AS mem_from ON (mem_from.ID_MEMBER = pm.ID_MEMBER_FROM)
|
|
WHERE pm.ID_PM = {int:pm}',
|
|
array(
|
|
'pm' => $id_pm,
|
|
)
|
|
);
|
|
if ($mobdb->num_rows() == 0)
|
|
createErrorResponse(27);
|
|
$pm = $mobdb->fetch_assoc();
|
|
$mobdb->free_result();
|
|
|
|
// Load the recipients
|
|
$mobdb->query('
|
|
SELEcT pmr.ID_PM AS id_pm, mem_to.ID_MEMBER AS id_member_to, mem_to.realName AS to_name, mem_to.memberName AS to_username, pmr.bcc, pmr.labels, pmr.is_read
|
|
FROM {db_prefix}pm_recipients AS pmr
|
|
LEFT JOIN {db_prefix}members AS mem_to ON (mem_to.ID_MEMBER = pmr.ID_MEMBER)
|
|
WHERE pmr.ID_PM = {int:pm}',
|
|
array(
|
|
'pm' => $id_pm,
|
|
)
|
|
);
|
|
$pm['recipients'] = array();
|
|
$bcc = array();
|
|
while ($row = $mobdb->fetch_assoc())
|
|
{
|
|
if ($id_box == 'inbox' && !empty($row['bcc']) && $row['id_member_to'] == $user_info['id'])
|
|
continue;
|
|
|
|
$pm['recipients'][$row['id_member_to']] = array('name' => $row['to_name'], 'username' => $row['to_username']);
|
|
|
|
if ($row['id_member_to'] == $user_info['id'])
|
|
$pm['is_read'] = $row['is_read'];
|
|
}
|
|
$mobdb->free_result();
|
|
|
|
// Check if this user applies....
|
|
if ($pm['id_member_from'] != $user_info['id'] && !in_array($user_info['id'], array_keys($pm['recipients'])))
|
|
createErrorResponse(27);
|
|
|
|
// Mark this as read, if it is not already
|
|
markMessages(array($id_pm));
|
|
|
|
if ($id_box == 'inbox')
|
|
$display_id = $pm['id_member_from'];
|
|
else {
|
|
$display_ids = array_keys($pm['recipients']);
|
|
$display_id = $display_ids[0];
|
|
}
|
|
|
|
loadMemberData($display_id);
|
|
loadMemberContext($display_id);
|
|
|
|
// Process some extra stuff
|
|
$pm['subject'] = processSubject($pm['subject']);
|
|
$pm['body'] = processBody($pm['body']);
|
|
$pm['time'] = mobiquo_time($pm['msgtime']);
|
|
$pm['is_online'] = $memberContext[$display_id]['online']['is_online'];
|
|
$pm['icon_url'] = $memberContext[$display_id]['avatar']['href'];
|
|
|
|
// Send the response
|
|
outputRPCPM($pm);
|
|
}
|
|
|
|
// Deletes a PM
|
|
function method_delete_message()
|
|
{
|
|
global $mobdb, $mobsettings, $modSettings, $context, $sourcedir, $user_info, $txt;
|
|
|
|
if ($user_info['is_guest'])
|
|
outputRPCResult(false, $txt[1]);
|
|
|
|
if (!allowedTo('pm_read'))
|
|
outputRPCResult(false, $txt['cannot_pm_read']);
|
|
|
|
// Invalid message ID?
|
|
if (!isset($context['mob_request']['params'][0]))
|
|
outputRPCResult(false, $txt['smf272']);
|
|
$id_pm = $context['mob_request']['params'][0][0];
|
|
|
|
// Delete the PM
|
|
require_once($sourcedir . '/PersonalMessage.php');
|
|
deleteMessages(array((int) $id_pm));
|
|
|
|
outputRPCResult(true);
|
|
}
|
|
|
|
// Subscribes to that specific topic...
|
|
function method_subscribe_topic()
|
|
{
|
|
global $mobdb, $context, $user_info, $txt;
|
|
|
|
// Permissions are an important part of anything ;).
|
|
if ($user_info['is_guest'])
|
|
outputRPCResult(false, $txt[1]);
|
|
|
|
if (!isset($context['mob_request']['params'][0]))
|
|
outputRPCResult(false, $txt[472]);
|
|
|
|
$id_topic = (int) $context['mob_request']['params'][0][0];
|
|
|
|
// Can you see this topic?
|
|
$mobdb->query('
|
|
SELECT t.ID_TOPIC AS id_topic, b.ID_BOARD AS id_board
|
|
FROM {db_prefix}topics AS t
|
|
INNER JOIN {db_prefix}boards AS b ON (b.ID_BOARD = t.ID_BOARD)
|
|
WHERE {query_see_board}
|
|
AND t.ID_TOPIC = {int:topic}',
|
|
array(
|
|
'topic' => $id_topic,
|
|
)
|
|
);
|
|
if ($mobdb->num_rows() == 0)
|
|
outputRPCResult(false);
|
|
list($id_topic, $id_board) = $mobdb->fetch_row();
|
|
$mobdb->free_result();
|
|
|
|
if (!allowedTo('mark_any_notify', $id_board))
|
|
outputRPCResult(false);
|
|
|
|
// Mark this for notifications!
|
|
$mobdb->insert('{db_prefix}log_notify',
|
|
array('ID_MEMBER', 'ID_TOPIC'),
|
|
array($user_info['id'], $id_topic),
|
|
true
|
|
);
|
|
|
|
outputRPCResult(true);
|
|
}
|
|
|
|
// Unsubscribe to that specific topic
|
|
function method_unsubscribe_topic()
|
|
{
|
|
global $mobdb, $context, $user_info, $txt;
|
|
|
|
// Permissions are an important part of anything ;).
|
|
if ($user_info['is_guest'])
|
|
outputRPCResult(false, $txt[1]);
|
|
|
|
if (!isset($context['mob_request']['params'][0]))
|
|
outputRPCResult(false, $txt[472]);
|
|
|
|
$id_topic = (int) $context['mob_request']['params'][0][0];
|
|
|
|
// Can you see this topic?
|
|
$mobdb->query('
|
|
SELECT t.ID_TOPIC AS id_topic, b.ID_BOARD AS id_board
|
|
FROM {db_prefix}topics AS t
|
|
INNER JOIN {db_prefix}boards AS b ON (b.ID_BOARD = t.ID_BOARD)
|
|
WHERE {query_see_board}
|
|
AND t.ID_TOPIC = {int:topic}',
|
|
array(
|
|
'topic' => $id_topic,
|
|
)
|
|
);
|
|
if ($mobdb->num_rows() == 0)
|
|
outputRPCResult(false);
|
|
list($id_topic, $id_board) = $mobdb->fetch_row();
|
|
$mobdb->free_result();
|
|
|
|
if(!allowedTo('mark_any_notify', $id_board))
|
|
outputRPCResult(false, $txt['cannot_mark_any_notify']);
|
|
|
|
// Get rid of it...
|
|
$mobdb->query('
|
|
DELETE FROM {db_prefix}log_notify
|
|
WHERE ID_MEMBER = {int:member}
|
|
AND ID_TOPIC = {int:topic}',
|
|
array(
|
|
'member' => $user_info['id'],
|
|
'topic' => $id_topic,
|
|
)
|
|
);
|
|
|
|
outputRPCResult(true);
|
|
}
|
|
|
|
function method_get_quote_post()
|
|
{
|
|
global $mobdb, $mobsettings, $modSettings, $context, $scripturl, $sourcedir, $user_info, $board, $func, $smcFunc, $language, $txt;
|
|
|
|
//SMF 2 or 1.1??
|
|
if (isset($smcFunc)) {
|
|
$FUNC = $smcFunc;
|
|
} else {
|
|
$FUNC = $func;
|
|
}
|
|
|
|
// We need these for creating topics
|
|
require_once($sourcedir . '/Subs-Post.php');
|
|
require_once($sourcedir . '/Post.php');
|
|
|
|
// Guest? No entry
|
|
if ($user_info['is_guest'])
|
|
createErrorResponse(21);
|
|
|
|
// Figure out the parameters
|
|
$id_message = (int) $context['mob_request']['params'][0][0];
|
|
|
|
// Find out the topic
|
|
$mobdb->query('
|
|
SELECT m.ID_TOPIC, m.ID_BOARD
|
|
FROM {db_prefix}messages AS m
|
|
WHERE m.ID_MSG = {int:value}',
|
|
array(
|
|
'value' => $id_message,
|
|
)
|
|
);
|
|
if ($mobdb->num_rows() == 0)
|
|
createErrorResponse(4);// not such message!!!
|
|
list($topic, $id_board) = $mobdb->fetch_row();
|
|
$mobdb->free_result();
|
|
|
|
if (isset($smcFunc)) {
|
|
$mobdb->query('
|
|
SELECT
|
|
t.locked, IFNULL(ln.id_topic, 0) AS notify, t.is_sticky, t.id_poll, t.num_replies, mf.id_member,
|
|
t.id_first_msg, mf.subject,
|
|
CASE WHEN ml.poster_time > ml.modified_time THEN ml.poster_time ELSE ml.modified_time END AS last_post_time
|
|
FROM {db_prefix}topics AS t
|
|
LEFT JOIN {db_prefix}log_notify AS ln ON (ln.id_topic = t.id_topic AND ln.id_member = {int:current_member})
|
|
LEFT JOIN {db_prefix}messages AS mf ON (mf.id_msg = t.id_first_msg)
|
|
LEFT JOIN {db_prefix}messages AS ml ON (ml.id_msg = t.id_last_msg)
|
|
WHERE t.id_topic = {int:current_topic}
|
|
LIMIT 1',
|
|
array(
|
|
'current_member' => $user_info['id'],
|
|
'current_topic' => $topic,
|
|
)
|
|
);
|
|
} else {
|
|
$mobdb->query('
|
|
SELECT
|
|
t.locked, IFNULL(ln.ID_TOPIC, 0) AS notify, t.isSticky, t.ID_POLL, t.numReplies, mf.ID_MEMBER,
|
|
t.ID_FIRST_MSG, mf.subject, GREATEST(ml.posterTime, ml.modifiedTime) AS lastPostTime
|
|
FROM {db_prefix}topics AS t
|
|
LEFT JOIN {db_prefix}log_notify AS ln ON (ln.ID_TOPIC = t.ID_TOPIC AND ln.ID_MEMBER = {int:current_member})
|
|
LEFT JOIN {db_prefix}messages AS mf ON (mf.ID_MSG = t.ID_FIRST_MSG)
|
|
LEFT JOIN {db_prefix}messages AS ml ON (ml.ID_MSG = t.ID_LAST_MSG)
|
|
WHERE t.ID_TOPIC = {int:current_topic}
|
|
LIMIT 1',
|
|
array(
|
|
'current_member' => $user_info['id'],
|
|
'current_topic' => $topic,
|
|
)
|
|
);
|
|
}
|
|
list ($locked, $context['notify'], $sticky, $pollID, $context['num_replies'], $ID_MEMBER_POSTER, $id_first_msg, $first_subject, $lastPostTime) = $mobdb->fetch_row();
|
|
$mobdb->free_result();
|
|
|
|
|
|
if ($user_info['is_guest'] && !allowedTo('post_reply_any', $id_board) && (!$modSettings['postmod_active'] || !allowedTo('post_unapproved_replies_any', $id_board)))
|
|
createErrorResponse(21);
|
|
|
|
// Security Issues!!!
|
|
// This is important!
|
|
if ($ID_MEMBER_POSTER == $user_info['id'])
|
|
{
|
|
if (allowedTo('post_reply_own', $id_board))
|
|
$can_post = 1;
|
|
elseif ($modSettings['postmod_active'] && !allowedTo('post_reply_own', $id_board) && allowedTo('post_unapproved_replies_own', $id_board))
|
|
$can_post = 2;
|
|
else
|
|
createErrorResponse(25);
|
|
}
|
|
else
|
|
{
|
|
if (allowedTo('post_reply_any', $id_board))
|
|
$can_post = 1;
|
|
elseif ($modSettings['postmod_active'] && !allowedTo('post_reply_any', $id_board) && allowedTo('post_unapproved_replies_any', $id_board))
|
|
$can_post = 2;
|
|
else
|
|
createErrorResponse(2);
|
|
}
|
|
|
|
// topic locked???
|
|
if ($locked && !allowedTo('moderate_board', $id_board))
|
|
createErrorResponse(25);
|
|
|
|
|
|
// Get a response prefix (like 'Re:') in the default forum language.
|
|
if (!isset($context['response_prefix']) && !($context['response_prefix'] = cache_get_data('response_prefix')))
|
|
{
|
|
if ($language === $user_info['language'])
|
|
$context['response_prefix'] = $txt['response_prefix'];
|
|
else
|
|
{
|
|
loadLanguage('index', $language, false);
|
|
$context['response_prefix'] = $txt['response_prefix'];
|
|
loadLanguage('index');
|
|
}
|
|
cache_put_data('response_prefix', $context['response_prefix'], 600);
|
|
}
|
|
|
|
|
|
|
|
// Make sure they _can_ quote this post, and if so get it.
|
|
if (isset($smcFunc)) { //SMF 2
|
|
$mobdb->query('
|
|
SELECT m.subject, IFNULL(mem.real_name, m.poster_name) AS poster_name, m.poster_time, m.body
|
|
FROM {db_prefix}messages AS m
|
|
INNER JOIN {db_prefix}boards AS b ON (b.id_board = m.id_board AND {query_see_board})
|
|
LEFT JOIN {db_prefix}members AS mem ON (mem.id_member = m.id_member)
|
|
WHERE m.id_msg = {int:id_msg}' . (!$modSettings['postmod_active'] || allowedTo('approve_posts') ? '' : '
|
|
AND m.approved = {int:is_approved}') . '
|
|
LIMIT 1',
|
|
array(
|
|
'id_msg' => $id_message,
|
|
'is_approved' => 1,
|
|
)
|
|
);
|
|
} else { //SMF 1.1
|
|
$mobdb->query('
|
|
SELECT m.subject, IFNULL(mem.realName, m.posterName) AS posterName, m.posterTime, m.body
|
|
FROM ({db_prefix}messages AS m, {db_prefix}boards AS b)
|
|
LEFT JOIN {db_prefix}members AS mem ON (mem.ID_MEMBER = m.ID_MEMBER)
|
|
WHERE {query_see_board} AND m.ID_MSG = {int:id_msg}
|
|
AND b.ID_BOARD = m.ID_BOARD
|
|
LIMIT 1',
|
|
array(
|
|
'id_msg' => $id_message,
|
|
)
|
|
);
|
|
}
|
|
if ($mobdb->num_rows() == 0) {
|
|
createErrorResponse(30);
|
|
}
|
|
|
|
list ($form_subject, $mname, $mdate, $form_message) = $mobdb->fetch_row();
|
|
$mobdb->free_result();
|
|
|
|
// Add 'Re: ' to the front of the quoted subject.
|
|
if (trim($context['response_prefix']) != '' && $FUNC['strpos']($form_subject, trim($context['response_prefix'])) !== 0)
|
|
$form_subject = $context['response_prefix'] . $form_subject;
|
|
|
|
// Censor the message and subject.
|
|
censorText($form_message);
|
|
censorText($form_subject);
|
|
|
|
// But if it's in HTML world, turn them into htmlspecialchar's so they can be edited!
|
|
if (strpos($form_message, '[html]') !== false)
|
|
{
|
|
$parts = preg_split('~(\[/code\]|\[code(?:=[^\]]+)?\])~i', $form_message, -1, PREG_SPLIT_DELIM_CAPTURE);
|
|
for ($i = 0, $n = count($parts); $i < $n; $i++)
|
|
{
|
|
// It goes 0 = outside, 1 = begin tag, 2 = inside, 3 = close tag, repeat.
|
|
if ($i % 4 == 0)
|
|
$parts[$i] = preg_replace('~\[html\](.+?)\[/html\]~ise', '\'[html]\' . preg_replace(\'~<br\s?/?' . '>~i\', \'<br /><br />\', \'$1\') . \'[/html]\'', $parts[$i]);
|
|
}
|
|
$form_message = implode('', $parts);
|
|
}
|
|
|
|
$form_message = preg_replace('~<br ?/?' . '>~i', "\n", $form_message);
|
|
|
|
// Remove any nested quotes, if necessary.
|
|
if (!empty($modSettings['removeNestedQuotes']))
|
|
$form_message = preg_replace(array('~\n?\[quote.*?\].+?\[/quote\]\n?~is', '~^\n~', '~\[/quote\]~'), '', $form_message);
|
|
|
|
// Add a quote string on the front and end.
|
|
$form_message = '[quote author=' . $mname . ' link=topic=' . $topic . '.msg' . (int) $id_message . '#msg' . (int) $id_message . ' date=' . $mdate . ']' . "\n" . rtrim($form_message) . "\n" . '[/quote]';
|
|
|
|
outputRPCResponse('
|
|
<params>
|
|
<param>
|
|
<value>
|
|
<struct>
|
|
<member>
|
|
<name>post_id</name>
|
|
<value><string>' . $id_message . '</string></value>
|
|
</member>
|
|
<member>
|
|
<name>post_title</name>
|
|
<value><base64>' . base64_encode(mobi_unescape_html($form_subject)) . '</base64></value>
|
|
</member>
|
|
<member>
|
|
<name>post_content</name>
|
|
<value><base64>' .base64_encode(mobi_unescape_html($form_message)) . '</base64></value>
|
|
</member>
|
|
</struct>
|
|
</value>
|
|
</param>
|
|
</params>');
|
|
}
|
|
|
|
// Creates a new topic! it also handles method_reply_topic
|
|
function method_create_topic($is_post = false, $new_api = false)
|
|
{
|
|
global $mobdb, $mobsettings, $modSettings, $context, $scripturl, $sourcedir, $user_info, $board, $topic, $func, $smcFunc, $language, $txt;
|
|
|
|
// We need these for creating topics
|
|
require_once($sourcedir . '/Subs-Post.php');
|
|
require_once($sourcedir . '/Post.php');
|
|
|
|
// Guest? No entry
|
|
if ($user_info['is_guest'])
|
|
createErrorResponse(21);
|
|
|
|
// Figure out the parameters
|
|
if ($is_post)
|
|
{
|
|
if ($new_api) {
|
|
$id_board = (int) $context['mob_request']['params'][0][0];
|
|
$id_topic = (int) $context['mob_request']['params'][1][0];
|
|
$subject = base64_decode($context['mob_request']['params'][2][0]);
|
|
$body = base64_decode($context['mob_request']['params'][3][0]);
|
|
|
|
if (isset($context['mob_request']['params'][4]))
|
|
$id_attach = (int) $context['mob_request']['params'][4][0][0];
|
|
} else {
|
|
$id_topic = (int) $context['mob_request']['params'][0][0];
|
|
$body = base64_decode($context['mob_request']['params'][2][0]);
|
|
$subject = base64_decode($context['mob_request']['params'][3][0]);
|
|
|
|
if (isset($context['mob_request']['params'][4]))
|
|
$id_attach = (int) $context['mob_request']['params'][4][0];
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ($new_api) {
|
|
$id_board = (int) $context['mob_request']['params'][0][0];
|
|
$subject = base64_decode($context['mob_request']['params'][1][0]);
|
|
$body = base64_decode($context['mob_request']['params'][2][0]);
|
|
if (isset($context['mob_request']['params'][4]))
|
|
$id_attach = (int) $context['mob_request']['params'][4][0][0];
|
|
} else {
|
|
$id_board = (int) $context['mob_request']['params'][0][0];
|
|
$subject = base64_decode($context['mob_request']['params'][1][0]);
|
|
$body = base64_decode($context['mob_request']['params'][3][0]);
|
|
if (isset($context['mob_request']['params'][4]))
|
|
$id_attach = (int) $context['mob_request']['params'][4][0];
|
|
}
|
|
}
|
|
|
|
$subject = utf8ToAscii($subject);
|
|
$body = utf8ToAscii($body);
|
|
$_POST['subject'] = $subject;
|
|
$_POST['message'] = $body;
|
|
|
|
// Get a response prefix (like 'Re:') in the default forum language.
|
|
if (!isset($context['response_prefix']) && !($context['response_prefix'] = cache_get_data('response_prefix')))
|
|
{
|
|
if ($language === $user_info['language'])
|
|
$context['response_prefix'] = $txt['response_prefix'];
|
|
else
|
|
{
|
|
loadLanguage('index', $language, false);
|
|
$context['response_prefix'] = $txt['response_prefix'];
|
|
loadLanguage('index');
|
|
}
|
|
cache_put_data('response_prefix', $context['response_prefix'], 600);
|
|
}
|
|
|
|
if($is_post)
|
|
{
|
|
$subject = $context['response_prefix'] . $subject;
|
|
}
|
|
|
|
|
|
// Trim out the whitespace
|
|
$subject = trim($subject);
|
|
$body = trim($body);
|
|
|
|
// Missing? Oh man
|
|
if ($is_post) {
|
|
if ((!$is_post && empty($id_board)) || empty($body) || (isset($id_attach) && empty($id_attach)) || (isset($id_topic) && empty($id_topic))) {
|
|
createErrorResponse(8);
|
|
}
|
|
}
|
|
else {
|
|
if ((!$is_post && empty($id_board)) || empty($body)|| empty($subject) || (isset($id_attach) && empty($id_attach)) || (isset($id_topic) && empty($id_topic))) {
|
|
createErrorResponse(8);
|
|
}
|
|
}
|
|
|
|
// Does this board exist?
|
|
$mobdb->query('
|
|
SELECT b.ID_BOARD
|
|
FROM ' . (!empty($id_topic) ? '{db_prefix}topics AS t
|
|
INNER JOIN {db_prefix}boards AS b ON (t.ID_BOARD = b.ID_BOARD)' : '{db_prefix}boards AS b') . '
|
|
WHERE {query_see_board}
|
|
AND ' . (!empty($id_topic) ? ($mobsettings['is_smf2'] ? 't.approved = 1 AND ' : '') . 't.ID_TOPIC' : 'b.ID_BOARD') . ' = {int:value}',
|
|
array(
|
|
'value' => empty($id_topic) ? $id_board : $id_topic,
|
|
)
|
|
);
|
|
if ($mobdb->num_rows() == 0)
|
|
createErrorResponse(4);
|
|
list($id_board) = $mobdb->fetch_row();
|
|
$mobdb->free_result();
|
|
|
|
// Can we actually post?
|
|
if (!isset($id_topic))
|
|
{
|
|
if (allowedTo('post_new', $id_board))
|
|
$can_post = 1;
|
|
elseif ($modSettings['postmod_active'] && !allowedTo('post_new', $id_board) && allowedTo('post_unapproved_topics', $id_board))
|
|
$can_post = 2;
|
|
else
|
|
createErrorResponse(25);
|
|
}
|
|
else
|
|
{
|
|
$mobdb->query('
|
|
SELECT locked, isSticky AS is_sticky, ' . ($mobsettings['is_smf2'] ? 'approved' : '1') . ' AS approved, numReplies AS num_replies, ID_FIRST_MSG AS id_first_msg, ID_MEMBER_STARTED AS id_member_started, ID_BOARD AS id_board,
|
|
ID_POLL AS id_poll
|
|
FROM {db_prefix}topics
|
|
WHERE id_topic = {int:current_topic}
|
|
LIMIT 1',
|
|
array(
|
|
'current_topic' => $id_topic,
|
|
)
|
|
);
|
|
$topic_info = $mobdb->fetch_assoc();
|
|
$mobdb->free_result();
|
|
|
|
if ($topic_info['id_board'] != $id_board)
|
|
createErrorResponse(25);
|
|
|
|
// Locked?
|
|
if ($topic_info['locked'] && !allowedTo('moderate_board', $id_board))
|
|
createErrorResponse(25);
|
|
|
|
// Is this this guy's topic?
|
|
if ($topic_info['id_member_started'] == $user_info['id'])
|
|
{
|
|
if (allowedTo('post_reply_own', $id_board))
|
|
$can_post = 1;
|
|
elseif ($modSettings['postmod_active'] && !allowedTo('post_reply_own', $id_board) && allowedTo('post_unapproved_replies_own', $id_board))
|
|
$can_post = 2;
|
|
else
|
|
createErrorResponse(25);
|
|
}
|
|
else
|
|
{
|
|
if (allowedTo('post_reply_any', $id_board))
|
|
$can_post = 1;
|
|
elseif ($modSettings['postmod_active'] && !allowedTo('post_reply_any', $id_board) && allowedTo('post_unapproved_replies_any', $id_board))
|
|
$can_post = 2;
|
|
else
|
|
createErrorResponse(2);
|
|
}
|
|
}
|
|
|
|
// Alright, we passed the security tests, lets check the inputs
|
|
//$subject = strtr(htmlspecialchars($subject), array("\r" => '', "\n" => '', "\t" => ''));
|
|
//$body = htmlspecialchars($body);
|
|
|
|
######## Added by Sean to fix the issue can not post##############
|
|
if ($mobsettings['is_smf2']) {
|
|
if (function_exists('get_magic_quotes_gpc') && @get_magic_quotes_gpc() != 0 && empty($modSettings['integrate_magic_quotes'])) {
|
|
$removeMagicQuoteFunction = @ini_get('magic_quotes_sybase') || strtolower(@ini_get('magic_quotes_sybase')) == 'on' ? 'unescapestring__recursive' : 'stripslashes__recursive';
|
|
$subject = $removeMagicQuoteFunction($subject);
|
|
$body = $removeMagicQuoteFunction($body);
|
|
}
|
|
// Set up the inputs for the form.
|
|
$body = $smcFunc['htmlspecialchars']($body, ENT_QUOTES);
|
|
preparsecode($body);
|
|
$subject = strtr($smcFunc['htmlspecialchars']($subject), array("\r" => '', "\n" => '', "\t" => ''));
|
|
} else {
|
|
if (@get_magic_quotes_gpc() == 0 && empty($modSettings['integrate_magic_quotes'])) {
|
|
$subject = addslashes__recursive($subject);
|
|
$body = addslashes__recursive($body);
|
|
}
|
|
// Set up the inputs for the form.
|
|
$body = $func['htmlspecialchars']($body, ENT_QUOTES);
|
|
preparsecode($body);
|
|
$subject = strtr($func['htmlspecialchars']($subject), array("\r" => '', "\n" => '', "\t" => ''));
|
|
}
|
|
##################################################################
|
|
if (strlen($subject) > 100)
|
|
$subject = substr($subject, 0, 100);
|
|
|
|
// Are the attachments valid?
|
|
if (isset($id_attach))
|
|
{
|
|
// Does it even exist?
|
|
$mobdb->query('
|
|
SELECT a.ID_ATTACH, a.ID_THUMB
|
|
FROM {db_prefix}attachments AS a
|
|
WHERE a.ID_ATTACH = {int:attach}',
|
|
array(
|
|
'attach' => $id_attach,
|
|
)
|
|
);
|
|
// Not found?
|
|
if ($mobdb->num_rows() == 0)
|
|
unset($id_attach);
|
|
|
|
list($id_attach, $id_thumb) = $mobdb->fetch_row();
|
|
$mobdb->free_result();
|
|
}
|
|
|
|
// Get the parameters ready
|
|
$msgOptions = array(
|
|
'id' => 0,
|
|
'subject' => $subject,
|
|
'body' => $body,
|
|
'icon' => isset($id_attach) ? 'clip' : 'xx',
|
|
'smileys_enabled' => true,
|
|
'attachments' => isset($id_attach) ? array($id_attach, $id_thumb) : null,
|
|
'approved' => $can_post == 2 ? false : true,
|
|
);
|
|
$topicOptions = array(
|
|
'id' => isset($id_topic) ? $id_topic : 0,
|
|
'board' => $id_board,
|
|
'poll' => isset($topic_info) ? $topic_info['id_poll'] : null,
|
|
'lock_mode' => isset($topic_info) ? $topic_info['locked'] : null,
|
|
'sticky_mode' => isset($topic_info) ? $topic_info['is_sticky'] : null,
|
|
'mark_as_read' => true,
|
|
'is_approved' => $can_post == 2 ? false : true,
|
|
);
|
|
$posterOptions = array(
|
|
'id' => $user_info['id'],
|
|
'name' => $user_info['name'],
|
|
'email' => $user_info['email'],
|
|
'update_post_count' => true,
|
|
);
|
|
|
|
// Actually create the topic...
|
|
createPost($msgOptions, $topicOptions, $posterOptions);
|
|
if (empty($topicOptions['id']))
|
|
createErrorResponse(8);
|
|
$id_topic = $topicOptions['id'];
|
|
trackStats();
|
|
|
|
// Notifications anyone?
|
|
$notifyData = array(
|
|
'body' => $body,
|
|
'subject' => $subject,
|
|
'name' => $user_info['name'],
|
|
'poster' => $user_info['id'],
|
|
'msg' => $msgOptions['id'],
|
|
'board' => $id_board,
|
|
'topic' => $id_topic,
|
|
);
|
|
//!!! Stupid fix for SMF 1.1
|
|
$board = $id_board;
|
|
$topic = $id_topic;
|
|
notifyMembersBoard($notifyData);
|
|
|
|
// Send out the response
|
|
outputRPCNewTopic($is_post ? $msgOptions['id'] : $topicOptions['id'], $can_post, $is_post);
|
|
}
|
|
|
|
// Creates a new attachment
|
|
function method_attach_image()
|
|
{
|
|
global $context, $mobdb, $modSettings, $mobsettingns, $scripturl, $sourcedir, $user_info, $boarddir;
|
|
|
|
// We need these files
|
|
require_once($sourcedir . '/Subs-Post.php');
|
|
require_once($sourcedir . '/Subs-Package.php');
|
|
|
|
// Get the parameters
|
|
$image = base64_decode($context['mob_request']['params'][0][0]);
|
|
$attach_name = base64_decode($context['mob_request']['params'][1][0]);
|
|
$type = strtolower($context['mob_request']['params'][2][0]);
|
|
$id_board = (int) $context['mob_request']['params'][3][0];
|
|
|
|
// Check it out
|
|
if (empty($image) || empty($attach_name) || !in_array($type, array('png', 'jpg', 'jpeg','image/png', 'image/jpg', 'image/jpeg')) || empty($id_board) || !allowedTo('post_attachment', $id_board))
|
|
createErrorResponse(9);
|
|
|
|
if (!empty($modSettings['currentAttachmentUploadDir']) && $mobsettings['is_smf2'])
|
|
{
|
|
if (!is_array($modSettings['attachmentUploadDir']))
|
|
$modSettings['attachmentUploadDir'] = unserialize($modSettings['attachmentUploadDir']);
|
|
|
|
// Just use the current path for temp files.
|
|
$attach_dir = $modSettings['attachmentUploadDir'][$modSettings['currentAttachmentUploadDir']];
|
|
$id_folder = $modSettings['currentAttachmentUploadDir'];
|
|
}
|
|
else
|
|
{
|
|
$attach_dir = $modSettings['attachmentUploadDir'];
|
|
$id_folder = 1;
|
|
}
|
|
|
|
// Does this board exist?
|
|
$mobdb->query('
|
|
SELECT b.ID_BOARD
|
|
FROM {db_prefix}boards AS b
|
|
WHERE {query_see_board}
|
|
AND b.ID_BOARD = {int:board}',
|
|
array(
|
|
'board' => $id_board,
|
|
)
|
|
);
|
|
if ($mobdb->num_rows() == 0)
|
|
createErrorResponse(4);
|
|
$mobdb->free_result();
|
|
|
|
// Put this in a workable place
|
|
$name = 'post_tmp_' . $user_info['id'] . '_' . rand(1, 100);
|
|
$destination = $attach_dir . '/' . $name;
|
|
@file_put_contents($destination, $image) or createErrorResponse(9);
|
|
|
|
// Create the attachment....
|
|
$attachmentOptions = array(
|
|
'post' => 0,
|
|
'poster' => $user_info['id'],
|
|
'name' => $attach_name,
|
|
'tmp_name' => $name,
|
|
'size' => filesize($destination),
|
|
'approved' => empty($modSettings['postmod_active']) || allowedTo('post_attachment'),
|
|
);
|
|
createAttachment($attachmentOptions);
|
|
|
|
// It failed? NOO!!!
|
|
if (!empty($attachmentOptions['errors']))
|
|
createErrorResponse(10);
|
|
|
|
// Post the success....
|
|
outputRPCResponse('
|
|
<params>
|
|
<param>
|
|
<value>
|
|
<struct>
|
|
<member>
|
|
<name>attachment_id</name>
|
|
<value><string>' . $attachmentOptions['id'] . '</string></value>
|
|
</member>
|
|
</struct>
|
|
</value>
|
|
</param>
|
|
</params>'
|
|
);
|
|
}
|
|
|
|
// Just a wrapper, actual handling is done by method_create_topic
|
|
function method_reply_topic()
|
|
{
|
|
return method_create_topic(true);
|
|
}
|
|
|
|
function method_new_topic()
|
|
{
|
|
return method_create_topic(false, true);
|
|
}
|
|
|
|
function method_reply_post()
|
|
{
|
|
return method_create_topic(true, true);
|
|
}
|
|
|
|
// Sends a PM
|
|
function method_create_message()
|
|
{
|
|
global $context, $mobdb, $mobsettings, $modSettings, $scripturl, $user_info, $sourcedir, $func, $smcFunc;
|
|
|
|
|
|
require_once($sourcedir . '/Subs-Post.php');
|
|
require_once($sourcedir . '/Subs-Auth.php');
|
|
|
|
// Load the parameters
|
|
$usernames = array();
|
|
foreach ($context['mob_request']['params'][0] as $username) {
|
|
$user = base64_decode($username[0]);
|
|
if ($mobsettings['is_smf2']) {
|
|
if (function_exists('get_magic_quotes_gpc') && @get_magic_quotes_gpc() != 0 && empty($modSettings['integrate_magic_quotes'])) {
|
|
$removeMagicQuoteFunction = @ini_get('magic_quotes_sybase') || strtolower(@ini_get('magic_quotes_sybase')) == 'on' ? 'unescapestring__recursive' : 'stripslashes__recursive';
|
|
$user = $removeMagicQuoteFunction($user);
|
|
}
|
|
$user = htmltrim__recursive($user);
|
|
$user = htmlspecialchars__recursive($user);
|
|
} else {
|
|
if (@get_magic_quotes_gpc() == 0 && empty($modSettings['integrate_magic_quotes'])) {
|
|
$user = addslashes__recursive($user);
|
|
}
|
|
$user = htmltrim__recursive($user);
|
|
$user = stripslashes__recursive($user);
|
|
$user = htmlspecialchars__recursive($user);
|
|
$user = addslashes__recursive($user);
|
|
}
|
|
$usernames[] = $user;
|
|
}
|
|
|
|
$subject = utf8ToAscii(trim(base64_decode($context['mob_request']['params'][1][0])));
|
|
$body = utf8ToAscii(trim(base64_decode($context['mob_request']['params'][2][0])));
|
|
|
|
######## Added by Sean to fix the issue can not post##############
|
|
if ($mobsettings['is_smf2']) {
|
|
if (function_exists('get_magic_quotes_gpc') && @get_magic_quotes_gpc() != 0 && empty($modSettings['integrate_magic_quotes'])) {
|
|
$removeMagicQuoteFunction = @ini_get('magic_quotes_sybase') || strtolower(@ini_get('magic_quotes_sybase')) == 'on' ? 'unescapestring__recursive' : 'stripslashes__recursive';
|
|
$subject = $removeMagicQuoteFunction($subject);
|
|
$body = $removeMagicQuoteFunction($body);
|
|
}
|
|
} else {
|
|
if (@get_magic_quotes_gpc() == 0 && empty($modSettings['integrate_magic_quotes'])) {
|
|
$subject = addslashes__recursive($subject);
|
|
$body = addslashes__recursive($body);
|
|
}
|
|
}
|
|
##################################################################
|
|
|
|
if (empty($usernames) || empty($subject) || empty($body))
|
|
createErrorResponse(7);
|
|
|
|
// Figue out the type of action
|
|
if (isset($context['mob_request']['params'][3]))
|
|
$action_type = (int) (in_array($context['mob_request']['params'][3][0], array(1, 2)) ? $context['mob_request']['params'][3][0] : 0);
|
|
else
|
|
$action_type = 0;
|
|
|
|
// Base PM?
|
|
if (!empty($action_type))
|
|
$base_pm = (int) $context['mob_request']['params'][4][0];
|
|
|
|
// If this is SMF 2.0, we need to figure out pm_head for conversations
|
|
if ($mobsettings['is_smf2'] && isset($base_pm))
|
|
{
|
|
$mobdb->query('
|
|
SELECT pm_head
|
|
FROM {db_prefix}personal_messages
|
|
WHERE id_pm = {int:pm}',
|
|
array(
|
|
'pm' => $base_pm,
|
|
)
|
|
);
|
|
list ($pm_head) = $mobdb->fetch_row();
|
|
$mobdb->free_result();
|
|
}
|
|
|
|
// Lets take cre of the uernames, figure out each and every member
|
|
$members = findMembers($usernames);
|
|
$id_members = array_keys($members);
|
|
|
|
// No members?
|
|
if (empty($id_members))
|
|
createErrorResponse(26);
|
|
|
|
// Too many recipients?
|
|
list ($modSettings['max_pm_recipients'], $modSettings['pm_posts_verification'], $modSettings['pm_posts_per_hour']) = explode(',', $modSettings['pm_spam_settings']);
|
|
if (count($id_members) > $modSettings['max_pm_recipients'])
|
|
createErrorResponse(29);
|
|
|
|
// Send the PM
|
|
if ($mobsettings['is_smf2']){
|
|
$result = sendpm(array('to' => $id_members, 'bcc' => array()), $subject, $body, true, null, isset($pm_head) ? $pm_head : 0);
|
|
}
|
|
else {
|
|
$result = sendpm(array('to' => $id_members, 'bcc' => array()), $subject, $body, true);
|
|
}
|
|
|
|
// We succeeded?
|
|
outputRPCResult(true);
|
|
}
|
|
|
|
// Gets a single user's topic
|
|
function method_get_user_topic()
|
|
{
|
|
global $context, $mobdb, $mobsettings, $modSettings, $user_info, $sourcedir;
|
|
|
|
// Guest?
|
|
if ($user_info['is_guest'])
|
|
createErrorResponse(21);
|
|
|
|
// Get the username
|
|
$username = base64_decode($context['mob_request']['params'][0][0]);
|
|
if (empty($username))
|
|
createErrorResponse(8);
|
|
|
|
require_once($sourcedir . '/Subs-Auth.php');
|
|
|
|
######## Added by Sean##############
|
|
if ($mobsettings['is_smf2']) {
|
|
if (function_exists('get_magic_quotes_gpc') && @get_magic_quotes_gpc() != 0 && empty($modSettings['integrate_magic_quotes'])) {
|
|
$removeMagicQuoteFunction = @ini_get('magic_quotes_sybase') || strtolower(@ini_get('magic_quotes_sybase')) == 'on' ? 'unescapestring__recursive' : 'stripslashes__recursive';
|
|
$username = $removeMagicQuoteFunction($username);
|
|
}
|
|
$username = htmltrim__recursive($username);
|
|
$username = htmlspecialchars__recursive($username);
|
|
} else {
|
|
if (@get_magic_quotes_gpc() == 0 && empty($modSettings['integrate_magic_quotes'])) {
|
|
$username = addslashes__recursive($username);
|
|
}
|
|
$username = htmltrim__recursive($username);
|
|
$username = stripslashes__recursive($username);
|
|
$username = htmlspecialchars__recursive($username);
|
|
$username = addslashes__recursive($username);
|
|
}
|
|
##################################################################
|
|
|
|
// Does this user exist?
|
|
$members = findMembers($username);
|
|
if (empty($members))
|
|
createErrorResponse(8);
|
|
$id_member = array_keys($members);
|
|
$member = $members[$id_member[0]];
|
|
if (empty($member))
|
|
createErrorResponse(8);
|
|
// Load the posts
|
|
$mobdb->query('
|
|
SELECT t.ID_TOPIC AS id_topic, t.isSticky AS is_sticky, fm.subject AS topic_title, t.numViews AS views, t.numReplies AS replies,
|
|
IFNULL(mem.ID_MEMBER, 0) AS id_member, IFNULL(mem.realName, fm.posterName) AS mem_name, mem.avatar, IFNULL(a.ID_ATTACH, 0) AS id_attach, a.filename, a.attachmentType AS attachment_type,
|
|
IFNULL(lm.posterTime, fm.posterTime) AS last_message_time, ' . ($user_info['is_guest'] ? '0' : 'IFNULL(lt.ID_MSG, IFNULL(lmr.ID_MSG, -1)) + 1') . ' AS new_from,
|
|
IFNULL(lm.body, fm.body) AS body, lm.ID_MSG_MODIFIED AS id_msg_modified, b.name AS board_name, b.ID_BOARD AS id_board, mem1.realName AS last_poster_name, mem1.memberName as last_poster_username
|
|
FROM {db_prefix}topics AS t
|
|
INNER JOIN {db_prefix}messages AS fm ON (t.ID_FIRST_MSG = fm.ID_MSG)
|
|
INNER JOIN {db_prefix}boards AS b ON (b.ID_BOARD = t.ID_BOARD)
|
|
LEFT JOIN {db_prefix}messages AS lm ON (t.ID_LAST_MSG = lm.ID_MSG)
|
|
LEFT JOIN {db_prefix}members AS mem1 ON (lm.ID_MEMBER = mem1.ID_MEMBER)
|
|
LEFT JOIN {db_prefix}members AS mem ON (fm.ID_MEMBER = mem.ID_MEMBER)' . ($user_info['is_guest'] ? '' : '
|
|
LEFT JOIN {db_prefix}log_topics AS lt ON (lt.ID_TOPIC = t.ID_TOPIC AND lt.ID_MEMBER = {int:current_member})
|
|
LEFT JOIN {db_prefix}log_mark_read AS lmr ON (lmr.ID_BOARD = t.ID_BOARD AND lmr.ID_MEMBER = {int:current_member})') . '
|
|
LEFT JOIN {db_prefix}attachments AS a ON (a.ID_MEMBER = mem.ID_MEMBER)
|
|
WHERE {query_see_board}' . ($mobsettings['is_smf2'] ? '
|
|
AND t.approved = 1' : '') . '
|
|
AND t.ID_MEMBER_STARTED = {int:member}
|
|
ORDER BY fm.posterTime DESC
|
|
LIMIT 20',
|
|
array(
|
|
'current_member' => $user_info['id'],
|
|
'member' => $member['id'],
|
|
)
|
|
);
|
|
$topics = array();
|
|
while ($row = $mobdb->fetch_assoc())
|
|
{
|
|
// Add stuff to the array
|
|
$topics[$row['id_topic']] = array(
|
|
'id' => $row['id_topic'],
|
|
'title' => processSubject($row['topic_title']),
|
|
'short_msg' => processShortContent($row['body']),
|
|
'replies' => $row['replies'],
|
|
'views' => $row['views'],
|
|
'poster' => array(
|
|
'id' => $row['id_member'],
|
|
'name' => $row['mem_name'],
|
|
'avatar' => str_replace(' ', '%20', $row['avatar'] == '' ? ($row['id_attach'] > 0 ? (empty($row['attachment_type']) ? $scripturl . '?action=dlattach;attach=' . $row['id_attach'] . ';type=avatar' : $modSettings['custom_avatar_url'] . '/' . $row['filename']) : '') : (stristr($row['avatar'], 'http://') ? $row['avatar'] : $modSettings['avatar_url'] . '/' . $row['avatar'])),
|
|
),
|
|
'last_poster_name' => $row['last_poster_name'],
|
|
'last_poster_username' => $row['last_poster_username'],
|
|
'is_new' => $user_info['is_guest'] ? 0 : $row['new_from'] <= $row['id_msg_modified'],
|
|
'board' => $row['id_board'],
|
|
'board_name' => $row['board_name'],
|
|
'last_msg_time' => mobiquo_time($row['last_message_time']),
|
|
);
|
|
}
|
|
$mobdb->free_result();
|
|
|
|
// LAME!
|
|
outputRPCNewTopics($topics);
|
|
}
|
|
|
|
// Gets a post in its raw format
|
|
function method_get_raw_post()
|
|
{
|
|
global $mobdb, $mobsettings, $user_info, $context, $sourcedir;
|
|
|
|
if ($user_info['is_guest'])
|
|
createErrorResponse(8);
|
|
|
|
// What is this post?
|
|
$id_msg = (int) $context['mob_request']['params'][0][0];
|
|
if (empty($id_msg))
|
|
createErrorResponse(6);
|
|
|
|
if (! $mobsettings['is_smf2']) {
|
|
$mobdb->query('
|
|
SELECT m.body, b.ID_BOARD AS id_board, m.subject, m.ID_MEMBER AS id_member, t.locked, t.ID_MEMBER_STARTED, m.posterTime
|
|
FROM {db_prefix}messages AS m
|
|
INNER JOIN {db_prefix}topics AS t ON (m.ID_TOPIC = t.ID_TOPIC)
|
|
INNER JOIN {db_prefix}boards AS b ON (b.ID_BOARD = t.ID_BOARD)
|
|
WHERE m.ID_MSG = {int:msg}',
|
|
array(
|
|
'msg' => $id_msg,
|
|
)
|
|
);
|
|
if ($mobdb->num_rows() == 0)
|
|
createErrorResponse(6);
|
|
list ($body, $id_board, $subject, $id_member_posted, $locked, $id_member_start, $post_time) = $mobdb->fetch_row();
|
|
$is_started = $user_info['id'] == $id_member_start && !$user_info['is_guest'];
|
|
$can_edit = (!$locked || allowedTo('moderate_board', $id_board)) && (allowedTo('modify_any', $id_board) || (allowedTo('modify_replies', $id_board) && $is_started) || (allowedTo('modify_own', $id_board) && $id_member_posted == $user_info['id'] && (empty($modSettings['edit_disable_time']) || $post_time + $modSettings['edit_disable_time'] * 60 > time())));
|
|
} else {
|
|
$mobdb->query('
|
|
SELECT m.body, b.ID_BOARD AS id_board, m.subject, m.ID_MEMBER AS id_member, t.locked, t.ID_MEMBER_STARTED, t.approved, m.poster_time
|
|
FROM {db_prefix}messages AS m
|
|
INNER JOIN {db_prefix}topics AS t ON (m.ID_TOPIC = t.ID_TOPIC)
|
|
INNER JOIN {db_prefix}boards AS b ON (b.ID_BOARD = t.ID_BOARD)
|
|
WHERE m.ID_MSG = {int:msg}',
|
|
array(
|
|
'msg' => $id_msg,
|
|
)
|
|
);
|
|
if ($mobdb->num_rows() == 0)
|
|
createErrorResponse(6);
|
|
list ($body, $id_board, $subject, $id_member_posted, $locked, $id_member_start, $approved, $post_time) = $mobdb->fetch_row();
|
|
$is_started = $user_info['id'] == $id_member_start && !$user_info['is_guest'];
|
|
$can_edit = (!$locked || allowedTo('moderate_board', $id_board)) && (allowedTo('modify_any', $id_board) || (allowedTo('modify_replies', $id_board) && $is_started) || (allowedTo('modify_own', $id_board) && $id_member_posted == $user_info['id'] && (empty($modSettings['edit_disable_time']) || !$approved || $post_time + $modSettings['edit_disable_time'] * 60 > time())));
|
|
}
|
|
|
|
$mobdb->free_result();
|
|
|
|
// Can we not modify?
|
|
if (! $can_edit) {
|
|
createErrorResponse(6);
|
|
}
|
|
|
|
// if ($user_info['id'] != $id_member_posted || !allowedTo('modify_own', $id_board))
|
|
// createErrorResponse(6);
|
|
|
|
// change <br> to \n
|
|
$body = preg_replace('~<br(?: /)?' . '>~i', "\n", $body);
|
|
|
|
// Return the resonse
|
|
outputRPCResponse('
|
|
<params>
|
|
<param>
|
|
<value>
|
|
<struct>
|
|
<member>
|
|
<name>post_id</name>
|
|
<value><string>' . $id_msg . '</string></value>
|
|
</member>
|
|
<member>
|
|
<name>post_title</name>
|
|
<value><base64>' . base64_encode(mobi_unescape_html($subject)) . '</base64></value>
|
|
</member>
|
|
<member>
|
|
<name>post_content</name>
|
|
<value><base64>' . base64_encode(mobi_unescape_html($body)) . '</base64></value>
|
|
</member>
|
|
</struct>
|
|
</value>
|
|
</param>
|
|
</params>'
|
|
);
|
|
}
|
|
|
|
// Saves a raw post
|
|
function method_save_raw_post()
|
|
{
|
|
global $mobdb, $mobsettings, $user_info, $context, $sourcedir, $func, $smcFunc;
|
|
|
|
if ($user_info['is_guest'])
|
|
createErrorResponse(8);
|
|
|
|
require_once($sourcedir . '/Subs-Post.php');
|
|
|
|
// What is this post?
|
|
$id_msg = (int) $context['mob_request']['params'][0][0];
|
|
if (empty($id_msg))
|
|
createErrorResponse(6);
|
|
$subject = utf8ToAscii(trim(base64_decode($context['mob_request']['params'][1][0])));
|
|
$body = utf8ToAscii(trim(base64_decode($context['mob_request']['params'][2][0])));
|
|
|
|
######## Added by Sean##############
|
|
if ($mobsettings['is_smf2']) {
|
|
if (function_exists('get_magic_quotes_gpc') && @get_magic_quotes_gpc() != 0 && empty($modSettings['integrate_magic_quotes'])) {
|
|
$removeMagicQuoteFunction = @ini_get('magic_quotes_sybase') || strtolower(@ini_get('magic_quotes_sybase')) == 'on' ? 'unescapestring__recursive' : 'stripslashes__recursive';
|
|
$subject = $removeMagicQuoteFunction($subject);
|
|
$body = $removeMagicQuoteFunction($body);
|
|
}
|
|
// Set up the inputs for the form.
|
|
$body = $smcFunc['htmlspecialchars']($body, ENT_QUOTES);
|
|
preparsecode($body);
|
|
$subject = strtr($smcFunc['htmlspecialchars']($subject), array("\r" => '', "\n" => '', "\t" => ''));
|
|
} else {
|
|
if (@get_magic_quotes_gpc() == 0 && empty($modSettings['integrate_magic_quotes']))
|
|
{
|
|
$subject = addslashes__recursive($subject);
|
|
$body = addslashes__recursive($body);
|
|
}
|
|
// Set up the inputs for the form.
|
|
$body = $func['htmlspecialchars']($body, ENT_QUOTES);
|
|
preparsecode($body);
|
|
$subject = strtr($func['htmlspecialchars']($subject), array("\r" => '', "\n" => '', "\t" => ''));
|
|
}
|
|
##################################################################
|
|
|
|
if (empty($subject) || empty($body))
|
|
createErrorResponse(1);
|
|
|
|
// Get the board and body
|
|
$mobdb->query('
|
|
SELECT b.ID_BOARD AS id_board, m.ID_MEMBER AS id_member, t.isSticky, t.locked, t.ID_TOPIC, m.posterTime AS poster_time, t.ID_MEMBER_STARTED
|
|
FROM {db_prefix}messages AS m
|
|
INNER JOIN {db_prefix}topics AS t ON (m.ID_TOPIC = t.ID_TOPIC)
|
|
INNER JOIN {db_prefix}boards AS b ON (b.ID_BOARD = t.ID_BOARD)
|
|
WHERE m.ID_MSG = {int:msg}',
|
|
array(
|
|
'msg' => $id_msg,
|
|
)
|
|
);
|
|
|
|
if ($mobdb->num_rows() == 0)
|
|
createErrorResponse(6);
|
|
|
|
list ($id_board, $id_member_posted, $sticky, $locked, $id_topic, $post_time, $id_member_start) = $mobdb->fetch_row();
|
|
$mobdb->free_result();
|
|
|
|
// Can we not modify?
|
|
// if ($user_info['id'] != $id_member_posted || !allowedTo('modify_own', $id_board))
|
|
// createErrorResponse(6);
|
|
|
|
$is_started = $user_info['id'] == $id_member_start && !$user_info['is_guest'];
|
|
if ($mobsettings['is_smf2']) {
|
|
$can_edit = (!$locked || allowedTo('moderate_board', $id_board)) && (allowedTo('modify_any', $id_board) || (allowedTo('modify_replies', $id_board) && $is_started) || (allowedTo('modify_own', $id_board) && $id_member_posted == $user_info['id'] && (empty($modSettings['edit_disable_time']) || !$approved || $post_time + $modSettings['edit_disable_time'] * 60 > time())));
|
|
} else {
|
|
$can_edit = (!$locked || allowedTo('moderate_board', $id_board)) && (allowedTo('modify_any', $id_board) || (allowedTo('modify_replies', $id_board) && $is_started) || (allowedTo('modify_own', $id_board) && $id_member_posted == $user_info['id'] && (empty($modSettings['edit_disable_time']) || !$approved || $post_time + $modSettings['edit_disable_time'] * 60 > time())));
|
|
}
|
|
if (! $can_edit) {
|
|
createErrorResponse(6);
|
|
}
|
|
|
|
//$subject = strtr(htmlspecialchars($subject), array("\r" => '', "\n" => '', "\t" => ''));
|
|
//$body = htmlspecialchars($body);
|
|
$body = un_preparsecode($body);
|
|
censorText($subject);
|
|
censorText($body);
|
|
|
|
// Save it!
|
|
$msgOptions = array(
|
|
'subject' => $subject,
|
|
'body' => $body,
|
|
'id' => $id_msg,
|
|
);
|
|
$topicOptions = array(
|
|
'id' => $id_topic,
|
|
'sticky_mode' => $sticky,
|
|
'locked_mode' => $locked,
|
|
);
|
|
$posterOptions = array();
|
|
modifyPost($msgOptions, $topicOptions, $posterOptions);
|
|
|
|
outputRPCResult(true);
|
|
}
|
|
|
|
// Gets unreadreplies
|
|
function method_get_user_reply_post()
|
|
{
|
|
global $context, $mobdb, $mobsettings, $modSettings, $user_info, $sourcedir;
|
|
|
|
// Guest?
|
|
if ($user_info['is_guest'])
|
|
createErrorResponse(21);
|
|
|
|
// Get the username
|
|
$username = base64_decode($context['mob_request']['params'][0][0]);
|
|
if (empty($username))
|
|
createErrorResponse(8);
|
|
|
|
require_once($sourcedir . '/Subs-Auth.php');
|
|
|
|
######## Added by Sean##############
|
|
if ($mobsettings['is_smf2']) {
|
|
if (function_exists('get_magic_quotes_gpc') && @get_magic_quotes_gpc() != 0 && empty($modSettings['integrate_magic_quotes'])) {
|
|
$removeMagicQuoteFunction = @ini_get('magic_quotes_sybase') || strtolower(@ini_get('magic_quotes_sybase')) == 'on' ? 'unescapestring__recursive' : 'stripslashes__recursive';
|
|
$username = $removeMagicQuoteFunction($username);
|
|
}
|
|
$username = htmltrim__recursive($username);
|
|
$username = htmlspecialchars__recursive($username);
|
|
} else {
|
|
if (@get_magic_quotes_gpc() == 0 && empty($modSettings['integrate_magic_quotes'])) {
|
|
$username = addslashes__recursive($username);
|
|
}
|
|
$username = htmltrim__recursive($username);
|
|
$username = stripslashes__recursive($username);
|
|
$username = htmlspecialchars__recursive($username);
|
|
$username = addslashes__recursive($username);
|
|
}
|
|
##################################################################
|
|
|
|
// Does this user exist?
|
|
$members = findMembers($username);
|
|
if (empty($members))
|
|
createErrorResponse(8);
|
|
$id_member = array_keys($members);
|
|
$member = $members[$id_member[0]];
|
|
if (empty($member))
|
|
createErrorResponse(8);
|
|
|
|
// Load the posts
|
|
$mobdb->query('
|
|
SELECT m.ID_MSG as post_id, m.subject as post_title, t.ID_TOPIC AS id_topic, t.isSticky AS is_sticky, fm.subject AS topic_title, t.numViews AS views, t.numReplies AS replies,
|
|
IFNULL(mem.ID_MEMBER, 0) AS id_member, mem.realName, mem.memberName, mem.avatar, IFNULL(a.ID_ATTACH, 0) AS id_attach, a.filename, a.attachmentType AS attachment_type,
|
|
IFNULL(lm.posterTime, fm.posterTime) AS last_message_time, ' . ($user_info['is_guest'] ? '0' : 'IFNULL(lt.ID_MSG, IFNULL(lmr.ID_MSG, -1)) + 1') . ' AS new_from,
|
|
IFNULL(m.body, fm.body) AS body, lm.ID_MSG_MODIFIED AS id_msg_modified, b.name AS board_name, b.ID_BOARD AS id_board
|
|
FROM {db_prefix}topics AS t
|
|
INNER JOIN {db_prefix}messages AS m ON (m.ID_TOPIC = t.ID_TOPIC AND m.ID_MEMBER = {int:member})
|
|
INNER JOIN {db_prefix}messages AS fm ON (t.ID_FIRST_MSG = fm.ID_MSG)
|
|
INNER JOIN {db_prefix}boards AS b ON (b.ID_BOARD = t.ID_BOARD)
|
|
LEFT JOIN {db_prefix}messages AS lm ON (t.ID_LAST_MSG = lm.ID_MSG)
|
|
LEFT JOIN {db_prefix}members AS mem ON (lm.ID_MEMBER = mem.ID_MEMBER)' . ($user_info['is_guest'] ? '' : '
|
|
LEFT JOIN {db_prefix}log_topics AS lt ON (lt.ID_TOPIC = t.ID_TOPIC AND lt.ID_MEMBER = {int:current_member})
|
|
LEFT JOIN {db_prefix}log_mark_read AS lmr ON (lmr.ID_BOARD = t.ID_BOARD AND lmr.ID_MEMBER = {int:current_member})') . '
|
|
LEFT JOIN {db_prefix}attachments AS a ON (a.ID_MEMBER = mem.ID_MEMBER)
|
|
WHERE {query_see_board}' . ($mobsettings['is_smf2'] ? '
|
|
AND t.approved = 1' : '') . '
|
|
ORDER BY lm.posterTime DESC
|
|
LIMIT 20',
|
|
array(
|
|
'current_member' => $user_info['id'],
|
|
'member' => $member['id'],
|
|
)
|
|
);
|
|
$topics = array();
|
|
while ($row = $mobdb->fetch_assoc())
|
|
{
|
|
// Add stuff to the array
|
|
$topics[$row['id_topic']] = array(
|
|
'id' => $row['id_topic'],
|
|
'title' => processSubject($row['topic_title']),
|
|
'post_id' => $row['post_id'],
|
|
'post_title' => processSubject($row['post_title']),
|
|
'short_msg' => processShortContent($row['body']),
|
|
'replies' => $row['replies'],
|
|
'views' => $row['views'],
|
|
'poster' => array(
|
|
'id' => $row['id_member'],
|
|
'post_name' => $row['realName'],
|
|
'username' => $row['memberName'],
|
|
'avatar' => str_replace(' ', '%20',$row['avatar'] == '' ? ($row['id_attach'] > 0 ? (empty($row['attachment_type']) ? $scripturl . '?action=dlattach;attach=' . $row['id_attach'] . ';type=avatar' : $modSettings['custom_avatar_url'] . '/' . $row['filename']) : '') : (stristr($row['avatar'], 'http://') ? $row['avatar'] : $modSettings['avatar_url'] . '/' . $row['avatar'])),
|
|
),
|
|
'is_new' => $user_info['is_guest'] ? 0 : $row['new_from'] <= $row['id_msg_modified'],
|
|
'board' => $row['id_board'],
|
|
'board_name' => $row['board_name'],
|
|
'post_time' => mobiquo_time($row['last_message_time']),
|
|
);
|
|
}
|
|
$mobdb->free_result();
|
|
|
|
// LAME!
|
|
outputRPCNewTopics($topics);
|
|
}
|
|
|
|
// Gets subscribed topics
|
|
function method_get_subscribed_topic()
|
|
{
|
|
global $context, $mobdb, $mobsettings, $modSettings, $user_info;
|
|
|
|
// Guest?
|
|
if ($user_info['is_guest'])
|
|
createErrorResponse(21);
|
|
|
|
// Load the posts
|
|
$mobdb->query('
|
|
SELECT t.ID_TOPIC AS id_topic, t.isSticky AS is_sticky, t.locked, fm.subject AS topic_title, t.numViews AS views, t.numReplies AS replies,
|
|
IFNULL(mem.ID_MEMBER, 0) AS id_member, mem.realName, mem.memberName, mem.avatar, IFNULL(a.ID_ATTACH, 0) AS id_attach, a.filename, a.attachmentType AS attachment_type,
|
|
IFNULL(lm.posterTime, fm.posterTime) AS last_message_time, ' . ($user_info['is_guest'] ? '0' : 'IFNULL(lt.ID_MSG, IFNULL(lmr.ID_MSG, -1)) + 1') . ' AS new_from,
|
|
IFNULL(lm.body, fm.body) AS body, lm.ID_MSG_MODIFIED AS id_msg_modified, b.name AS board_name, b.ID_BOARD AS id_board
|
|
FROM {db_prefix}topics AS t
|
|
INNER JOIN {db_prefix}log_notify AS ln ON (ln.ID_TOPIC = t.ID_TOPIC AND ln.ID_MEMBER = {int:current_member})
|
|
INNER JOIN {db_prefix}messages AS fm ON (t.ID_FIRST_MSG = fm.ID_MSG)
|
|
INNER JOIN {db_prefix}boards AS b ON (b.ID_BOARD = t.ID_BOARD)
|
|
LEFT JOIN {db_prefix}messages AS lm ON (t.ID_LAST_MSG = lm.ID_MSG)
|
|
LEFT JOIN {db_prefix}members AS mem ON (lm.ID_MEMBER = mem.ID_MEMBER)' . ($user_info['is_guest'] ? '' : '
|
|
LEFT JOIN {db_prefix}log_topics AS lt ON (lt.ID_TOPIC = t.ID_TOPIC AND lt.ID_MEMBER = {int:current_member})
|
|
LEFT JOIN {db_prefix}log_mark_read AS lmr ON (lmr.ID_BOARD = t.ID_BOARD AND lmr.ID_MEMBER = {int:current_member})') . '
|
|
LEFT JOIN {db_prefix}attachments AS a ON (a.ID_MEMBER = mem.ID_MEMBER)
|
|
WHERE {query_see_board}' . ($mobsettings['is_smf2'] ? '
|
|
AND t.approved = 1' : '') . '
|
|
ORDER BY lm.posterTime DESC',
|
|
array(
|
|
'current_member' => $user_info['id'],
|
|
)
|
|
);
|
|
$topics = array();
|
|
while ($row = $mobdb->fetch_assoc())
|
|
{
|
|
// Add stuff to the array
|
|
$topics[$row['id_topic']] = array(
|
|
'id' => $row['id_topic'],
|
|
'title' => processSubject($row['topic_title']),
|
|
'short_msg' => processShortContent($row['body']),
|
|
'replies' => $row['replies'],
|
|
'views' => $row['views'],
|
|
'poster' => array(
|
|
'id' => $row['id_member'],
|
|
'post_name' => $row['realName'],
|
|
'username' => $row['memberName'],
|
|
'avatar' => str_replace(' ', '%20', $row['avatar'] == '' ? ($row['id_attach'] > 0 ? (empty($row['attachment_type']) ? $scripturl . '?action=dlattach;attach=' . $row['id_attach'] . ';type=avatar' : $modSettings['custom_avatar_url'] . '/' . $row['filename']) : '') : (stristr($row['avatar'], 'http://') ? $row['avatar'] : $modSettings['avatar_url'] . '/' . $row['avatar'])),
|
|
),
|
|
'is_new' => $user_info['is_guest'] ? 0 : $row['new_from'] <= $row['id_msg_modified'],
|
|
'board' => $row['id_board'],
|
|
'board_name' => $row['board_name'],
|
|
'post_time' => mobiquo_time($row['last_message_time']),
|
|
'is_marked_notify' => true,
|
|
'is_locked' => !empty($row['locked']),
|
|
);
|
|
}
|
|
$mobdb->free_result();
|
|
|
|
// Get the count
|
|
$mobdb->query('
|
|
SELECT COUNT(*)
|
|
FROM {db_prefix}topics AS t
|
|
INNER JOIN {db_prefix}log_notify AS ln ON (ln.ID_TOPIC = t.ID_TOPIC AND ln.ID_MEMBER = {int:current_member})
|
|
INNER JOIN {db_prefix}messages AS fm ON (t.ID_FIRST_MSG = fm.ID_MSG)
|
|
INNER JOIN {db_prefix}boards AS b ON (b.ID_BOARD = t.ID_BOARD)
|
|
LEFT JOIN {db_prefix}messages AS lm ON (lm.ID_MSG = t.ID_LAST_MSG)
|
|
WHERE {query_see_board}' . ($mobsettings['is_smf2'] ? '
|
|
AND t.approved = 1' : '') . '
|
|
ORDER BY lm.posterTime DESC',
|
|
array(
|
|
'current_member' => $user_info['id'],
|
|
)
|
|
);
|
|
list($count) = $mobdb->fetch_row();
|
|
$mobdb->free_result();
|
|
|
|
// Return...
|
|
outputRPCSubscribedTopics($topics, $count);
|
|
}
|
|
|
|
// Returns the overall board statistics
|
|
function method_get_board_stat()
|
|
{
|
|
global $modSettings, $context;
|
|
|
|
$members_online = getMembersOnline();
|
|
|
|
outputRPCResponse('
|
|
<params>
|
|
<param>
|
|
<value>
|
|
<struct>
|
|
<member>
|
|
<name>total_threads</name>
|
|
<value><int>' . $modSettings['totalTopics'] . '</int></value>
|
|
</member>
|
|
<member>
|
|
<name>total_posts</name>
|
|
<value><int>' . $modSettings['totalMessages'] . '</int></value>
|
|
</member>
|
|
<member>
|
|
<name>total_members</name>
|
|
<value><int>' . $modSettings['totalMembers'] . '</int></value>
|
|
</member>
|
|
<member>
|
|
<name>active_members</name>
|
|
<value><int>' . $modSettings['totalMembers'] . '</int></value>
|
|
</member>
|
|
<member>
|
|
<name>guest_online</name>
|
|
<value><int>' . $members_online['num_guests'] . '</int></value>
|
|
</member>
|
|
<member>
|
|
<name>total_online</name>
|
|
<value><int>' . ($members_online['num_guests'] + count($members_online['users_online'])) . '</int></value>
|
|
</member>
|
|
</struct>
|
|
</value>
|
|
</param>
|
|
</params>'
|
|
);
|
|
}
|
|
|
|
// Returns the current online members
|
|
function method_get_online_users()
|
|
{
|
|
$members_online = getMembersOnline();
|
|
|
|
outputRPCOnline($members_online);
|
|
}
|
|
|
|
// Gets the dashboard stuff
|
|
function method_get_dashboard()
|
|
{
|
|
global $context, $user_info, $mobdb;
|
|
|
|
if ($user_info['is_guest'])
|
|
createErrorResponse(8);
|
|
|
|
// Get the unread coount
|
|
$mobdb->query('
|
|
SELECT COUNT(*)
|
|
FROM {db_prefix}topics AS t
|
|
LEFT JOIN {db_prefix}log_topics AS lt ON (lt.ID_TOPIC = t.ID_TOPIC AND lt.ID_MEMBER = {int:current_member})
|
|
LEFT JOIN {db_prefix}log_mark_read AS lmr ON (lmr.ID_BOARD = t.ID_BOARD AND lmr.ID_MEMBER = {int:current_member})
|
|
INNER JOIN {db_prefix}boards AS b ON (b.ID_BOARD = t.ID_BOARD)
|
|
WHERE {query_see_board}
|
|
AND IFNULL(lt.ID_MSG, IFNULL(lmr.ID_MSG, 0)) < t.ID_LAST_MSG',
|
|
array(
|
|
'current_member' => $user_info['id'],
|
|
)
|
|
);
|
|
list($unread_count) = $mobdb->fetch_row();
|
|
$mobdb->free_result();
|
|
|
|
outputRPCResponse('
|
|
<params>
|
|
<param>
|
|
<value>
|
|
<struct>
|
|
<member>
|
|
<name>total_unread_count<name>
|
|
<value><string>' . $unread_count . '</string></value>
|
|
</member>
|
|
<member>
|
|
<name>post_title</name>
|
|
<value><base64>' . $user_info['unread_messages'] . '</base64></value>
|
|
</member>
|
|
</struct>
|
|
</value>
|
|
</param>
|
|
</params>'
|
|
);
|
|
}
|
|
|
|
// Gets unread topics
|
|
function method_get_unread_topic()
|
|
{
|
|
global $context, $mobdb, $mobsettings, $modSettings, $user_info;
|
|
|
|
// Guest?
|
|
if ($user_info['is_guest'])
|
|
createErrorResponse(21);
|
|
|
|
// Star/end
|
|
if (isset($context['mob_request']['params'][0]))
|
|
$start_num = (int) $context['mob_request']['params'][0][0];
|
|
if (isset($context['mob_request']['params'][1]))
|
|
$last_num = (int) $context['mob_request']['params'][1][0];
|
|
|
|
$topics_per_page = 20;
|
|
if (!isset($start_num) && !isset($last_num))
|
|
$limit = $topics_per_page;
|
|
elseif (isset($start_num) && !isset($last_num))
|
|
$limit = $start_num . ', ' . $topics_per_page;
|
|
elseif (isset($start_num) && isset($last_num))
|
|
$limit = $start_num . ', ' . (($last_num - $start_num) + 1);
|
|
|
|
// Get the unread coount
|
|
$mobdb->query('
|
|
SELECT COUNT(*)
|
|
FROM {db_prefix}topics AS t
|
|
LEFT JOIN {db_prefix}log_topics AS lt ON (lt.ID_TOPIC = t.ID_TOPIC AND lt.ID_MEMBER = {int:current_member})
|
|
LEFT JOIN {db_prefix}log_mark_read AS lmr ON (lmr.ID_BOARD = t.ID_BOARD AND lmr.ID_MEMBER = {int:current_member})
|
|
INNER JOIN {db_prefix}boards AS b ON (b.ID_BOARD = t.ID_BOARD)
|
|
WHERE {query_see_board}
|
|
AND IFNULL(lt.ID_MSG, IFNULL(lmr.ID_MSG, 0)) < t.ID_LAST_MSG',
|
|
array(
|
|
'current_member' => $user_info['id'],
|
|
)
|
|
);
|
|
list($unread_count) = $mobdb->fetch_row();
|
|
$mobdb->free_result();
|
|
|
|
// Load the posts
|
|
$mobdb->query('
|
|
SELECT t.ID_TOPIC AS id_topic, t.isSticky AS is_sticky, t.locked, fm.subject AS topic_title, t.numViews AS views, t.numReplies AS replies,
|
|
IFNULL(mem.ID_MEMBER, 0) AS id_member, mem.realName, mem.memberName, mem.avatar, IFNULL(a.ID_ATTACH, 0) AS id_attach, a.filename, a.attachmentType AS attachment_type,
|
|
IFNULL(lm.posterTime, fm.posterTime) AS last_message_time, ' . ($user_info['is_guest'] ? '0' : 'ln.ID_TOPIC AS is_notify, IFNULL(lt.ID_MSG, IFNULL(lmr.ID_MSG, -1)) + 1') . ' AS new_from,
|
|
IFNULL(lm.body, fm.body) AS body, lm.ID_MSG_MODIFIED AS id_msg_modified, b.name AS board_name, b.ID_BOARD AS id_board
|
|
FROM {db_prefix}topics AS t
|
|
INNER JOIN {db_prefix}messages AS fm ON (t.ID_FIRST_MSG = fm.ID_MSG)
|
|
INNER JOIN {db_prefix}boards AS b ON (b.ID_BOARD = t.ID_BOARD)
|
|
LEFT JOIN {db_prefix}messages AS lm ON (t.ID_LAST_MSG = lm.ID_MSG)
|
|
LEFT JOIN {db_prefix}members AS mem ON (lm.ID_MEMBER = mem.ID_MEMBER)' . ($user_info['is_guest'] ? '' : '
|
|
LEFT JOIN {db_prefix}log_topics AS lt ON (lt.ID_TOPIC = t.ID_TOPIC AND lt.ID_MEMBER = {int:current_member})
|
|
LEFT JOIN {db_prefix}log_notify AS ln ON ((ln.ID_TOPIC = t.ID_TOPIC OR ln.ID_BOARD = t.ID_BOARD) AND ln.ID_MEMBER = {int:current_member})
|
|
LEFT JOIN {db_prefix}log_mark_read AS lmr ON (lmr.ID_BOARD = t.ID_BOARD AND lmr.ID_MEMBER = {int:current_member})') . '
|
|
LEFT JOIN {db_prefix}attachments AS a ON (a.ID_MEMBER = mem.ID_MEMBER)
|
|
WHERE {query_see_board}' . ($mobsettings['is_smf2'] ? '
|
|
AND t.approved = 1' : '') . '
|
|
AND IFNULL(lt.ID_MSG, IFNULL(lmr.ID_MSG, 0)) < t.ID_LAST_MSG
|
|
ORDER BY lm.posterTime DESC
|
|
LIMIT ' . $limit,
|
|
array(
|
|
'current_member' => $user_info['id'],
|
|
)
|
|
);
|
|
$topics = array();
|
|
while ($row = $mobdb->fetch_assoc())
|
|
{
|
|
// Add stuff to the array
|
|
$topics[$row['id_topic']] = array(
|
|
'id' => $row['id_topic'],
|
|
'title' => processSubject($row['topic_title']),
|
|
'short_msg' => processShortContent($row['body']),
|
|
'replies' => $row['replies'],
|
|
'views' => $row['views'],
|
|
'poster' => array(
|
|
'id' => $row['id_member'],
|
|
'username' => $row['memberName'],
|
|
'post_name' => $row['realName'],
|
|
'avatar' => str_replace(' ', '%20', $row['avatar'] == '' ? ($row['id_attach'] > 0 ? (empty($row['attachment_type']) ? $scripturl . '?action=dlattach;attach=' . $row['id_attach'] . ';type=avatar' : $modSettings['custom_avatar_url'] . '/' . $row['filename']) : '') : (stristr($row['avatar'], 'http://') ? $row['avatar'] : $modSettings['avatar_url'] . '/' . $row['avatar'])),
|
|
),
|
|
'is_new' => $user_info['is_guest'] ? 0 : $row['new_from'] <= $row['id_msg_modified'],
|
|
'board' => $row['id_board'],
|
|
'board_name' => $row['board_name'],
|
|
'post_time' => mobiquo_time($row['last_message_time']),
|
|
'is_marked_notify' => !empty($row['is_notify']),
|
|
'is_locked' => !empty($row['locked']),
|
|
);
|
|
}
|
|
$mobdb->free_result();
|
|
|
|
// LAME!
|
|
outputRPCSubscribedTopics($topics, $unread_count);
|
|
}
|
|
|
|
// Mark ALL the topics as READ!
|
|
function method_mark_all_as_read()
|
|
{
|
|
global $mobdb, $context, $scripturl, $user_info, $modSettings, $sourcedir;
|
|
|
|
// Guest?
|
|
if ($user_info['is_guest'])
|
|
createErrorResponse(8);
|
|
|
|
$whereadd = '';
|
|
if (isset($context['mob_request']['params'][0][0])) {
|
|
$id_board = intval($context['mob_request']['params'][0][0]);
|
|
$whereadd = " AND b.ID_BOARD=$id_board";
|
|
}
|
|
|
|
// Get all the boards this user can see
|
|
$mobdb->query('
|
|
SELECT b.ID_BOARD AS id_board
|
|
FROM {db_prefix}boards AS b
|
|
WHERE {query_see_board}' . $whereadd,
|
|
array()
|
|
);
|
|
$boards = array();
|
|
while ($row = $mobdb->fetch_assoc())
|
|
$boards[] = $row['id_board'];
|
|
$mobdb->free_result();
|
|
|
|
// We got boards?
|
|
if (!empty($boards))
|
|
{
|
|
require_once($sourcedir . '/Subs-Boards.php');
|
|
markBoardsRead($boards, false);
|
|
}
|
|
|
|
outputRPCResult(true);
|
|
}
|
|
|
|
// Handles the search
|
|
function method_search_topic($subject_only = 1)
|
|
{
|
|
global $mobdb, $context, $sourcedir, $user_info, $modSettings, $scripturl, $modSettings, $messages_request;
|
|
|
|
// Guest?
|
|
if ($user_info['is_guest'])
|
|
createErrorResponse(21);
|
|
|
|
// Search string
|
|
$string = base64_decode($context['mob_request']['params'][0][0]);
|
|
if (empty($string))
|
|
createErrorResponse(8);
|
|
|
|
// Start/limit
|
|
if (isset($context['mob_request']['params'][0]))
|
|
$start_num = (int) $context['mob_request']['params'][1][0];
|
|
if (isset($context['mob_request']['params'][1]))
|
|
$limit = (int) (($context['mob_request']['params'][2][0] - $start_num) + 1);
|
|
|
|
// We got an ID?
|
|
if (isset($context['mob_request']['params'][3]))
|
|
$id_search = $context['mob_request']['params'][3][0];
|
|
|
|
// Is it an existing search?
|
|
$new_search = !isset($id_search) || empty($_SESSION['search_cache'][$id_search]);
|
|
|
|
if (!$new_search)
|
|
$_SESSION['search_cache'] = $_SESSION['search_cache'][$id_search];
|
|
|
|
// We use a cheap hack to perform our search
|
|
$_REQUEST['start'] = $_GET['start'] = isset($start_num) ? $start_num : 0;
|
|
$modSettings['search_results_per_page'] = isset($limit) ? $limit : 20;
|
|
$_REQUEST['search'] = $_POST['search'] = $string;
|
|
$_REQUEST['advanced'] = $_POST['advanced'] = 0;
|
|
$_REQUEST['subject_only'] = $_POST['subject_only'] = $subject_only;
|
|
require_once($sourcedir . '/Search.php');
|
|
PlushSearch2();
|
|
|
|
// We got results?
|
|
if (!isset($_SESSION['search_cache']))
|
|
createErrorResponse(8);
|
|
|
|
$count = $_SESSION['search_cache']['num_results'];
|
|
$search_id = $_SESSION['search_cache']['ID_SEARCH'];
|
|
|
|
// Cache it
|
|
if (isset($id_search))
|
|
{
|
|
$search_cache = $_SESSION['search_cache'];
|
|
unset($_SESSION['search_cache']);
|
|
$_SESSION['search_cache'][$id_search] = $search_cache;
|
|
unset ($search_cache);
|
|
}
|
|
|
|
// Get the results
|
|
$topics = array();
|
|
$tids = array();
|
|
while ($topic = $context['get_topics']())
|
|
{
|
|
$topics[$topic['id']] = array(
|
|
'board' => $topic['board']['id'],
|
|
'board_name' => $topic['board']['name'],
|
|
'id' => $topic['id'],
|
|
'poster' => array(
|
|
'id' => $topic['matches'][0]['member']['id'],
|
|
'post_name' => $topic['matches'][0]['member']['name'],
|
|
'username' => $topic['matches'][0]['member']['username'],
|
|
'avatar' => $topic['matches'][0]['member']['avatar']['url'],
|
|
),
|
|
'post_time' => mobiquo_time($topic['first_post']['timestamp']),
|
|
'views' => $topic['views'],
|
|
'replies' => $topic['replies'],
|
|
'title' => processSubject($topic['first_post']['subject']),
|
|
'short_msg' => processShortContent($topic['matches'][0]['body']),
|
|
'is_marked_notify' => false,
|
|
'is_locked' => !empty($topic['is_locked']),
|
|
'post_id' => $topic['matches'][0]['id'],
|
|
'post_title' => processSubject($topic['matches'][0]['subject']),
|
|
);
|
|
$tids[] = $topic['id'];
|
|
}
|
|
|
|
if (!empty($tids))
|
|
{
|
|
// Check for notifications on this topic OR board.
|
|
$mobdb->query("
|
|
SELECT sent, ID_TOPIC
|
|
FROM {db_prefix}log_notify
|
|
WHERE ID_TOPIC IN ({array_int:topic_ids})
|
|
AND ID_MEMBER = {int:member}",
|
|
array(
|
|
'topic_ids' => $tids,
|
|
'member' => $user_info['id']
|
|
)
|
|
);
|
|
|
|
while ($row = $mobdb->fetch_assoc())
|
|
{
|
|
// Find if this topic is marked for notification...
|
|
if (!empty($row['ID_TOPIC']))
|
|
$topics[$row['ID_TOPIC']]['is_marked_notify'] = true;
|
|
}
|
|
$mobdb->free_result();
|
|
}
|
|
|
|
// Output the results
|
|
outputRPCSubscribedTopics($topics, $count, $search_id);
|
|
}
|
|
|
|
function method_search_post()
|
|
{
|
|
method_search_topic(0);
|
|
}
|
|
|
|
// Gets a single user's topic
|
|
function method_get_participated_topic()
|
|
{
|
|
global $context, $mobdb, $mobsettings, $modSettings, $user_info, $sourcedir;
|
|
|
|
// Guest?
|
|
if ($user_info['is_guest'])
|
|
createErrorResponse(21);
|
|
|
|
// Get the username
|
|
$username = base64_decode($context['mob_request']['params'][0][0]);
|
|
if (empty($username))
|
|
createErrorResponse(8);
|
|
|
|
require_once($sourcedir . '/Subs-Auth.php');
|
|
|
|
######## Added by Sean##############
|
|
if ($mobsettings['is_smf2']) {
|
|
if (function_exists('get_magic_quotes_gpc') && @get_magic_quotes_gpc() != 0 && empty($modSettings['integrate_magic_quotes'])) {
|
|
$removeMagicQuoteFunction = @ini_get('magic_quotes_sybase') || strtolower(@ini_get('magic_quotes_sybase')) == 'on' ? 'unescapestring__recursive' : 'stripslashes__recursive';
|
|
$username = $removeMagicQuoteFunction($username);
|
|
}
|
|
$username = htmltrim__recursive($username);
|
|
$username = htmlspecialchars__recursive($username);
|
|
} else {
|
|
if (@get_magic_quotes_gpc() == 0 && empty($modSettings['integrate_magic_quotes'])) {
|
|
$username = addslashes__recursive($username);
|
|
}
|
|
$username = htmltrim__recursive($username);
|
|
$username = stripslashes__recursive($username);
|
|
$username = htmlspecialchars__recursive($username);
|
|
$username = addslashes__recursive($username);
|
|
}
|
|
##################################################################
|
|
|
|
// Does this user exist?
|
|
$members = findMembers($username);
|
|
if (empty($members))
|
|
createErrorResponse(8);
|
|
$id_member = array_keys($members);
|
|
$member = $members[$id_member[0]];
|
|
if (empty($member))
|
|
createErrorResponse(8);
|
|
|
|
// Do we have start num defined?
|
|
if (isset($context['mob_request']['params'][1]))
|
|
$start_num = (int) $context['mob_request']['params'][1][0];
|
|
|
|
// Do we have last number defined?
|
|
if (isset($context['mob_request']['params'][2]))
|
|
$last_num = (int) $context['mob_request']['params'][2][0];
|
|
|
|
// Perform some start/last num checks
|
|
if (isset($start_num) && isset($last_num))
|
|
if ($start_num > $last_num)
|
|
createErrorResponse(3);
|
|
elseif ($last_num - $start_num > 50)
|
|
$last_num = $start_num + 50;
|
|
|
|
// Default number of topics per page
|
|
$topics_per_page = 20;
|
|
|
|
// Generate the limit clause
|
|
$limit = '';
|
|
if (!isset($start_num) && !isset($last_num)) {
|
|
$start_num = 0;
|
|
$limit = $topics_per_page;
|
|
} elseif (isset($start_num) && !isset($last_num)) {
|
|
$limit = $topics_per_page;
|
|
} elseif (isset($start_num) && isset($last_num)) {
|
|
$limit = $last_num - $start_num + 1;
|
|
} elseif (empty($start_num) && empty($last_num)) {
|
|
$start_num = 0;
|
|
$limit = $topics_per_page;
|
|
}
|
|
|
|
// Get the count
|
|
$mobdb->query('
|
|
SELECT t.ID_TOPIC
|
|
FROM {db_prefix}messages AS m
|
|
INNER JOIN {db_prefix}topics AS t ON (m.ID_TOPIC = t.ID_TOPIC)
|
|
INNER JOIN {db_prefix}boards AS b ON (b.ID_BOARD = t.ID_BOARD)
|
|
WHERE {query_see_board}' . ($mobsettings['is_smf2'] ? '
|
|
AND t.approved = 1' : '') . ' AND m.ID_MEMBER = {int:member}
|
|
GROUP BY t.ID_TOPIC
|
|
ORDER BY t.ID_TOPIC DESC',
|
|
array(
|
|
'member' => $id_member[0],
|
|
)
|
|
);
|
|
$tids = array();
|
|
while ($row = $mobdb->fetch_assoc()) {
|
|
$tids[] = $row['ID_TOPIC'];
|
|
}
|
|
$mobdb->free_result();
|
|
|
|
$count = count($tids);
|
|
if ($limit + $start_num > $count) $limit = $count - $start_num;
|
|
$tids = array_slice($tids, $start_num, $limit);
|
|
|
|
$topics = array();
|
|
if (count($tids)) {
|
|
// Grab the topics
|
|
$mobdb->query('
|
|
SELECT t.ID_TOPIC AS id_topic, t.isSticky AS is_sticky, t.locked, fm.subject AS topic_title, t.numViews AS views, t.numReplies AS replies,
|
|
IFNULL(mem.ID_MEMBER, 0) AS id_member, mem.realName, mem.memberName, mem.avatar, IFNULL(a.ID_ATTACH, 0) AS id_attach, a.filename, a.attachmentType AS attachment_type,
|
|
IFNULL(lm.posterTime, fm.posterTime) AS last_message_time, ' . ($user_info['is_guest'] ? '0' : 'ln.ID_TOPIC AS is_notify, IFNULL(lt.ID_MSG, IFNULL(lmr.ID_MSG, -1)) + 1') . ' AS new_from,
|
|
IFNULL(lm.body, fm.body) AS body, lm.ID_MSG_MODIFIED AS id_msg_modified, b.name AS board_name, b.ID_BOARD AS id_board
|
|
FROM {db_prefix}messages AS m
|
|
INNER JOIN {db_prefix}topics AS t ON (m.ID_TOPIC = t.ID_TOPIC)
|
|
INNER JOIN {db_prefix}messages AS fm ON (t.ID_FIRST_MSG = fm.ID_MSG)
|
|
INNER JOIN {db_prefix}boards AS b ON (b.ID_BOARD = t.ID_BOARD)
|
|
LEFT JOIN {db_prefix}messages AS lm ON (t.ID_LAST_MSG = lm.ID_MSG)
|
|
LEFT JOIN {db_prefix}members AS mem ON (lm.ID_MEMBER = mem.ID_MEMBER)' . ($user_info['is_guest'] ? '' : '
|
|
LEFT JOIN {db_prefix}log_topics AS lt ON (lt.ID_TOPIC = t.ID_TOPIC AND lt.ID_MEMBER = {int:current_member})
|
|
LEFT JOIN {db_prefix}log_notify AS ln ON ((ln.ID_TOPIC = t.ID_TOPIC OR ln.ID_BOARD = t.ID_BOARD) AND ln.ID_MEMBER = {int:current_member})
|
|
LEFT JOIN {db_prefix}log_mark_read AS lmr ON (lmr.ID_BOARD = t.ID_BOARD AND lmr.ID_MEMBER = {int:current_member})') . '
|
|
LEFT JOIN {db_prefix}attachments AS a ON (a.ID_MEMBER = mem.ID_MEMBER)
|
|
WHERE {query_see_board}' . ($mobsettings['is_smf2'] ? '
|
|
AND t.approved = 1' : '') . ' AND m.ID_MEMBER = {int:member} AND t.ID_TOPIC IN ({array_int:topic_ids})
|
|
ORDER BY lm.posterTime DESC',
|
|
array(
|
|
'current_member' => $user_info['id'],
|
|
'member' => $id_member[0],
|
|
'topic_ids' => $tids,
|
|
)
|
|
);
|
|
|
|
while ($row = $mobdb->fetch_assoc())
|
|
{
|
|
// Add stuff to the array
|
|
$topics[$row['id_topic']] = array(
|
|
'id' => $row['id_topic'],
|
|
'title' => processSubject($row['topic_title']),
|
|
'short_msg' => processShortContent($row['body']),
|
|
'replies' => $row['replies'],
|
|
'views' => $row['views'],
|
|
'poster' => array(
|
|
'id' => $row['id_member'],
|
|
'username' => $row['memberName'],
|
|
'post_name' => $row['realName'],
|
|
'avatar' => str_replace(' ', '%20', $row['avatar'] == '' ? ($row['id_attach'] > 0 ? (empty($row['attachment_type']) ? $scripturl . '?action=dlattach;attach=' . $row['id_attach'] . ';type=avatar' : $modSettings['custom_avatar_url'] . '/' . $row['filename']) : '') : (stristr($row['avatar'], 'http://') ? $row['avatar'] : $modSettings['avatar_url'] . '/' . $row['avatar'])),
|
|
),
|
|
'is_new' => $user_info['is_guest'] ? 0 : $row['new_from'] <= $row['id_msg_modified'],
|
|
'board' => $row['id_board'],
|
|
'board_name' => $row['board_name'],
|
|
'post_time' => mobiquo_time($row['last_message_time']),
|
|
'is_marked_notify' => !empty($row['is_notify']),
|
|
'is_locked' => !empty($row['locked']),
|
|
);
|
|
}
|
|
$mobdb->free_result();
|
|
}
|
|
|
|
// LAME!
|
|
outputRPCSubscribedTopics($topics, $count);
|
|
}
|
|
|
|
function method_subscribe_forum($action = 'on')
|
|
{
|
|
global $scripturl, $txt, $board, $ID_MEMBER, $user_info, $context, $mobdb;
|
|
|
|
// Permissions are an important part of anything ;).
|
|
if ($user_info['is_guest'])
|
|
outputRPCResult(false, $txt[1]);
|
|
|
|
if (!isset($context['mob_request']['params'][0]))
|
|
outputRPCResult(false, $txt['smf232']);
|
|
|
|
$id_board = (int) $context['mob_request']['params'][0][0];
|
|
|
|
if(!allowedTo('mark_notify', $id_board))
|
|
outputRPCResult(false, $txt['cannot_mark_notify']);
|
|
|
|
if ($action == 'on')
|
|
{
|
|
$mobdb->insert('{db_prefix}log_notify',
|
|
array('ID_MEMBER', 'ID_BOARD'),
|
|
array($user_info['id'], $id_board),
|
|
true
|
|
);
|
|
}
|
|
// ...or off?
|
|
else
|
|
{
|
|
$mobdb->query('
|
|
DELETE FROM {db_prefix}log_notify
|
|
WHERE ID_MEMBER = {int:member}
|
|
AND ID_BOARD = {int:board}
|
|
LIMIT 1',
|
|
array(
|
|
'member' => $user_info['id'],
|
|
'board' => $id_board,
|
|
)
|
|
);
|
|
}
|
|
|
|
outputRPCResult(true);
|
|
}
|
|
|
|
function method_unsubscribe_forum()
|
|
{
|
|
method_subscribe_forum('off');
|
|
}
|
|
|
|
function method_get_subscribed_forum()
|
|
{
|
|
global $txt, $user_info, $mobdb;
|
|
|
|
// Permissions are an important part of anything ;).
|
|
if ($user_info['is_guest'])
|
|
outputRPCResult(false, $txt[1]);
|
|
|
|
// All the boards with notification on..
|
|
$mobdb->query("
|
|
SELECT b.ID_BOARD, b.name, IFNULL(lb.ID_MSG, 0) AS boardRead, b.ID_MSG_UPDATED
|
|
FROM ({db_prefix}log_notify AS ln, {db_prefix}boards AS b)
|
|
LEFT JOIN {db_prefix}log_boards AS lb ON (lb.ID_BOARD = b.ID_BOARD AND lb.ID_MEMBER = {int:member})
|
|
WHERE {query_see_board} AND ln.ID_MEMBER = {int:member}
|
|
AND b.ID_BOARD = ln.ID_BOARD
|
|
ORDER BY b.boardOrder",
|
|
array(
|
|
'member' => $user_info['id'],
|
|
)
|
|
);
|
|
$boards = array();
|
|
while ($row = $mobdb->fetch_assoc())
|
|
$boards[] = array(
|
|
'id' => $row['ID_BOARD'],
|
|
'name' => $row['name'],
|
|
'new' => $row['boardRead'] < $row['ID_MSG_UPDATED'],
|
|
'icon' => get_board_icon($row['ID_BOARD']),
|
|
);
|
|
$mobdb->free_result();
|
|
|
|
outputRPCSubscribedBoards($boards);
|
|
}
|
|
|
|
function method_get_quote_pm()
|
|
{
|
|
global $context, $mobdb, $user_info, $sourcedir, $txt, $modSettings, $func, $language;
|
|
|
|
if ($user_info['is_guest'])
|
|
outputRPCResult(false, $txt[1]);
|
|
|
|
if (!allowedTo('pm_read'))
|
|
outputRPCResult(false, $txt['cannot_pm_read']);
|
|
|
|
if (!allowedTo('pm_send'))
|
|
outputRPCResult(false, $txt['cannot_pm_send']);
|
|
|
|
require_once($sourcedir . '/PersonalMessage.php');
|
|
|
|
// Get the message ID
|
|
if (!isset($context['mob_request']['params'][0]))
|
|
outputRPCResult(false, $txt['smf272']);
|
|
$id_pm = $context['mob_request']['params'][0][0];
|
|
|
|
// Load this message...
|
|
$mobdb->query('
|
|
SELECT pm.ID_PM AS id_pm, pm.subject, pm.body, pm.msgtime, pm.ID_MEMBER_FROM AS id_member_from, mem_from.realName
|
|
FROM {db_prefix}personal_messages AS pm
|
|
LEFT JOIN {db_prefix}pm_recipients AS pr ON (pm.ID_PM = pr.ID_PM)
|
|
LEFT JOIN {db_prefix}members AS mem_from ON (mem_from.ID_MEMBER = pm.ID_MEMBER_FROM)
|
|
WHERE pm.ID_PM = {int:pm} AND (pm.ID_MEMBER_FROM = {int:member} OR pr.ID_MEMBER = {int:member})',
|
|
array(
|
|
'pm' => $id_pm,
|
|
'member' => $user_info['id'],
|
|
)
|
|
);
|
|
if ($mobdb->num_rows() == 0)
|
|
outputRPCResult(false, $txt['pm_not_yours']);
|
|
$pm = $mobdb->fetch_assoc();
|
|
$mobdb->free_result();
|
|
|
|
censorText($pm['subject']);
|
|
censorText($pm['body']);
|
|
|
|
// Add 'Re: ' to it....
|
|
if (!isset($context['response_prefix']) && !($context['response_prefix'] = cache_get_data('response_prefix')))
|
|
{
|
|
if ($language === $user_info['language'])
|
|
$context['response_prefix'] = $txt['response_prefix'];
|
|
else
|
|
{
|
|
loadLanguage('index', $language, false);
|
|
$context['response_prefix'] = $txt['response_prefix'];
|
|
loadLanguage('index');
|
|
}
|
|
cache_put_data('response_prefix', $context['response_prefix'], 600);
|
|
}
|
|
|
|
$form_subject = $pm['subject'];
|
|
if (trim($context['response_prefix']) != '' && $func['strpos']($form_subject, trim($context['response_prefix'])) !== 0)
|
|
$form_subject = $context['response_prefix'] . $form_subject;
|
|
|
|
// Remove any nested quotes and <br />...
|
|
$form_message = preg_replace('~<br( /)?' . '>~i', "\n", $pm['body']);
|
|
if (!empty($modSettings['removeNestedQuotes']))
|
|
$form_message = preg_replace(array('~\n?\[quote.*?\].+?\[/quote\]\n?~is', '~^\n~', '~\[/quote\]~'), '', $form_message);
|
|
|
|
$form_message = processBody($form_message);
|
|
|
|
if (empty($pm['id_member_from']))
|
|
$form_message = '[quote author="' . $pm['realName'] . ""]\n" . $form_message . "\n[/quote]";
|
|
else
|
|
$form_message = '[quote author=' . $pm['realName'] . ' link=action=profile;u=' . $pm['id_member_from'] . ' date=' . $pm['msgtime'] . "]\n" . $form_message . "\n[/quote]";
|
|
|
|
outputRPCResponse('
|
|
<params>
|
|
<param>
|
|
<value>
|
|
<struct>
|
|
<member>
|
|
<name>msg_id</name>
|
|
<value><string>' . $id_pm . '</string></value>
|
|
</member>
|
|
<member>
|
|
<name>msg_subject</name>
|
|
<value><base64>' . base64_encode(mobi_unescape_html(processSubject($form_subject))) . '</base64></value>
|
|
</member>
|
|
<member>
|
|
<name>text_body</name>
|
|
<value><base64>' .base64_encode(mobi_unescape_html($form_message)) . '</base64></value>
|
|
</member>
|
|
</struct>
|
|
</value>
|
|
</param>
|
|
</params>');
|
|
}
|
|
|
|
function method_report_post()
|
|
{
|
|
global $context, $mobdb, $modSettings, $scripturl, $user_info, $sourcedir, $txt;
|
|
|
|
// Get the message ID
|
|
if (!isset($context['mob_request']['params'][0]))
|
|
outputRPCResult(false, $txt['smf272']);
|
|
$id_msg = (int) $context['mob_request']['params'][0][0];
|
|
$reason = utf8ToAscii(base64_decode($context['mob_request']['params'][1][0]));
|
|
|
|
require_once($sourcedir . '/Subs-Post.php');
|
|
|
|
$mobdb->query("
|
|
SELECT m.subject, m.ID_MEMBER, m.posterName, mem.realName, m.ID_TOPIC, m.ID_BOARD
|
|
FROM {db_prefix}messages AS m
|
|
LEFT JOIN {db_prefix}members AS mem ON (m.ID_MEMBER = mem.ID_MEMBER)
|
|
WHERE m.ID_MSG = $id_msg
|
|
LIMIT 1", array());
|
|
if ($mobdb->num_rows() == 0)
|
|
outputRPCResult(false, $txt['smf272']);
|
|
$message_info = $mobdb->fetch_assoc();
|
|
global $topic, $board;
|
|
list ($subject, $member, $posterName, $realName, $topic, $board) = array($message_info['subject'], $message_info['ID_MEMBER'], $message_info['posterName'], $message_info['realName'], $message_info['ID_TOPIC'], $message_info['ID_BOARD']);
|
|
$mobdb->free_result();
|
|
|
|
loadBoard();
|
|
loadPermissions();
|
|
|
|
// You can't use this if it's off or you are not allowed to do it.
|
|
if (!allowedTo('report_any'))
|
|
outputRPCResult(false, $txt['cannot_report_any']);
|
|
|
|
spamProtection('spam');
|
|
|
|
if ($member == $user_info['id'])
|
|
outputRPCResult(false, $txt['rtm_not_own']);
|
|
|
|
$posterName = un_htmlspecialchars($realName) . ($realName != $posterName ? ' (' . $posterName . ')' : '');
|
|
$reporterName = un_htmlspecialchars($user_info['name']) . ($user_info['name'] != $user_info['username'] && $user_info['username'] != '' ? ' (' . $user_info['username'] . ')' : '');
|
|
$subject = un_htmlspecialchars($subject);
|
|
|
|
// Get a list of members with the moderate_board permission.
|
|
require_once($sourcedir . '/Subs-Members.php');
|
|
$moderators = membersAllowedTo('moderate_board', $board);
|
|
|
|
$mobdb->query("
|
|
SELECT ID_MEMBER, emailAddress, lngfile
|
|
FROM {db_prefix}members
|
|
WHERE ID_MEMBER IN (" . implode(', ', $moderators) . ")
|
|
AND notifyTypes != 4
|
|
ORDER BY lngfile", array());
|
|
|
|
// Check that moderators do exist!
|
|
if ($mobdb->num_rows() == 0)
|
|
outputRPCResult(false, $txt['rtm11']);
|
|
|
|
// Send every moderator an email.
|
|
while ($row = $mobdb->fetch_assoc())
|
|
{
|
|
loadLanguage('Post', empty($row['lngfile']) || empty($modSettings['userLanguage']) ? $language : $row['lngfile'], false);
|
|
|
|
// Send it to the moderator.
|
|
sendmail($row['emailAddress'], $txt['rtm3'] . ': ' . $subject . ' ' . $txt['rtm4'] . ' ' . $posterName,
|
|
sprintf($txt['rtm_email1'], $subject) . ' ' . $posterName . ' ' . $txt['rtm_email2'] . ' ' . (empty($user_info['id']) ? $txt['guest'] . ' (' . $user_info['ip'] . ')' : $reporterName) . ' ' . $txt['rtm_email3'] . ":\n\n" .
|
|
$scripturl . '?topic=' . $topic . '.msg' . $id_msg . '#msg' . $id_msg . "\n\n" .
|
|
$txt['rtm_email_comment'] . ":\n" .
|
|
$reason . "\n\n" .
|
|
$txt[130], $user_info['email']);
|
|
}
|
|
$mobdb->free_result();
|
|
|
|
outputRPCResult(true);
|
|
}
|