'create-wikis.php',
'MEDIAWIKI_CREATE_IMAGEDIR' => 'create-imagedirs.php'
);
function __construct ($id=0) {
parent::__construct($id) ;
$this->name = 'mediawiki' ;
$this->text = _('Mediawiki') ; // To show in the tabs, use...
$this->pkg_desc =
_('This plugin allows each project to embed Mediawiki under a tab.');
$this->_addHook('groupmenu') ; // To put into the project tabs
$this->_addHook('groupisactivecheckbox') ; // The "use ..." checkbox in editgroupinfo
$this->_addHook('groupisactivecheckboxpost'); //
$this->_addHook('project_public_area');
$this->_addHook('role_get');
$this->_addHook('role_normalize');
$this->_addHook('role_unlink_project');
$this->_addHook('role_translate_strings');
$this->_addHook('role_has_permission');
$this->_addHook('role_get_setting');
$this->_addHook('list_roles_by_permission');
$this->_addHook('project_admin_plugins'); // to show up in the admin page for group
$this->_addHook('clone_project_from_template');
$this->_addHook('group_delete');
$this->_addHook('activity');
}
function process() {
echo html_e('h1', array(), 'Mediawiki');
echo $this->getPluginInfo()->getpropVal('answer');
}
function &getPluginInfo() {
if (!is_a($this->pluginInfo, 'MediaWikiPluginInfo')) {
require_once 'MediaWikiPluginInfo.class.php';
$this->pluginInfo = new MediaWikiPluginInfo($this);
}
return $this->pluginInfo;
}
function CallHook($hookname, &$params) {
if (isset($params['group_id'])) {
$group_id=$params['group_id'];
} elseif (isset($params['group'])) {
$group_id=$params['group'];
} else {
$group_id=null;
}
if ($hookname == 'groupmenu') {
$project = group_get_object($group_id);
if (!$project || !is_object($project)) {
return;
}
if ($project->isError()) {
return;
}
if ($project->usesPlugin($this->name)) {
$params['TITLES'][] = $this->text;
$params['DIRS'][] = util_make_uri('/plugins/'.$this->name.'/wiki/'.$project->getUnixName().'/index.php');
if (session_loggedin()) {
$user = session_get_user();
$userperm = $project->getPermission();
if ($userperm->isAdmin()) {
$params['ADMIN'][] = util_make_uri('/plugins/'.$this->name.'/plugin_admin.php?group_id='.$project->getID());
}
}
$params['TOOLTIPS'][] = _('Mediawiki Space');
}
(($params['toptab'] == $this->name) ? $params['selected'] = (count($params['TITLES'])-1) : '' );
} elseif ($hookname == 'project_public_area') {
$project = group_get_object($group_id);
if (!$project || !is_object($project)) {
return;
}
if ($project->isError()) {
return;
}
if ( $project->usesPlugin($this->name)) {
$params['result'] .= '
';
$params['result'] .= util_make_link('/plugins/'.$this->name.'/wiki/'.$project->getUnixName().'/index.php',
html_abs_image(util_make_url('/plugins/'.$this->name.'/wiki/'.$project->getUnixName().'/skins/monobook/wiki.png'),'20','20',array('alt'=>'Mediawiki')).
' '.'Mediawiki');
$params['result'] .= '
';
}
} elseif ($hookname == 'role_get') {
$role =& $params['role'];
// Read access
$right = new PluginSpecificRoleSetting($role,
'plugin_mediawiki_read');
$right->SetAllowedValues(array('0', '1'));
$right->SetDefaultValues(array('Admin' => '1',
'Senior Developer' => '1',
'Junior Developer' => '1',
'Doc Writer' => '1',
'Support Tech' => '1'));
// Edit privileges
$right = new PluginSpecificRoleSetting($role,
'plugin_mediawiki_edit');
$right->SetAllowedValues(array('0', '1', '2', '3'));
$right->SetDefaultValues(array('Admin' => '3',
'Senior Developer' => '2',
'Junior Developer' => '1',
'Doc Writer' => '3',
'Support Tech' => '0'));
// File upload privileges
$right = new PluginSpecificRoleSetting($role,
'plugin_mediawiki_upload');
$right->SetAllowedValues(array('0', '1', '2')) ;
$right->SetDefaultValues(array('Admin' => '2',
'Senior Developer' => '2',
'Junior Developer' => '1',
'Doc Writer' => '2',
'Support Tech' => '0'));
// Administrative tasks
$right = new PluginSpecificRoleSetting($role,
'plugin_mediawiki_admin');
$right->SetAllowedValues(array('0', '1'));
$right->SetDefaultValues(array('Admin' => '1',
'Senior Developer' => '0',
'Junior Developer' => '0',
'Doc Writer' => '0',
'Support Tech' => '0'));
} elseif ($hookname == 'role_normalize') {
$role =& $params['role'];
$new_pa =& $params['new_pa'];
$projects = $role->getLinkedProjects();
foreach ($projects as $p) {
$role->normalizePermsForSection($new_pa, 'plugin_mediawiki_read', $p->getID());
$role->normalizePermsForSection($new_pa, 'plugin_mediawiki_edit', $p->getID());
$role->normalizePermsForSection($new_pa, 'plugin_mediawiki_upload', $p->getID());
$role->normalizePermsForSection($new_pa, 'plugin_mediawiki_admin', $p->getID());
}
} elseif ($hookname == 'role_unlink_project') {
$role =& $params['role'];
$project =& $params['project'];
$settings = array('plugin_mediawiki_read', 'plugin_mediawiki_edit', 'plugin_mediawiki_upload', 'plugin_mediawiki_admin');
foreach ($settings as $s) {
db_query_params('DELETE FROM pfo_role_setting WHERE role_id=$1 AND section_name=$2 AND ref_id=$3',
array($role->getID(),
$s,
$project->getID()));
}
} elseif ($hookname == 'role_translate_strings') {
$right = new PluginSpecificRoleSetting($role,
'plugin_mediawiki_read');
$right->setDescription(_('Mediawiki read access'));
$right->setValueDescriptions(array('0' => _('No reading'),
'1' => _('Read access')));
$right = new PluginSpecificRoleSetting($role,
'plugin_mediawiki_edit');
$right->setDescription (_('Mediawiki write access')) ;
$right->setValueDescriptions(array('0' => _('No editing'),
'1' => _('Edit existing pages only'),
'2' => _('Edit and create pages'),
'3' => _('Edit, create, move, delete pages')));
$right = new PluginSpecificRoleSetting($role,
'plugin_mediawiki_upload');
$right->setDescription(_('Mediawiki file upload')) ;
$right->setValueDescriptions(array('0' => _('No uploading'),
'1' => _('Upload permitted'),
'2' => _('Upload and re-upload')));
$right = new PluginSpecificRoleSetting ($role,
'plugin_mediawiki_admin') ;
$right->setDescription (_('Mediawiki administrative tasks')) ;
$right->setValueDescriptions (array ('0' => _('No administrative access'),
'1' => _('Edit interface, import XML dumps'))) ;
} elseif ($hookname == "role_get_setting") {
$role = $params['role'];
$reference = $params['reference'];
$value = $params['value'];
switch ($params['section']) {
case 'plugin_mediawiki_read':
if ($role->hasPermission('project_admin', $reference)) {
$params['result'] = 1;
} else {
$params['result'] = $value;
}
break ;
case 'plugin_mediawiki_edit':
if ($role->hasPermission('project_admin', $reference)) {
$params['result'] = 3;
} else {
$params['result'] = $value;
}
break ;
case 'plugin_mediawiki_upload':
if ($role->hasPermission('project_admin', $reference)) {
$params['result'] = 2;
} else {
$params['result'] = $value;
}
break ;
case 'plugin_mediawiki_admin':
if ($role->hasPermission('project_admin', $reference)) {
$params['result'] = 1;
} else {
$params['result'] = $value;
}
break ;
}
} elseif ($hookname == "role_has_permission") {
$value = $params['value'];
switch ($params['section']) {
case 'plugin_mediawiki_read':
switch ($params['action']) {
case 'read':
default:
$params['result'] |= ($value >= 1);
break;
}
break ;
case 'plugin_mediawiki_edit':
switch ($params['action']) {
case 'editexisting':
$params['result'] |= ($value >= 1);
break;
case 'editnew':
$params['result'] |= ($value >= 2);
break;
case 'editmove':
$params['result'] |= ($value >= 3);
break;
}
break ;
case 'plugin_mediawiki_upload':
switch ($params['action']) {
case 'upload':
$params['result'] |= ($value >= 1);
break;
case 'reupload':
$params['result'] |= ($value >= 2);
break;
}
break ;
case 'plugin_mediawiki_admin':
switch ($params['action']) {
case 'admin':
default:
$params['result'] |= ($value >= 1);
break;
}
break ;
}
} elseif ($hookname == 'list_roles_by_permission') {
switch ($params['section']) {
case 'plugin_mediawiki_read':
switch ($params['action']) {
case 'read':
default:
$params['qpa'] = db_construct_qpa($params['qpa'], ' AND perm_val >= 1');
break;
}
break ;
case 'plugin_mediawiki_edit':
switch ($params['action']) {
case 'editexisting':
$params['qpa'] = db_construct_qpa($params['qpa'], ' AND perm_val >= 1');
break;
case 'editnew':
$params['qpa'] = db_construct_qpa($params['qpa'], ' AND perm_val >= 2');
break;
case 'editmove':
$params['qpa'] = db_construct_qpa($params['qpa'], ' AND perm_val >= 3');
break;
}
break ;
case 'plugin_mediawiki_upload':
switch ($params['action']) {
case 'upload':
$params['qpa'] = db_construct_qpa($params['qpa'], ' AND perm_val >= 1');
break;
case 'reupload':
$params['qpa'] = db_construct_qpa($params['qpa'], ' AND perm_val >= 2');
break;
}
break ;
case 'plugin_mediawiki_admin':
switch ($params['action']) {
case 'admin':
default:
$params['qpa'] = db_construct_qpa($params['qpa'], ' AND perm_val >= 1');
break;
}
break ;
}
} elseif ($hookname == 'project_admin_plugins') {
$group_id = $params['group_id'];
$group = group_get_object($group_id);
if ($group->usesPlugin($this->name))
echo util_make_link('/plugins/mediawiki/plugin_admin.php?group_id='. $group->getID(), _('MediaWiki Plugin admin')).'
';
} elseif ($hookname == 'clone_project_from_template') {
$template = $params['template'];
$project = $params['project'];
$id_mappings = $params['id_mappings'];
$sections = array('plugin_mediawiki_read', 'plugin_mediawiki_edit', 'plugin_mediawiki_upload', 'plugin_mediawiki_admin');
foreach ($template->getRoles() as $oldrole) {
$newrole = RBACEngine::getInstance()->getRoleById ($id_mappings['role'][$oldrole->getID()]);
$oldsettings = $oldrole->getSettingsForProject ($template);
foreach ($sections as $section) {
if (isset ($oldsettings[$section][$template->getID()])) {
$newrole->setSetting ($section, $project->getID(), $oldsettings[$section][$template->getID()]);
}
}
}
} elseif ($hookname == 'group_delete') {
$projectId = $params['group_id'];
$projectObject = group_get_object($projectId);
if ($projectObject->usesPlugin($this->name)) {
//delete the files and db schema
$schema = 'plugin_mediawiki_'.$projectObject->getUnixName();
// Sanitize schema name
$schema = strtr($schema, '-', '_');
db_query_params('drop schema $1 cascade', array($schema));
exec('/bin/rm -rf '.forge_get_config('projects_path', 'mediawiki').'/'.$projectObject->getUnixName());
}
} elseif ($hookname == 'activity') {
$group_id = $params['group'];
$project = group_get_object($group_id);
if (!$project->usesPlugin($this->name)) {
return false;
}
if (in_array($this->name, $params['show']) || (count($params['show']) < 1)) {
$protocol = forge_get_config('use_ssl') ? 'https://' : 'http://';
$script_url = $protocol.forge_get_config('web_host').forge_get_config('url_prefix').'/plugins/'.$this->name.'/wiki/'.$project->getUnixName().'/api.php'
.'?action=query'
.'&list=recentchanges'
.'&format=json'
.'&rcstart='.date('Y-m-d\TH:i:s\Z',$params['end'])
.'&rcend='.date('Y-m-d\TH:i:s\Z',$params['begin']);
$filename = tempnam('/tmp', 'mediawikilog');
$f = fopen($filename, 'w');
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $script_url);
curl_setopt($ch, CURLOPT_FILE, $f);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_COOKIE, @$_SERVER['HTTP_COOKIE']); // for session validation
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // for session validation
curl_setopt($ch, CURLOPT_HTTPHEADER,
array('X-Forwarded-For: '.$_SERVER['REMOTE_ADDR'])); // for session validation
$body = curl_exec($ch);
if ($body === false) {
$this->setError(curl_error($ch));
}
curl_close($ch);
fclose($f); // flush buffer
$jsoncontent = (array)json_decode(file_get_contents($filename), true);
unlink($filename);
if (isset($jsoncontent['query']['recentchanges'])) {
foreach($jsoncontent['query']['recentchanges'] as $recentchanges) {
$result = array();
$result['section'] = 'mediawiki';
$result['group_id'] = $group_id;
$result['activity_date'] = strtotime($recentchanges['timestamp']);
$result['link'] = forge_get_config('url_prefix').'plugins/'.$this->name.'/wiki/'.$project->getUnixName().'/index.php/'.str_replace(' ', '_',
$recentchanges['title']);
$title = 'Mediawiki ';
if ($recentchanges['type'] == 'new') {
$title .= _('new element created')._(': ');
} else if ($recentchanges['type'] == 'edit') {
$title .= _('modified element')._(': ');
} else if ($recentchanges['type'] == 'log') {
$title .= _('stored element')._(': ');
}
$title .= $recentchanges['title'];
$result['title'] = $title;
$params['results'][] = $result;
}
}
}
if (!in_array($this->name, $params['ids'])) {
$params['ids'][] = $this->name;
$params['texts'][] = _('Mediawiki Changes');
}
return true;
}
}
function groupisactivecheckboxpost(&$params) {
if (!parent::groupisactivecheckboxpost($params))
return false;
if (getIntFromRequest('use_mediawiki') == 1) {
$systasksq = new SystasksQ();
$group_id = $params['group'];
$systasksq->add($this->getID(), 'MEDIAWIKI_CREATE_WIKI', $group_id);
$systasksq->add($this->getID(), 'MEDIAWIKI_CREATE_IMAGEDIR', $group_id);
}
return true;
}
}
// Local Variables:
// mode: php
// c-file-style: "bsd"
// End: