<?php /* Question2Answer by Gideon Greenspan and contributors http://www.question2answer.org/ File: qa-include/qa-external-users-joomla.php Description: External user functions for basic Joomla integration This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. More about this license: http://www.question2answer.org/license.php */ if (!defined('QA_VERSION')) { // don't allow this page to be requested directly from browser header('Location: ../'); exit; } function qa_get_mysql_user_column_type() { return "INT"; } function qa_get_login_links($relative_url_prefix, $redirect_back_to_url) { $jhelper = new qa_joomla_helper(); $config_urls = $jhelper->trigger_get_urls_event(); return array( 'login' => $config_urls['login'], 'register' => $config_urls['reg'], 'logout' => $config_urls['logout'] ); } function qa_get_logged_in_user() { $jhelper = new qa_joomla_helper(); $user = $jhelper->get_user(); $config_urls = $jhelper->trigger_get_urls_event(); if ($user && !$user->guest) { $access = $jhelper->trigger_access_event($user); $level = QA_USER_LEVEL_BASIC; if ($access['post']) { $level = QA_USER_LEVEL_APPROVED; } if ($access['edit']) { $level = QA_USER_LEVEL_EDITOR; } if ($access['mod']) { $level = QA_USER_LEVEL_MODERATOR; } if ($access['admin']) { $level = QA_USER_LEVEL_ADMIN; } if ($access['super'] || $user->get('isRoot')) { $level = QA_USER_LEVEL_SUPER; } $teamGroup = $jhelper->trigger_team_group_event($user); $qa_user = array( 'userid' => $user->id, 'publicusername' => $user->username, 'email' => $user->email, 'level' => $level, ); if ($user->block) { $qa_user['blocked'] = true; } return $qa_user; } return null; } function qa_get_user_email($userid) { $jhelper = new qa_joomla_helper(); $user = $jhelper->get_user($userid); if ($user) { return $user->email; } return null; } function qa_get_userids_from_public($publicusernames) { $output = array(); if (count($publicusernames)) { $jhelper = new qa_joomla_helper(); foreach ($publicusernames as $username) { $output[$username] = $jhelper->get_userid($username); } } return $output; } function qa_get_public_from_userids($userids) { $output = array(); if (count($userids)) { $jhelper = new qa_joomla_helper(); foreach ($userids as $userID) { $user = $jhelper->get_user($userID); $output[$userID] = $user->username; } } return $output; } function qa_get_logged_in_user_html($logged_in_user, $relative_url_prefix) { $publicusername = $logged_in_user['publicusername']; return '<a href="' . qa_path_html('user/' . $publicusername) . '" class="qa-user-link">' . htmlspecialchars($publicusername) . '</a>'; } function qa_get_users_html($userids, $should_include_link, $relative_url_prefix) { $useridtopublic = qa_get_public_from_userids($userids); $usershtml = array(); foreach ($userids as $userid) { $publicusername = $useridtopublic[$userid]; $usershtml[$userid] = htmlspecialchars($publicusername); if ($should_include_link) { $usershtml[$userid] = '<a href="' . qa_path_html('user/' . $publicusername) . '" class="qa-user-link">' . $usershtml[$userid] . '</a>'; } } return $usershtml; } function qa_avatar_html_from_userid($userid, $size, $padding) { $jhelper = new qa_joomla_helper(); $avatarURL = $jhelper->trigger_get_avatar_event($userid, $size); $avatarHTML = $avatarURL ? "<img src='{$avatarURL}' class='qa-avatar-image' alt=''/>" : ''; if ($padding) { // If $padding is true, the HTML you return should render to a square of $size x $size pixels, even if the avatar is not square. $avatarHTML = "<span style='display:inline-block; width:{$size}px; height:{$size}px; overflow:hidden;'>{$avatarHTML}</span>"; } return $avatarHTML; } function qa_user_report_action($userid, $action) { $jhelper = new qa_joomla_helper(); $jhelper->trigger_log_event($userid, $action); } /** * Link to Joomla app. */ class qa_joomla_helper { private $app; public function __construct() { $this->find_joomla_path(); $this->load_joomla_app(); } private function find_joomla_path() { // JPATH_BASE must be defined for Joomla to work if (!defined('JPATH_BASE')) { define('JPATH_BASE', QA_FINAL_JOOMLA_INTEGRATE_PATH); } } private function load_joomla_app() { // This will define the _JEXEC constant that will allow us to access the rest of the Joomla framework if (!defined('_JEXEC')) { define('_JEXEC', 1); } require_once(JPATH_BASE . '/includes/defines.php'); require_once(JPATH_BASE . '/includes/framework.php'); // Instantiate the application. $this->app = JFactory::getApplication('site'); // Initialise the application. $this->app->initialise(); } public function get_app() { return $this->app; } public function get_user($userid = null) { return JFactory::getUser($userid); } public function get_userid($username) { return JUserHelper::getUserId($username); } public function trigger_access_event($user) { return $this->trigger_joomla_event('onQnaAccess', array($user)); } public function trigger_team_group_event($user) { return $this->trigger_joomla_event('onTeamGroup', array($user)); } public function trigger_get_urls_event() { return $this->trigger_joomla_event('onGetURLs', array()); } public function trigger_get_avatar_event($userid, $size) { return $this->trigger_joomla_event('onGetAvatar', array($userid, $size)); } public function trigger_log_event($userid, $action) { return $this->trigger_joomla_event('onWriteLog', array($userid, $action), false); } private function trigger_joomla_event($event, $args = array(), $expectResponse = true) { JPluginHelper::importPlugin('q2a'); $dispatcher = JEventDispatcher::getInstance(); $results = $dispatcher->trigger($event, $args); if ($expectResponse && (!is_array($results) || count($results) < 1)) { // no Q2A plugins installed in Joomla, so we'll have to resort to defaults $results = $this->default_response($event, $args); } return array_pop($results); } private function default_response($event, $args) { return array(qa_joomla_default_integration::$event($args)); } } /** * Implements the same methods as a Joomla plugin would implement, but called locally within Q2A. * This is intended as a set of default actions in case no Joomla plugin has been installed. It's * recommended to install the Joomla QAIntegration plugin for additional user-access control. */ class qa_joomla_default_integration { /** * If you're relying on the defaults, you must make sure that your Joomla instance has the following pages configured. */ public static function onGetURLs() { $login = 'index.php?option=com_users&view=login'; $logout = 'index.php?option=com_users&task=user.logout&' . JSession::getFormToken() . '=1&return=' . urlencode(base64_encode('index.php')); $reg = 'index.php?option=com_users&view=registration'; return array( // undo Joomla's escaping of characters since Q2A also escapes 'login' => htmlspecialchars_decode(JRoute::_($login)), 'logout' => htmlspecialchars_decode(JRoute::_($logout)), 'reg' => htmlspecialchars_decode(JRoute::_($reg)), 'denied' => htmlspecialchars_decode(JRoute::_('index.php')), ); } /** * Return the access levels available to the user. A proper Joomla plugin would allow you to fine tune this in as much * detail as you needed, but this default method can only look at the core Joomla system permissions and try to map * those to the Q2A perms. Not ideal; enough to get started, but recommend switching to the Joomla plugin if possible. */ public static function onQnaAccess(array $args) { list($user) = $args; return array( 'view' => true, 'post' => !($user->guest || $user->block), 'edit' => $user->authorise('core.edit'), 'mod' => $user->authorise('core.edit.state'), 'admin' => $user->authorise('core.manage'), 'super' => $user->authorise('core.admin') || $user->get('isRoot'), ); } /** * Return the group name (if any) that was responsible for granting the user access to the given view level. * For this default method, we just won't return anything. */ public static function onTeamGroup($args) { list($user) = $args; return null; } /** * This method would be used to ask Joomla to supply an avatar for a user. * For this default method, we just won't do anything. */ public static function onGetAvatar($args) { list($userid, $size) = $args; return null; } /** * This method would be used to notify Joomla of a Q2A action, eg so it could write a log entry. * For this default method, we just won't do anything. */ public static function onWriteLog($args) { list($userid, $action) = $args; return null; } }