3 * Copyright (C) 2010 Roland Mas, Olaf Lenz
5 * This file is part of FusionForge.
7 * FusionForge is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * FusionForge is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with FusionForge; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 /** This contains the local settings for Mediawiki as used in the
22 * Mediawiki plugin of FusionForge.
25 require_once dirname(__FILE__) . '/../../../www/env.inc.php';
26 require_once $gfcommon.'include/pre.php';
28 $IP = forge_get_config('master_path', 'mediawiki');
30 if (!isset ($fusionforgeproject)) {
31 $fusionforgeproject = 'siteadmin' ;
33 $exppath = explode ('/', $_SERVER['PHP_SELF']) ;
35 # determine $fusionforgeproject from the URL
36 while (count ($exppath) >= 4) {
37 if (($exppath[0] == 'plugins') &&
38 ($exppath[1] == 'mediawiki') &&
39 ($exppath[2] == 'wiki') &&
40 (($exppath[4] == 'index.php') || ($exppath[4] == 'api.php'))
42 $fusionforgeproject = $exppath[3] ;
45 array_shift ($exppath) ;
49 $gconfig_dir = forge_get_config('mwdata_path', 'mediawiki');
50 $project_dir = forge_get_config('projects_path', 'mediawiki') . "/"
51 . $fusionforgeproject ;
53 if (!is_dir($project_dir)) {
54 exit_error (sprintf(_('Mediawiki for project %s not created yet, please wait for a few minutes.'), $fusionforgeproject)) ;
58 $path = array( $IP, "$IP/includes", "$IP/languages" );
59 set_include_path( implode( PATH_SEPARATOR, $path ) . PATH_SEPARATOR . get_include_path() );
61 require_once( "$IP/includes/DefaultSettings.php" );
63 if ( $wgCommandLineMode ) {
64 if ( isset( $_SERVER ) && array_key_exists( 'REQUEST_METHOD', $_SERVER ) ) {
65 die( "This script must be run from the command line\n" );
68 $g = group_get_object_by_name($fusionforgeproject) ;
69 $wgSitename = $g->getPublicName() . " Wiki";
70 $wgScriptPath = "/plugins/mediawiki/wiki/$fusionforgeproject" ;
72 $wgEmergencyContact = forge_get_config('admin_email');
73 $wgPasswordSender = forge_get_config('admin_email');
76 $wgDBserver = forge_get_config('database_host') ;
77 $wgDBname = forge_get_config('database_name');
78 $wgDBuser = forge_get_config('database_user') ;
79 $wgDBpassword = forge_get_config('database_password') ;
80 $wgDBadminuser = forge_get_config('database_user') ;
81 $wgDBadminpassword = forge_get_config('database_password') ;
82 $wgDBport = forge_get_config('database_port') ;
83 $wgDBmwschema = str_replace ('-', '_', "plugin_mediawiki_$fusionforgeproject") ;
84 $wgDBts2schema = str_replace ('-', '_', "plugin_mediawiki_$fusionforgeproject") ;
85 $wgMainCacheType = CACHE_NONE;
86 $wgMemCachedServers = array();
88 $wgEnableUploads = forge_get_config('enable_uploads', 'mediawiki');
89 $wgUploadDirectory = "$project_dir/images";
90 $wgUseImageMagick = true;
91 $wgImageMagickConvertCommand = "/usr/bin/convert";
92 $wgLocalInterwiki = $wgSitename;
93 $wgShowExceptionDetails = true ;
95 $wgLanguageCode = strtolower(forge_get_config('default_country_code'));
97 $wgDefaultSkin = 'fusionforge';
99 $GLOBALS['sys_dbhost'] = forge_get_config('database_host') ;
100 $GLOBALS['sys_dbport'] = forge_get_config('database_port') ;
101 $GLOBALS['sys_dbname'] = forge_get_config('database_name') ;
102 $GLOBALS['sys_dbuser'] = forge_get_config('database_user') ;
103 $GLOBALS['sys_dbpasswd'] = forge_get_config('database_password') ;
104 $GLOBALS['sys_plugins_path'] = forge_get_config('plugins_path') ;
105 $GLOBALS['sys_urlprefix'] = forge_get_config('url_prefix') ;
106 $GLOBALS['sys_use_ssl'] = forge_get_config('use_ssl') ;
107 $GLOBALS['sys_default_domain'] = forge_get_config('web_host') ;
108 $GLOBALS['sys_custom_path'] = forge_get_config('custom_path') ;
109 $GLOBALS['gfwww'] = $gfwww ;
110 $GLOBALS['gfplugins'] = $gfplugins ;
111 $GLOBALS['sys_lang'] = forge_get_config('default_language') ;
112 $GLOBALS['sys_urlroot'] = forge_get_config('url_root');
113 $GLOBALS['sys_session_key'] = forge_get_config('session_key');
114 $GLOBALS['sys_session_expire'] = forge_get_config('session_expire');
115 $GLOBALS['REMOTE_ADDR'] = getStringFromServer('REMOTE_ADDR') ;
116 $GLOBALS['HTTP_USER_AGENT'] = getStringFromServer('HTTP_USER_AGENT') ;
118 require_once("$IP/includes/Exception.php");
119 require_once("$IP/includes/db/Database.php");
120 require_once("$IP/includes/db/DatabasePostgres.php");
121 class DatabaseForge extends DatabasePostgres {
122 function DatabaseForge($server=false, $user=false, $password=false,
123 $dbName=false, $failFunction=false, $flags=0) {
126 $wgDBtype = "postgres";
127 return DatabasePostgres::DatabasePostgres($server, $user,
128 $password, $dbName, $failFunction, $flags);
131 function tableName($name) {
134 return 'public.plugin_mediawiki_interwiki';
136 return DatabasePostgres::tableName($name);
141 function FusionForgeRoleToMediawikiGroupName ($role, $project) {
142 if ($role instanceof RoleAnonymous) {
144 } elseif ($role instanceof RoleLoggedIn) {
146 } elseif ($role->getHomeProject() == NULL) {
147 return sprintf ('ForgeRole:%s [global]',
149 } elseif ($role->getHomeProject()->getID() != $project->getID()) {
150 return sprintf ('ForgeRole:%s [project %s]',
152 $role->getHomeProject()->getUnixName()) ;
154 return sprintf ('ForgeRole:%s',
159 function FusionForgeMWAuth( $user, &$result ) {
160 global $fusionforgeproject, $wgGroupPermissions ;
164 if (session_loggedin()) {
165 $u = session_get_user();
166 $g = group_get_object_by_name ($fusionforgeproject) ;
168 $mwname = ucfirst($u->getUnixName ()) ;
169 $mwu = User::newFromName ($mwname);
170 if($mwu->getID() == 0) {
171 $mwu->addToDatabase ();
172 $mwu->setPassword (User::randomPassword());
173 $mwu->setRealName ($u->getRealName ()) ;
175 $mwu->loadFromDatabase ();
177 $user->mId=$mwu->getID();
178 $user->loadFromId() ;
180 $user->loadGroups() ;
181 $current_groups = $user->getGroups() ;
184 $available_roles = RBACEngine::getInstance()->getAvailableRoles() ;
186 foreach ($available_roles as $r) {
187 $linked_projects = $r->getLinkedProjects () ;
189 foreach ($linked_projects as $lp) {
190 if ($lp->getID() == $g->getID()) {
196 $perm =& $g->getPermission ();
197 $r = $u->getRole($g) ;
198 if (isset ($r) && $r && !$r->isError()) {
203 // Sync MW groups for current user with FF roles
205 foreach ($rs as $r) {
206 $rnames[] = FusionForgeRoleToMediawikiGroupName ($r, $g) ;
208 $role_groups = preg_grep ("/^ForgeRole:/", $current_groups) ;
210 foreach ($rnames as $rname) {
211 if (!in_array ($rname, $current_groups)) {
212 $user->addGroup ($rname) ;
215 foreach ($role_groups as $cg) {
216 if (!in_array ($cg, $rnames)) {
217 $user->removeGroup ($cg) ;
221 $user->setCookies ();
222 $user->saveSettings ();
232 function SetupPermissionsFromRoles () {
233 global $fusionforgeproject, $wgGroupPermissions ;
235 $g = group_get_object_by_name ($fusionforgeproject) ;
236 // Setup rights for all roles referenced by project
237 $rs = $g->getRoles() ;
238 foreach ($rs as $r) {
239 $gr = FusionForgeRoleToMediawikiGroupName ($r, $g) ;
242 $wgGroupPermissions[$gr]['read'] = $r->hasPermission ('plugin_mediawiki_read', $g->getID()) ;
244 // Day-to-day edit privileges
245 $wgGroupPermissions[$gr]['edit'] = $r->hasPermission ('plugin_mediawiki_edit', $g->getID(), 'editexisting') ;
246 $wgGroupPermissions[$gr]['writeapi'] = $r->hasPermission ('plugin_mediawiki_edit', $g->getID(), 'editexisting') ;
247 $wgGroupPermissions[$gr]['createpage'] = $r->hasPermission ('plugin_mediawiki_edit', $g->getID(), 'editnew') ;
248 $wgGroupPermissions[$gr]['createtalk'] = $r->hasPermission ('plugin_mediawiki_edit', $g->getID(), 'editnew') ;
249 $wgGroupPermissions[$gr]['minoredit'] = $r->hasPermission ('plugin_mediawiki_edit', $g->getID(), 'editnew') ;
250 $wgGroupPermissions[$gr]['move'] = $r->hasPermission ('plugin_mediawiki_edit', $g->getID(), 'editmove') ;
251 $wgGroupPermissions[$gr]['move-subpages'] = $r->hasPermission ('plugin_mediawiki_edit', $g->getID(), 'editmove') ;
252 $wgGroupPermissions[$gr]['move-rootuserpages'] = $r->hasPermission ('plugin_mediawiki_edit', $g->getID(), 'editmove') ;
253 $wgGroupPermissions[$gr]['delete'] = $r->hasPermission ('plugin_mediawiki_edit', $g->getID(), 'editmove') ;
254 $wgGroupPermissions[$gr]['undelete'] = $r->hasPermission ('plugin_mediawiki_edit', $g->getID(), 'editmove') ;
256 // File upload privileges
257 $wgGroupPermissions[$gr]['upload'] = $r->hasPermission ('plugin_mediawiki_upload', $g->getID(), 'upload') ;
258 $wgGroupPermissions[$gr]['reupload-own'] = $r->hasPermission ('plugin_mediawiki_upload', $g->getID(), 'upload') ;
259 $wgGroupPermissions[$gr]['reupload'] = $r->hasPermission ('plugin_mediawiki_upload', $g->getID(), 'reupload') ;
260 $wgGroupPermissions[$gr]['reupload-shared'] = $r->hasPermission ('plugin_mediawiki_upload', $g->getID(), 'reupload') ;
261 $wgGroupPermissions[$gr]['upload_by_url'] = $r->hasPermission ('plugin_mediawiki_upload', $g->getID(), 'reupload') ;
263 // Administrative tasks
264 $wgGroupPermissions[$gr]['editinterface'] = $r->hasPermission ('plugin_mediawiki_admin', $g->getID()) ;
265 $wgGroupPermissions[$gr]['import'] = $r->hasPermission ('plugin_mediawiki_admin', $g->getID()) ;
266 $wgGroupPermissions[$gr]['importupload'] = $r->hasPermission ('plugin_mediawiki_admin', $g->getID()) ;
267 $wgGroupPermissions[$gr]['siteadmin'] = $r->hasPermission ('plugin_mediawiki_admin', $g->getID()) ;
270 $rs = RBACEngine::getInstance()->getGlobalRoles();
271 foreach ($rs as $r) {
272 $gr = FusionForgeRoleToMediawikiGroupName ($r, $g) ;
274 // Interwiki management restricted to forge admins
275 $wgGroupPermissions[$gr]['interwiki'] = $r->hasGlobalPermission ('forge_admin') ;
279 function NoLinkOnMainPage(&$personal_urls){
280 unset($personal_urls['anonlogin']);
281 unset($personal_urls['anontalk']);
282 unset($personal_urls['logout']);
283 unset($personal_urls['login']);
286 $wgHooks['PersonalUrls'][]='NoLinkOnMainPage';
288 if (isset($_SERVER['SERVER_SOFTWARE'])) {
289 class SpecialForgeRedir extends SpecialPage {
290 var $dstappendself = false;
292 function getTitle() {
293 return 'SpecialForgeRedir';
296 function getRedirect() {
300 function getRedirectQuery() {
304 function getFullUrl() {
306 if ($this->dstappendself) {
307 $u .= urlencode(getStringFromServer('REQUEST_URI'));
309 return util_make_url($u);
313 class SpecialForgeRedirLogin extends SpecialForgeRedir {
314 var $dstappendself = true;
315 var $dst = '/account/login.php?return_to=';
318 class SpecialForgeRedirCreateAccount extends SpecialForgeRedir {
319 var $dst = '/account/register.php';
322 class SpecialForgeRedirResetPass extends SpecialForgeRedir {
323 var $dst = '/account/lostpw.php';
326 class SpecialForgeRedirLogout extends SpecialForgeRedir {
327 var $dstappendself = true;
328 var $dst = '/account/logout.php?return_to=';
331 function DisableLogInOut(&$mList) {
332 $mList['Userlogin'] = 'SpecialForgeRedirLogin';
333 $mList['CreateAccount'] = 'SpecialForgeRedirCreateAccount';
334 $mList['Resetpass'] = 'SpecialForgeRedirResetPass';
335 $mList['Userlogout'] = 'SpecialForgeRedirLogout';
338 $GLOBALS['wgHooks']['SpecialPage_initList'][] = 'DisableLogInOut';
341 $GLOBALS['wgHooks']['UserLoadFromSession'][]='FusionForgeMWAuth';
343 $zeroperms = array ('read', 'writeapi', 'edit', 'move-subpages', 'move-rootuserpages', 'reupload-shared', 'createaccount');
345 foreach ($zeroperms as $i) {
346 $wgGroupPermissions['user'][$i] = false;
347 $wgGroupPermissions['*'][$i] = false;
350 SetupPermissionsFromRoles();
352 $wgFavicon = '/images/icon.png' ;
353 $wgBreakFrames = false ;
354 ini_set ('memory_limit', '50M') ;
356 // LOAD THE SITE-WIDE AND PROJECT-SPECIFIC EXTRA-SETTINGS
357 if (is_file(forge_get_config('config_path')."/plugins/mediawiki/LocalSettings.php")) {
358 include(forge_get_config('config_path')."/plugins/mediawiki/LocalSettings.php");
361 // debian style system-wide mediawiki extensions
362 if (is_file("/etc/mediawiki-extensions/extensions.php")) {
363 include( "/etc/mediawiki-extensions/extensions.php" );
366 if (file_exists("$wgUploadDirectory/.wgLogo.png")) {
367 $wgLogo = "$wgScriptPath/images/.wgLogo.png";
370 // forge global settings
371 if (is_file("$gconfig_dir/ForgeSettings.php")) {
372 include ("$gconfig_dir/ForgeSettings.php") ;
374 // project specific settings
375 if (is_file("$project_dir/ProjectSettings.php")) {
376 include ("$project_dir/ProjectSettings.php") ;
381 // c-file-style: "bsd"