LPS:Nastavení a úpravy Mediawiki pro support.zcu.cz (OLD)

Z Support
(Rozdíly mezi verzemi)
Přejít na: navigace, hledání
m (Rozšíření: přidána dokumentace pro graficke zobrazovani kategorii)
Řádka 617: Řádka 617:
  
 
Žádné z rozšíření nesmí obsahovat prázdný řádek, který je mimo PHP kód. První řádek musí začínat řetězcem <tt>&lt;?php</tt> a poslední řádek končit <tt>?&gt;</tt> (neodřádkovává se). V opačném případě je problém se stránkou [[Speciální:Recentchanges]], tuto stránku je vhodné zkontrolovat například [http://feedvalidator.org/check.cgi?url=http%3A%2F%2Fsupport.zcu.cz%2Findex.php%3Ftitle%3DSpeci%25C3%25A1ln%25C3%25AD%253ARecentchanges%26feed%3Drss tímto validátorem], kde na začátku nesmí být žádný prázdný znak (řádek, mezera, ...).
 
Žádné z rozšíření nesmí obsahovat prázdný řádek, který je mimo PHP kód. První řádek musí začínat řetězcem <tt>&lt;?php</tt> a poslední řádek končit <tt>?&gt;</tt> (neodřádkovává se). V opačném případě je problém se stránkou [[Speciální:Recentchanges]], tuto stránku je vhodné zkontrolovat například [http://feedvalidator.org/check.cgi?url=http%3A%2F%2Fsupport.zcu.cz%2Findex.php%3Ftitle%3DSpeci%25C3%25A1ln%25C3%25AD%253ARecentchanges%26feed%3Drss tímto validátorem], kde na začátku nesmí být žádný prázdný znak (řádek, mezera, ...).
 +
 +
===Graphical Category Browser===
 +
[http://www.mediawiki.org/wiki/Extension:Graphical_Category_Browser Graphical Category Browser] zobrazuje závislosti kategorií mezi sebou, lze postupovat
 +
podle návodu, ale je třeba dát pozor na:
 +
* upravu práv adresáře images/xyGraphvizCache: <tt>chmod www-data:www-data /var/lib/mediawiki/images/xyGraphvizCache</tt>
 +
* poslední znak ve skriptu musí být <tt>?&gt;</tt> jinak hlásí chybu, že nelze modifikovat hlavičku, protože již byla odeslána, tedy ani odřádkování
 +
* ve skriptu zakomentovat řádek <tt>$wgHooks['CategoryPageView'][] = 'xyCategoryGraphHook';</tt> jinak nezobrazuje stránky s kategoriemi, dočasně může zobrazovat chybu memcached, ktery hlásí problem se serializací, mělo by stačit jej restartnout nebo chvíli vyčkat
  
 
===Page Protection===
 
===Page Protection===

Verze z 10:52, 14 březen 2010

Tato stránka vzniká během instalace mediawiki pro support.zcu.cz. Dokumentace se nemusí úplně ve všem shodovat, je třeba provést kontrolu přímo na serveru.

Obsah

Instalace

Balík mediawiki je v debianu ve starší verzi, která neumí rozšíření, jenž bychom potřebovali, je třeba provést instalaci z archivu. Archiv se rozbalí do /usr/local/mediawiki-VERZE. Adresáře a soubory, které mají být vidět se linkují z /var/lib/mediawiki-VERZE (dále bude název adresáře mediawiki uvádět bez verze). Přidané soubory by se měli dávat do /var/lib/mediawiki/ (jako je favicon.ico či rozšíření pro autentizaci). V adresáři /usr/local/mediawiki by měla být ponechána nezměněná distribuce s případnými patchi.

MySQL

Dle http://meta.wikimedia.org/wiki/Help:Short_words_in_searches je potřeba nastavit minimální délku slova pro vyhledávání na 3 znaky.

Apache

Idea provozu supportu ve dvou režimech (public, user) autentizovaný WebAuthem je založena na tom, že je Apache provozován na více portech:

  • port 80 (http) - neautentizovaný uživatel, pokuď je uživatel přihlášen, je mu umožněn uživatelský provoz
  • port 443 (https) - chráněno WebAuthem a je vyžadováno přihlášení

Konfigurace Apache

Apache2 s podporou autentizace WebAuth lze nakonfigurovat následnovně:

<VirtualHost _default_:80>
   ServerAdmin webmaster@service.zcu.cz
   Servername morpheus.civ.zcu.cz

   ErrorLog /var/log/apache2/wiki-error.log
   TransferLog /var/log/apache2/wiki-access.log
   ServerSignature Off

   DocumentRoot /var/lib/mediawiki
   <Directory /var/lib/mediawiki/>
           Options +FollowSymLinks
           AllowOverride All
           order allow,deny
           allow from all
   </Directory>

   Alias /images /var/lib/mediawiki/images
   <Directory /var/lib/mediawiki/images>
           Options -FollowSymLinks
           AllowOverride None
   </Directory>
</VirtualHost>

<VirtualHost _default_:443>
   ServerAdmin webmaster@service.zcu.cz
   ServerName morpheus.civ.zcu.cz
   ServerSignature off

   ErrorLog /var/log/apache2/ssl-wiki-error.log
   TransferLog /var/log/apache2/ssl-wiki-access.log

   SSLEngine on
   SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
   SSLCertificateFile /etc/apache2/ssl/server.crt
   SSLCertificateKeyFile /etc/apache2/ssl/server.key
   SSLCACertificateFile /etc/apache2/ssl/zcu-ca.crt

   ServerSignature Off

   DocumentRoot /var/lib/mediawiki
   <Directory /var/lib/mediawiki/>
           Options +FollowSymLinks
           AllowOverride All
           order allow,deny
           allow from all

#           SSLVerifyClient optional
#           SSLVerifyDepth 9
           SSLOptions +ExportCertData +StdEnvVars +FakeBasicAuth +OptRenegotiate
           AuthType WebAuth
           Require privgroup civ lps
#           require user vbaxa hana tana zewelova jhodis simha rskarda fiser kvochova
   </Directory>

   Alias /images /var/lib/mediawiki/images
   <Directory /var/lib/images>
           Options -FollowSymLinks
           AllowOverride None

#           SSLVerifyClient optional
#           SSLVerifyDepth 9
           SSLOptions +ExportCertData +StdEnvVars +FakeBasicAuth +OptRenegotiate
           AuthType WebAuth
           Require privgroup civ lps
#           require user vbaxa hana tana zewelova jhodis simha rskarda fiser kvochova

        </Directory>
</VirtualHost>


Rozšíření autentizace pro WebAuth

Základem je konfigurace použitá pro PubCookie na CASE Univerzity a návodu pro automatické přihlášení přes REMOTE_USER. Pro správnou funkčnost je třeba mít nastaven WebAuth v Apachi. Ve všech uvedených kódech je třeba zkontrolovat přesměrování, nejčastěji se používá volání header('Location: <cílové URL>');

Chybí doplnit kód do index.php, který by při každém použití mediawiki zkontroloval aktuálnost přihlášení. Pokud se mediawiki nepoužívá, přihlášení vyprchá, v tom případě stačí klepnout na tlačítko přihlásit a vše je v pořádku. V tomto ohledu jsou problémy i s keší, kdy se občas stane, že zobrazuje stránku s právy, které už uživatel dávno nemá, nebo právě naopak, neukazuje akce na které právo má. Pravděpodobně stačí vyladit mechanismus keše nebo do redirectu přidat žádost o vyčištění (action=purge).

Nastavení LocalSettings.php

Následující řádky je třeba přidat do LocalSettings.php. Do proměnné $wgLoginFormKey se ukládá náhodný řetězec.

# prihlaseni webauthem
require_once ("$IP/extensions/Auth_apache.php");
$wgLoginFormKey = "oh33ad928sfh2359k7fg3xt39";
$wgAuth = new Auth_apache();

# expirace prihlaseni po 10 hodinach
$wgCookieExpiration = 36000;

Rozšíření o externí autentizaci

Je třeba přepsat standardní autentizační funkce vlastními. K tomu nám bude sloužit vlastní rozšíření uložené v souboru /var/lib/mediawiki/extensions/Auth_apache.php s tímto obsahem:

<?php
require_once('AuthPlugin.php');

class Auth_apache extends AuthPlugin {

  //return whether $username is a valid username
  function userExists($username) {
    //since the username will be passed from our external source, this will probably always be true
    //however, the security paranoid says to check the data
    //you could do an LDAP verify here, just to be safe

    return true; //or return false if the username is invalid
  }

  //whether the given username and password authenticate
  function authenticate($username, $password) {
    //the external authentication actually handles this part, but we still need a security check

    //this form element will be set by our login script.  this security check is important!
    global $wgLoginFormKey;

    return isset($_POST[$wgLoginFormKey]);
  }

  //The authorization is external, so autocreate accounts as necessary
  function autoCreate() {
    return true;
  }

  //tell MediaWiki to not look in its database for user authentication and that our authentication method is all that counts
  function strict() {
    return true;
  }

  //this function gets called when the user is created
  //$user is an instance of the User class (see includes/User.php)
  function initUser(&$user) {
    //unless you want the person to be nameless, you should probably populate info about this user here
    //we do some LDAP queries to populate their name and e-mail

//    $user->setRealName("John Smith");
//    $user->setEmail("john.smith@case.edu");

 //  $user->setRealName("John Smith");
   //  global $wgUser;
    //   global $_SERVER;
    //    $user->setEmail($_SERVER['REMOTE_USER'] . "@tbp.berkeley.edu");

    //if using MediaWiki 1.5, we can set some e-mail options
    $user->mEmailAuthenticated = wfTimestampNow();

    //turn on e-mail notifications by default
    $user->setOption('enotifwatchlistpages', 1);
    $user->setOption('enotifusertalkpages', 1);
    $user->setOption('enotifminoredits', 1);
    $user->setOption('enotifrevealaddr', 1);
  }

  //if using MediaWiki 1.5, we have a new function to modify the UI template!
  function modifyUITemplate(&$template) {
    //disable the mail new password box
    $template->set("useemail", false);

    //disable 'remember me' box
    $template->set("remember", false);

    $template->set("create", false);

    $template->set("domain", true);
  }
}
?>

TODO

  • chybí doplnit dotaz do LDAPu pro zjištění reálného jména a emailové adresy.
  • přidat kontrolu obsahu (nejen existenci) proměnné $LoginFormKey

Přihlašovací skript

Následující skript /var/lib/mediawiki/login/index.php provádí přihlášení uživatele (je vyžadován balík php-http-request). Tento skript je provede přihlášení na základě proměnné REMOTE_USER. Ve skutečnosti provede volání standardního přihlašovacího skriptu includes/SpecialUserlogin.php s tím, že se mu podvrhne request, který se vytvoří uvnitř tohoto skriptu. Adresu requestu je třeba zkontrolovat.

<?php

define('MEDIAWIKI', true); //needed to include LocalSettings.php without MediaWiki spazzing out

//we need to bring in $wgLoginFormKey
require_once('../LocalSettings.php');

//this script must be run behind some type of Apache user authorization
//fail immediately if it isn't
if (!isset($_SERVER['REMOTE_USER'])) {
  die("The remote user variable is not set");
}

//set the login username
//on our wiki, we actual do some voodoo and rename the user to something else because our network usernames are not supposed to be published
//we do that in this script before it even hits MediaWiki
$username = $_SERVER['REMOTE_USER'];
session_start();

$redirect = $_SESSION['http_referrer'];
unset($_SESSION['http_referrer']);

ini_set('include_path','/usr/share/php');
require_once "HTTP/Request.php";

//create the request to the login form
$req = &new HTTP_Request('http://morpheus.civ.zcu.cz/index.php?title=Special:Userlogin&action=submitlogin',
        array('method'=>'POST'));

global $wgLoginFormKey;

//set up the request with fake data
$req->addPostData("wpName", $username);
$req->addPostData("wpPassword", "password");  //we could change "password" to some value and double check in our custom login extension if we wanted added security
$req->addPostdata("wpLoginattempt", "Log in");
$req->addPostdata($wgLoginFormKey, "value here doesn't matter");

$req->sendRequest();

//uncomment to debug mediawiki response
//print_r($req->getResponseCookies());
//print_r($req->getResponseHeader());
//print_r($req->getResponseBody());
//die();

//intercept the cookies sent by mediawiki and set them for the client
//you could change the expiration time of the cookies for added security
global $wgCookieExpiration;
foreach ($req->getResponseCookies() as $c) {
        if ($c['name'] == "PHPSESSID") {
          setcookie("PHPSESSID", $c['value'], Time()+$wgCookieExpiration, '/');
        }
        else {
          setcookie($c['name'], $c['value'], Time()+$wgCookieExpiration, $c['path']);
        }
}

//finally redirect the user back to his original page
//echo "RETURNTO: ".$_GET['returnto'];

header("Location: https://morpheus.civ.zcu.cz/index.php/".$_GET['returnto']."");

?>

TODO

  • chybí nastavení platnosti cookie dle přihlášení WebAuthu.

Úprava přihlašovací stránky

Do souboru includes/templates/Userlogin.php je třeba vložit přesměrování na login/index.php v případě, že nejde o request. Přidáme tedy řádky:

header('Location: https://morpheus.civ.zcu.cz/login/index.php?returnto='.$_GET['returnto'].'');
exit;

Změna je provedena okolo 25. řádku, výřez z takto upraveného souboru:

class UserloginTemplate extends QuickTemplate {
        function execute() {

                if( $this->data['error'] ) {
?>
        <h2><?php $this->msg('loginerror') ?>:</h2>
        <p class='error'><?php $this->html('error') ?></p>
<?php } ?>

<?php
header('Location: https://morpheus.civ.zcu.cz/login/index.php?returnto='.$_GET['returnto'].'');
exit;
?>
        <h2><?php $this->msg('login'      ) ?>:</h2>
        <?php  $this->msgWiki('loginprompt') ?>
<?php } ?>
<form name="userlogin" id="userlogin" method="post" action="<?php $this->text('action') ?>">

Prodloužení doby platnosti pro cookie

Nepodařilo se zatím jinak, jediná možnost je v /etc/php4/apache2/php.ini nastavit tyto volby (v sec):

session.cookie_lifetime = 36000
session.gc_maxlifetime = 36000

Toto musi byt v souladu s hodnotou $wgCookieExpiration v konfiguraci wiki (soubor LocalSettings.php).

Změna vzhledu (CSS)

Vytvoření nového skinu

Vzhled je založen na skinu monobook a jmenuje se zcumonobook. Postup vychází z dokumentu http://meta.wikimedia.org/wiki/Skins, pro support bylo postupováno následovně:

  • okopírování monobooku pod nový název
cd /var/lib/mediawiki/skins
cp -R monobook zcumonobook 
cp MonoBook.php ZCUMonoBook.php 
  • úprava názvů funkcí v ZCUMonoBook.php, provést dle dokumentu http://meta.wikimedia.org/wiki/Skins, odstavec Creating a Skin based on MonoBook (1.6.x), diff pro verzi 1.6.3 je:
# 
--- MonoBook.php        2006-04-11 03:17:51.000000000 +0200
+++ ZCUMonoBook.php     2006-07-11 13:07:25.000000000 +0200
@@ -22,13 +22,13 @@
  * @package MediaWiki
  * @subpackage Skins
  */
-class SkinMonoBook extends SkinTemplate {
-       /** Using monobook. */
+class SkinZCUMonoBook extends SkinTemplate {
+       /** Using zcumonobook. */
        function initPage( &$out ) {
                SkinTemplate::initPage( $out );
-               $this->skinname  = 'monobook';
-               $this->stylename = 'monobook';
-               $this->template  = 'MonoBookTemplate';
+               $this->skinname  = 'zcumonobook';
+               $this->stylename = 'zcumonobook';
+               $this->template  = 'ZCUMonoBookTemplate';
        }
 }
 
@@ -37,7 +37,7 @@
  * @package MediaWiki
  * @subpackage Skins
  */
-class MonoBookTemplate extends QuickTemplate {
+class ZCUMonoBookTemplate extends QuickTemplate {
        /**
         * Template filter callback for MonoBook skin.
         * Takes an associative array of data set from a SkinTemplate-based
@@ -217,7 +217,7 @@
                                <li id="t-ispermalink"><?php $this->msg('permalink') ?></li><?php
                }
 
-               wfRunHooks( 'MonoBookTemplateToolboxEnd', array( &$this ) );
+               wfRunHooks( 'ZCUMonoBookTemplateToolboxEnd', array( &$this ) );
 ?>
                        </ul>
                </div>

Konfigurace

Skin je potřeba nastavit jako defaultní v LocalSettings.php úpravou volby $wgDefaultSkin:

$wgDefaultSkin = 'zcumonobook';

Vhodné je vyřadit z provozu ostatní skiny nastavením volby $wgSkipSkins:

$wgSkipSkins = array("monobook", "chick", "cologneblue", "myskin", "nostalgia", "simple", "standard");

Uložení loga jako obrázku do wiki a jeho nastavení: $wgLogo = "{$wgUploadPath}/Logo_ZCU-support.png";

Úprava stylu

Celý tento odstavec se týká úprav v souborech pro kaskádové styly. Veškeré úpravy jsou prováděny v adresáři skins/zcumonobook/

main.css

--- monobook/main.css   2006-05-01 22:04:15.000000000 +0200
+++ zcumonobook/main.css        2006-07-12 13:57:40.000000000 +0200
@@ -14,22 +14,22 @@
        float: right;
        margin: 0 0 .6em -12.2em;
        padding: 0;
 }
 #content {
-       margin: 2.8em 0 0 12.2em;
+       margin: 4.8em 0 0 12.2em;
        padding: 0 1em 1.5em 1em;
        background: white;
        color: black;
        border: 1px solid #aaa;
        border-right: none;
        line-height: 1.5em;
        position: relative;
        z-index: 2;
 }
 #column-one {
-       padding-top: 160px;
+       padding-top: 76px;
 }
 /* the left column width is specified in class .portlet */
 
 /* Font size:
 ** We take advantage of keyword scaling- browsers won't go below 9px
@@ -37,11 +37,11 @@
 ** http://style.cleverchimp.com/font_size_intervals/altintervals.html
 */
 
 body {
        font: x-small sans-serif;
-       background: #f9f9f9 url(headbg.jpg) 0 0 no-repeat;
+       background: #e0e0e0 url(headbg2.jpg) 0 0 no-repeat;
        color: black;
        margin: 0;
        padding: 0;
 }
 
@@ -244,10 +244,13 @@
 #bodyContent h3, #bodyContent h4, #bodyContent h5 {
        margin-bottom: .3em;
 }
 .firstHeading {
        margin-bottom: .1em;
+       color: #005cab;
+       border: 0;
+       font-weight: bold;
 }
 
 /* user notification thing */
 .usermessage {
        background-color: #ffce7b;
@@ -687,26 +690,26 @@
 */
 
 #p-logo {
        z-index: 3;
        position: absolute; /*needed to use z-index */
-       top: 0;
-       left: 0;
-       height: 155px;
-       width: 12em;
+       top: 2px;
+       left: 2px;
+       height: 69px;
+       width: 420px;
        overflow: visible;
 }
 #p-logo h5 {
        display: none;
 }
 #p-logo a,
 #p-logo a:hover {
        display: block;
-       height: 155px;
-       width: 12.2em;
+       height: 69px;
+       width: 420px;
        background-repeat: no-repeat;
-       background-position: 35% 50% !important;
+       background-position: left top !important;
        text-decoration: none;
 }
 
 /*
 ** the navigation portlet
@@ -763,20 +766,22 @@
 */
 
 #p-personal {
        width: 100%;
        white-space: nowrap;
-       padding: 0;
+/*     padding: 0.5em;*/
        margin: 0;
        position: absolute;
        left: 0;
        top: 0;
        z-index: 0;
        border: none;
-       background: none;
+       background: #a2bdc8;
        overflow: visible;
        line-height: 1.2em;
+       padding-top: 0.5em;
+       padding-bottom: 0.5em;
 }
 
 #p-personal h5 {
        display: none;
 }
@@ -821,11 +826,10 @@
        color: #005896;
        padding-bottom: .2em;
        background: none;
 }
 #p-personal li a:hover {
-       background-color: white;
        padding-bottom: .2em;
        text-decoration: none;
 }
 #p-personal li.active a:hover {
        background-color: transparent;
@@ -843,23 +847,24 @@
 /*
 ** the page-related actions- page/talk, edit etc
 */
 #p-cactions {
        position: absolute;
-       top: 1.3em;
-       left: 11.5em;
+       top: 3.4em;
        margin: 0;
        white-space: nowrap;
-       width: 76%;
+       width: 100%;
        line-height: 1.1em;
        overflow: visible;
        background: none;
        border-collapse: collapse;
-       padding-left: 1em;
        list-style: none;
        font-size: 95%;
 }
+#p-cactions ul {
+       text-align: right;
+}
 #p-cactions .hiddenStructure {
        display: none;
 }
 #p-cactions ul {
        list-style: none;
@@ -940,14 +945,13 @@
 }
 /*
 ** footer
 */
 #footer {
-       background-color: white;
-       border-top: 1px solid #fabd23;
-       border-bottom: 1px solid #fabd23;
-       margin: .6em 0 1em 0;
+       background-color: none;
+       border-top: 1px solid navy;
+       margin: .6em 0 0 0;
        padding: .4em 0 1.2em 0;
        text-align: center;
        font-size: 90%;
 }
 #footer li {
@@ -962,14 +966,16 @@
        top: -2px; /* Bump it up just a tad */
 }
 #f-poweredbyico {
        float: right;
        height: 1%;
+       display: none;
 }
 #f-copyrightico {
        float: left;
        height: 1%;
+       display: none;
 }
 
 /* js pref toc */
 #preftoc {
        margin: 0;
@@ -1443,6 +1449,11 @@
 
 /* restriction patch tab style (white link on red background) */
 li#ca-unrestrict a {
        color: white !important;
        background-color: #ba0000 !important;
-}
\ No newline at end of file
+}
+
+#about a, #privacy a {
+       display: none;
+}      
+

*Fixes.css
Ve všech souborech *Fixes.css je potřeba provést následnou úpravu (pokud tomu odpovídá nalezený řetězec) tohoto textu

#column-content #content { 
       margin-top: 3em; 
       height: 1%;
}

na hodnotu

#column-content #content { 
       margin-top: 5em;
       height: 1%;
}

A zakomentovat následující kód úpravující patičku:

#footer {
        margin-left: 13.6em;
        border-left: 1px solid #fabd23;
}

Page Restriction - omezení přístupu

Jedná se o patch (odkaz z MediaWiki). Rozšíření přidává možnost blokovat/odblokovávat stránky (právo restrict) a prohlížení blokovaných stránek (právo viewrestrict). Na tyto stránky je třeba mít zvláštní právo.

Patch pro verzi 1.5.2 lze použít i na verzi 1.5.3. Aplikace patche dle odkazované dokumentace.

Práva

Práva se uživatelům nastavují tak, že se zařadí do patřičné skupiny. Práva skupiny se nastavují v LocalSettings.php proměnnou $wgGroupPermissions.

Popis skupin

Pozor, tento text nemusí být aktuální.
Chtelo by pridat novou skupinu (snad restrict), ktera by vydelila pravo restrikce ze skupiny 'editor'.


anonymous

Nepřihlášený uživatel, který má právo jen prohlížet nechráněné stránky. Pro získání vyšších práv je třeba se přihlásit.

editor

Možnost editovat stránky, nemá právo pro zamykání, ale je mu umožněna restrikce.

mediator

Má právo zamykání stránek proti editaci a nastavení restrict.

sysop

Administrátor, má všechny práva, kromě změny práv.

byrokrat

Umožňuje měnit oprávnění.

Rozšíření

Seznam všech rozšíření, které byly provedeny. Tyto rozšíření nejsou vetšinou počeštěny.

Žádné z rozšíření nesmí obsahovat prázdný řádek, který je mimo PHP kód. První řádek musí začínat řetězcem <?php a poslední řádek končit ?> (neodřádkovává se). V opačném případě je problém se stránkou Speciální:Recentchanges, tuto stránku je vhodné zkontrolovat například tímto validátorem, kde na začátku nesmí být žádný prázdný znak (řádek, mezera, ...).

Graphical Category Browser

Graphical Category Browser zobrazuje závislosti kategorií mezi sebou, lze postupovat podle návodu, ale je třeba dát pozor na:

  • upravu práv adresáře images/xyGraphvizCache: chmod www-data:www-data /var/lib/mediawiki/images/xyGraphvizCache
  • poslední znak ve skriptu musí být ?> jinak hlásí chybu, že nelze modifikovat hlavičku, protože již byla odeslána, tedy ani odřádkování
  • ve skriptu zakomentovat řádek $wgHooks['CategoryPageView'][] = 'xyCategoryGraphHook'; jinak nezobrazuje stránky s kategoriemi, dočasně může zobrazovat chybu memcached, ktery hlásí problem se serializací, mělo by stačit jej restartnout nebo chvíli vyčkat

Page Protection

Page Protection slouží pro zakrytí citlivých údajů. Postup zprovoznění ve zkratce:

  • stáhnout zdrojový kód, uvnitř je obsazen návod na zprovoznění
  • pear install Crypt_RSA-1.2.0b
  • v případě užití PHP4 je třeba doinstalovat pear install PHP_Compat
  • vytvořit linky:
    • ln -s /usr/share/php/PEAR /var/lib/mediawiki/PEAR
    • ln -s /usr/share/php/Crypt /var/lib/mediawiki/Crypt
    • ln -s /usr/share/php/PHP /var/lib/mediawiki/PHP
    • ln -s /usr/share/php/PEAR.php /var/lib/mediawiki/PEAR.php
  • vytvořit adresář /var/lib/mediawiki/extensions/PageProtection/ a nakopírovat do něj obsah staženého archívu
  • do souboru extensions/PageProtection/Encryption.php řádek:
 require_once('PHP/Compat/Function/file_put_contents.php'); 
  • vložit konfigurační řádky do LocalSettings.php:
# PageProtection
# http://meta.wikimedia.org/wiki/PageProtection
require_once("extensions/PageProtection/PageProtection.php");

$wgCachePages       = false;
$wgCacheEpoch = 'date +%Y%m%d%H%M%S';

Aby mohla skupina viewrestrict a editor v parametru groups taky editovat a nebyla jen pro prohlížení, je třeba upravit soubor extensions/PageProtection/AccessList.php a do funkce hasAcccess(&$user) přidat stejný kód jako je pro skupinu sysop:

        if(in_array("viewrestrict", $user->mGroups)){
            return true;
        }
        if(in_array("editor", $user->mGroups)){
            return true;
        }

Vyhledávání přes Google

Postup podle stránek [1]. V souboru includes/SpecialSearch.php upravíme funkci showResults( $term ) následovně:

--- /tmp/SpecialSearch.php      2006-07-12 14:28:23.000000000 +0200
+++ SpecialSearch.php   2006-07-10 16:11:32.000000000 +0200
@@ -206,20 +206,24 @@
                        }
                }
 
                if ( $num == 0 ) {
                        $wgOut->addWikiText( wfMsg( 'nonefound' ) );
                }
                if( $num || $this->offset ) {
                        $wgOut->addHTML( "<p>{$prevnext}</p>\n" );
                }
                $wgOut->addHTML( $this->powerSearchBox( $term ) );
+               if ( ! $wgDisableTextSearch ) {
+                       $wgOut->addWikiText( wfMsg( 'Googlesearchheader' ) );
+                       $wgOut->addHTML( wfMsg( 'Googlesearch', $term ) );
+               }
                wfProfileOut( $fname );
        }
 
        #------------------------------------------------------------------
        # Private methods below this line
 
        /**
         *
         */
        function setupPage( $term ) {

Dále vytvoříme systémové hlášení Googlesearchheader přístupem na MediaWiki:Googlesearchheader kam vložíme něco chytrého jako:

===Hledání Googlem===
Můžete zkusit vyhledávání Googlem; je ale možné, že jeho výsledky nemusí být aktuální.

Dále je potřeba nastavit odeslání hledaného řetězce v utf-8, to se provede úpravou MediaWiki:Googlesearch, tak aby skryté položky 'ie' a 'oe' obsahovaly 'utf-8' (nahradí se proměnna $2), asi takto:

<input type="hidden" name="ie" value="utf-8" />
<input type="hidden" name="oe" value="utf-8" />

Prohlížení práv

Tato speciální stránka zobrazuje aktualní stav mapování skupin na jednotlivá práva. Zdrojový kód a návod je na stránkách http://meta.wikimedia.org/wiki/Permissions.

Přejmenování uživatele

Na http://meta.wikimedia.org/wiki/Renameuser je speciální stránka umožňující přejmenování uživatele. Administrátor s pověřením přejmenování uživatele má možnost jej přejmenovat na této speciální stránce.

Formuláře

Převzaty z http://meta.wikimedia.org/wiki/Help:Inputbox
a měl by sloužit pro napsání nového rozšíření, které umožní odesílání formuláře na jiné URL (požadavky do RT, vyhledávání, žádosti pro hostmastra, ...)

Dynamic Page List 2

Toto rozšíření (popis nastavení) je napsáno na základě předchozího, ale navíc umožňuje dávat kategorie do vztahu AND i OR. Má daleko přehlednější kód. Bylo však do něj potřeba přidat volbu addfirstparagraph.

--- DynamicPageList2.php.orig   2006-08-20 16:19:25.000000000 +0200
+++ DynamicPageList2.php        2006-08-20 17:52:24.000000000 +0200
@@ -96,7 +96,8 @@
         */
        'ordermethod' => array('default' => 'title', 'category,firstedit',  'category,lastedit', 'category,pagetouched', 
'category,title', 'categoryadd', 'firstedit', 'lastedit', 'pagetouched', 'title', 'user,firstedit', 'user,lastedit'),
        'redirects' => array('default' => 'exclude', 'exclude', 'include', 'only'),
-       'shownamespace' => array('default' => 'true', 'false', 'true')
+       'shownamespace' => array('default' => 'true', 'false', 'true'),
+       'addfirstparagraph' => array('default' => 'false',  'false', 'true')
 );
 
 /**
@@ -166,6 +167,7 @@
        $sRedirects = $wgDPL2Options['redirects']['default'];
        $sInlSymbol = $wgDPL2Options['inlinesymbol']['default'];
        $bShowNamespace = $wgDPL2Options['shownamespace']['default'] == 'true';
+       $bAddFirstParagraph = $wgDPL2Options['addfirstparagraph']['default'] == 'true';
        $bAddFirstCategoryDate = $wgDPL2Options['addfirstcategorydate']['default'] == 'true';
        $bAddPageTouchedDate = $wgDPL2Options['addpagetoucheddate']['default'] == 'true';
        $bAddEditDate = $wgDPL2Options['addeditdate']['default'] == 'true';
@@ -343,6 +345,13 @@
                                        $output .= $logger->msgWrongParam('shownamespace', $sArg);
                                break;
                                
+                       case 'addfirstparagraph':
+                               if( in_array($sArg, $wgDPL2Options['addfirstparagraph']))
+                                       $bAddFirstParagraph = $sArg == 'true';
+                               else
+                                       $output .= $logger->msgWrongParam('addfirstparagraph', $sArg);
+                               break;
+                               
                        case 'debug':
                                if( in_array($sArg, $wgDPL2Options['debug']) ) {
                                        if($iParam > 1)
@@ -602,6 +611,8 @@
        $aArticles_start_char =array();
        $aAddDates = array();
        $aAddUsers = array();
+       //first paragraphs of articles
+       $aFirstParagraphs = array();
        //user titles to be checked by $linkBatch for existence (id in $aAddUsers => title)
        $aUncheckedUserTitles = array();
        $aAddCategories = array();
@@ -687,7 +698,26 @@
                        }
                        $aAddCategories[] = $artCatLinks;
                }
-               
+       
+               //ADD FIRST PARAGRAPH
+               if ($bAddFirstParagraph) {
+                       $parseOptions = ParserOptions::newFromUser($wgUser);
+                       $myParser = new Parser();
+                       $title = Title::makeTitle($row->page_namespace, $row->page_title);
+                       $tmpArticle = new Article( $title );
+                       $tmpArticle->fetchContent();
+                        if (preg_match("/^(.*)[\n=]/", $tmpArticle->mContent, $match)) {
+                                $myParseOutput = $myParser->parse(":" .$match[0], $title, $parseOptions);
+                               $aFirstParagraphs[] = $myParseOutput->mText;
+                       }
+                       else {
+                               $aFirstParagraphs[] = '';
+                       }
+               }
+               else {
+                       $aFirstParagraphs[] = '';
+               }                                                                                                        
           
+       
                $iArticle++;
        }
        $dbr->freeResult( $res );
@@ -712,7 +742,7 @@
                        if ($sPageOutputMode == 'category')
                                $output .= DPL2OutputCategoryStyle($aArticles, $aArticles_start_char, $headingStart, $hea
dingCount);
                        else
-                               $output .= DPL2OutputListStyle($aArticles, $aAddDates, $aAddUsers, $aAddCategories, $sPag
eOutputMode, $sInlSymbol, $headingStart, $headingCount);
+                               $output .= DPL2OutputListStyle($aArticles, $aAddDates, $aAddUsers, $aAddCategories, $sPag
eOutputMode, $sInlSymbol, $headingStart, $headingCount, $aFirstParagraphs);
                        $output .= $headingMode->sEndItem;
                        $headingStart += $headingCount;
                }
@@ -721,7 +751,7 @@
        elseif($sPageOutputMode == 'category')
                $output .= DPL2OutputCategoryStyle($aArticles, $aArticles_start_char, 0, count($aArticles));
        else
-               $output .= DPL2OutputListStyle($aArticles, $aAddDates, $aAddUsers, $aAddCategories, $sPageOutputMode, $sI
nlSymbol, 0, count($aArticles));
+               $output .= DPL2OutputListStyle($aArticles, $aAddDates, $aAddUsers, $aAddCategories, $sPageOutputMode, $sI
nlSymbol, 0, count($aArticles), $aFirstParagraphs);
 
        return $output;
 }
@@ -739,7 +769,7 @@
                                $sk->makeKnownLinkObj($titleval, $wgContLang->convertHtml($titleval->getText()));
 }
 
-function DPL2OutputListStyle ($aArticles, $aAddDates, $aAddUsers, $aAddCategories, $sOutputMode, $sInlSymbol, $iStart, $
iCount) {
+function DPL2OutputListStyle ($aArticles, $aAddDates, $aAddUsers, $aAddCategories, $sOutputMode, $sInlSymbol, $iStart, $
iCount, $aFirstParagraphs) {
        global $wgUser, $wgLang;
        
        $sk = & $wgUser->getSkin();
@@ -762,6 +792,8 @@
                        $r .= ' . . <small>' . $sSpecCatsLnk . ': ' . implode(' | ', $aAddCategories[$i]) . '</small>';
                if( (($mode->name != 'inline') && ($mode->name != 'none')) || ($i < $iStart + $iCount-1)) //no inline sym
bol (inline mode) at end of list
                        $r .= $mode->sEndItem;
+               if ($aFirstParagraphs[$i]) 
+                       $r .= $aFirstParagraphs[$i];
        }
        $r .= $mode->sEndList;
        return $r;

Winter

Winter je Wiki Interpreter, kterým je možné lehce programovat stránky. Nachází se na http://meta.wikimedia.org/wiki/User:Frantik/Winter. Instalace spočívá v přídání include řádku do LocalSettings.php:

 include ("extensions/Winter.php");

GraphViz

Ze stránek http://meta.wikimedia.org/wiki/GraphViz stačí stáhnout a uložit rozšíření a nastavit cestu k programu dot, který je součástí .deb balíku graphviz (je třeba nainstalovat).

Cite

Dle návodu na http://meta.wikimedia.org/wiki/Cite/Cite.php stáhnout soubory a přidat do LocalSettings.php.

RSS Feed

Dle http://meta.wikimedia.org/wiki/WikiFeeds nakopírovat soubor feeds.php do /var/lib/mediawiki/misc/, nastavit položku webmaster v poli $feedOptions. Dle helpu uvnitř skriptu pak nastavit vzdálenou stranu. Do adresáře a ke skriptu musí být apache nastaven tak, aby umožnil spustit php skript.

Aby nebyly distribuovány stránky z namespace 'User' a zamknuté stránky (restrict) je třeba v souboru extensions/SpecialWikiFeeds.php uzavřít všechny výskyty

$feed->addItem($item);

do podmínky:


if (!($title->isRestricted() or (NS_USER == $title->getNamespace()))) {
        $feed->addItem($item);
}

Kód není ideální, ale je funkční pro naši konfiguraci, zvláště poslední část podmínky je specifická pro ZČU a řeší volbu $wgUserPageRestrict = true; v LocalSettings.php.

Multiple Upload

Staženo rozšíření http://www.mediawiki.org/wiki/Extension:MultiUpload a v souboru SpecialMultipleUpload.php nastaven počet soubežně nahratelných souborů na deset:

// change this parameter to limit the # of files one can upload
$wgMaxUploadFiles = 10;

Konfigurace je standardním způsobem v LocalSettings.php:

require_once("$IP/extensions/MultiUpload/SpecialMultipleUpload.php");

Image Map

Staženo z http://www.mediawiki.org/wiki/Extension:ImageMap a standardně připojeno do systému v LocalSettings.php:

require_once("$IP/extensions/ImageMap/ImageMap.php");

Upgrade o patch level

Stáhnout novou verzi a rozbalit ji do /usr/local/mediawiki-VERZE/. Dalším krokem je úprava skriptů, které byly upraveny (jedná se zvláště o přihlašování). Seznam (nemusí být úplný je zde):

  • aplikovat patch pro Restrict stránky, neprovádět upgrade pokud patch neexistuje
  • aplikovat patch pro rozšíření o Protect, neprovádět upgrade pokud patch neexistuje
  • upravit includes/SpecialSearch.php tak, aby podporoval vyhledávání google
  • includes/templates/Userlogin.php - změna přesměrování při přihlášení
  • zkontrolovat zákaz zobrazování tlačítek pro nepřihlášené uživatele
  • zkontrolovat zrušení zobrazování tlačítka pro diskusi pro všechny uživatele
  • zkontrolovat změny ve skinu

Úpravy kódu a vzhledu

Zrušení tlačítek pro nepřihlášené uživatele

Provádí se dle návodu na http://meta.wikimedia.org. Provede se jednoduchý test, zda je uživatel přihlášen, pokud není pak se mu negenerují tlačítka a vytvoří se jedno defaultní 'Speciální stránka'. Přihlášenému uživateli funguje vše bez problému.

V souboru /includes/SkinTemplate.php je třeba nalézt ve funkci buildContentActionUrls() tento kód

 if( $this->iscontent ) {

a modifikovat jej na

 if( $wgUser->getId() != 0 && $this->iscontent ) {

Zrušení zobrazování tlačítka pro diskusi

V souboru /includes/SkinTemplate.php je třeba ve funkci buildContentActionUrls() zakomentovat vytvoření tlačítka talk. Výsledný stav by mel vypadat přibližně takto:

#                       $content_actions['talk'] = $this->tabAction(
#                               $this->mTitle->getTalkPage(),
#                               'talk',
#                               $this->mTitle->isTalkPage(),
#                               '',
#                               true);

Zrušení možnosti vyhledávat v diskusích

Úprava je v includes/SearchEngine.php ve funkci searchableNamespaces(), kde se podmínka

                        if( $ns >= NS_MAIN ) {
                                $arr[$ns] = $name;
                        }

upraví na

                        if( ($ns >= NS_MAIN) && (($ns%2) == 0) ) {
                                $arr[$ns] = $name;
                        }

Trik spočívá v tom, že diskuse jsou vždy liché.

Změna diskuse v uživatelských url na Public

V souboru /includes/SkinTemplate.php je ve funkci builPersonalUrls() přidat nový kód pro zobrazení public namespace a zakomentovat starý kód pro diskuse. Výsledek by měl vypadat takto:

                        $userpublicUrlDetails = $this->makeUrlDetails('Public:' .$this->username);
                        $personal_urls['public'] = array(
                                'text' => 'public',
                                'href' => &$userpublicUrlDetails['href'],
                                'class' => $userpublicUrlDetails['exists']?false:'new',
                                'active' => ( $userpublicUrlDetails['href'] == $pageurl )
                        );
#                       $usertalkUrlDetails = $this->makeTalkUrlDetails($this->userpage);
#                       $personal_urls['mytalk'] = array(
#                               'text' => wfMsg('mytalk'),
#                               'href' => &$usertalkUrlDetails['href'],
#                               'class' => $usertalkUrlDetails['exists']?false:'new',
#                               'active' => ( $usertalkUrlDetails['href'] == $pageurl )
#                       );

Generování cache obrázků

Pro správné zobrazování aktualizovaných obrázků, tj. obrázků u kterých byla nahrána jejich nová verze, je zapotřebí, aby MediaWiki ukládala obrázky do adresářů podle hash funkce. Ověření zda-li MediaWiki správně generuje cache obrázků se provede vymazáním stavající cache obrázku ve složce images/thumb. Pokud se po vymazání cache obrázek na stránce nezobrazí správně je nutné provést následující kroky. Nastavit proměnnou v souboru LocalSettings.php:

$wgHashedUploadDirectory = true;

Pokud je toto nastavení prováděno ve chvíli, kdy jsou v MediaWiki nahrány nějaké obrázky, které nejsou uloženy v adresářích podle hash funkce, ale nachází se přímo ve složce images na jedné hromadě, pak je nutné tyto obrázky uložit do adresářů podle hash funkce. To se provede spuštěním následujícího skriptu:

#!/bin/bash
 
 if [ x$1 == x ] || [ $1 == "help" ]; then
 	echo "Script for building hashed folder structure for Mediawiki upload folder" 
 	echo "Usage: script path"
 	exit
 fi
 
 echo -e "Working directory is $PWD/$1"
 path=`echo $1 | sed s./$..`
 echo -n "Creating backup folder $path.bck: "
 cp -r $1 $path.bck
 echo -e "done \n" 

 for i in `ls -lA $1 | grep -v ^d | awk {'print $9'} ` ; do
	echo -e "Name of file is $i"
	
	hash=`echo -n $i | md5sum | awk {'print $1'}`
	echo -e "it's hash is $hash"
	
	folder1=`echo $hash | cut -b1`
	echo -e "so first folder will be $folder1"
	folder2=`echo $hash | cut -b1-2`
	echo -e "and second folder $folder2"

	echo -n "Creating folders: "
	mkdir -p $1/$folder1/$folder2
	echo -e "done"
	echo -n "Moving file: "
	mv $1/$i $1/$folder1/$folder2
	echo -e "done"
	echo ""
 done

 echo -e "Now taking archive directory\n\n"
 archive="$path/archive"

 for i in `ls -lA $archive | grep -v ^d | awk {'print $9'} ` ; do
	echo -e "Name of file is $i"
	sname=`echo $i | cut -d'!' -f2-`
	echo -e "short name is $sname"
	
	hash=`echo -n $sname | md5sum | awk {'print $1'}`
	echo -e "it's hash is $hash"
	
	folder1=`echo $hash | cut -b1`
	echo -e "so first folder will be $folder1"
	folder2=`echo $hash | cut -b1-2`
	echo -e "and second folder $folder2"

	echo -n "Creating folders: "
	mkdir -p $archive/$folder1/$folder2
	echo -e "done"
	echo -n "Moving file: "
	mv $archive/$i $archive/$folder1/$folder2
	echo -e "done"
	echo ""
 done

Skript se spustí příkazem:

./nazev_skriptu cesta_k_slozce_s_obrazky

Názvy obrázků s diakritikou

Pro správné zobrazování obrázků obsahujících v názvů znaky s (českou) diakritikou je zapotřebí provést úpravy v souboru includes/GlobalFunction.php. Zde problémy způsobuje php funkce escapeshellarg(), která je volána ve funkcích wfEscapeShellArg() a wfShellExec(). V tomto souboru je tedy nutné následujícím způsobem obměnit kód:

1015c1015
<               if ( wfIsWindows() ) {
---
>
1039,1041c1039
<               } else {
<                       $retVal .= escapeshellarg( $arg );
<               }
---
>
1827c1825
<                               $cmd = escapeshellarg( $script ) . " $time $mem $filesize " . escapeshellarg( $cmd );
---
>                               $cmd = escapeshellarg( $script ) . " $time $mem $filesize " . wfEscapeShellArg( $cmd );

TODO

  • dát pod nadpis motto CIVu, něco ve stylu 'jsme tu pro Vás'. Máme takové motto?
  • zjednodušit kód hlavní strany
Osobní nástroje
Jmenné prostory

Varianty
Zobrazení
Akce
Kdo jsem
Navigace
Často hledaná témata
Nástroje