Inhaltsverzeichnis
Gallery2
Gallery2 ist ein Web basiertes Fotoalbum.
Voraussetzungen
Als Voraussetzung für die Installation von Gallery2 sind folgende Komponenten erforderlich:
- Lauffähiger Web-Server z.B. Apache HTTP Server
- HINWEIS - Optional - mod_rewrite des Apache HTTP Server
- PHP ab der Version 4 oder höher PHP Net
- Datenbank z.B. MySQL
- ImageMagick, NetBPM, GD oder GraphicsMagick - hier soll ImageMagick zum Einsatz kommen !
- ffmpeg - Generierung von Miniaturansichten von Filmen - Einbindung über
rpmforge
-Repository - siehe Repository einbinden - dcraw - Einbinden von Bildern im RAW-Format - Einbindung über
rpmforge
-Repository - siehe Repository einbinden - jhead - Anzeige von EXIF-Informationen - Einbindung über
rpmforge
-Repository - siehe Repository einbinden
Installation
Ab hier werden root
-Rechte zur Ausführung der nachfolgenden Befehle benötigt. Um root
zu werden geben Sie bitte folgenden Befehl ein:
$ su - Password:
Mit nachfolgenden Befehlen und nach erfolgreichem einbinden von rpmforge
-Repository - siehe Repository einbinden können alle Voraussetzungen geschaffen werden:
yum install ImageMagick ... yum install ffmpeg ... yum install dcraw ... yum install jhead ...
Herunterladen
Die aktuelle Version von Gallery2 liegt in der Version 2.3.1
vor und kann unter folgendem Link bezogen werden Gallery2 - Download - die zu herunter ladende Datei lautet aktuell
gallery-2.3.1-minimal.tar.gz
HINWEIS - Die hier in verwendete Version ist die minimal
-Version !
Nach dem herunterladen des Archivs in das Verzeichnis - hier z.B. /tmp
, sollte mit nachfolgendem Befehl in das Verzeichnis - hier /tmp
gewechselt werden:
# cd /tmp
Anschließend muss dieses Archiv mit nachfolgendem Befehl entpackt werden:
# tar xzfv /tmp/gallery-2.3.1-minimal.tar.gz
Anschließend sollte ein neues Verzeichnis mit dem abweichenden Namen -
gallery2
im Verzeichnis /tmp
entstanden sein.
Das Verzeichnis sollte nun mit nachfolgendem Befehl gleichzeitig umbenannt und in das Verzeichnis
/var/www/html
verschoben werden:
# mv /tmp/gallery2 /var/www/html/gallery
Jetzt kann das nicht mehr benötigte Archiv im Verzeichnis /tmp
mit nachfolgendem Befehl gelöscht werden:
# rm /tmp/gallery-2.3.1-minimal.tar.gz
Abschließend ist es noch notwendig die benötigten Besitzrechte dem neuen Verzeichnis und dessen Inhalt mit nachfolgendem Befehl zuzuweisen:
# chown -R apache.apache /var/www/html/gallery
Datenbank einrichten
Mit nachfolgenden Befehlen können alle relevanten Komponenten in der Datenbank - hier MySQL angelegt werden.
Zuerst wird eine Datenbank mit dem Namen - hier z.B. gallery
mit nachfolgendem Befehl angelegt:
# mysqladmin -u root -p create gallery Enter password:
Anschließend wird ein Benutzer und ein zum Benutzer dazugehöriges Passwort in MySQL hinterlegt, dieser Benutzer wird der Datenbank-Benutzer für Gallery sein:
# mysql gallery -u root -p -e "GRANT ALL ON gallery.* TO gallery_user@localhost IDENTIFIED BY 'geheim'" Enter password:
Konfiguration Webserver
Eine sehr elegante Art die Web-Anwendung in eine bestehende Apache-Webserver-Konfiguration einzubinden, ist die Definition eines Virtuellen Host in der Konfigurationsdatei /etc/httpd/conf.d/vhosts.conf
, die könnte wie folgt aussehen könnte:
# # gallery.tachtler.net # <VirtualHost *:80> ServerAdmin webmaster@tachtler.net ServerName gallery.tachtler.net ServerAlias www.gallery.tachtler.net ServerPath / DocumentRoot "/var/www/html/gallery" <Directory "/var/www/html/gallery"> Options FollowSymLinks -Indexes Order allow,deny Allow from all </Directory> DirectoryIndex index.php ErrorLog logs/gallery_error.log CustomLog logs/gallery_access.log combined </VirtualHost>
HINWEIS - Zu beachten ist hier, die Zeile mit dem Inhalt
- DirectoryIndex index.php - da hier die erste Seite der Anwendung ein PHP-Script ist!
Ein erneuter oder erster Start des Apache HTTP Server mit folgenden Befehl für eine erstmaligen Start
# service httpd start
oder einen erneuten Start des Apache HTTP Server mit folgendem Befehl
# service httpd restart
macht die oben beschriebenen Konfigurationen für den Apache HTTP Server wirksam.
Der Aufruf von Gallery kann nun mit nachfolgender URL aufgerufen werden.
Konfiguration
Die Konfiguration von Gallery2 erfolgt überwiegend über eine Web-Oberfläche, die hier wie folgt aufgerufen wird:
Nachfolgend sollte dann eine Bildschirmanzeige in Ihrem Browser wie folgt erscheinen:
Drücken Sie, hier nach Auswahl der Sprache den grünlichen [Installation starten]-Knopf.
WICHTIG - Vereinfacht kopieren Sie bitte die geforderte Zeichenkette vom Bildschirm Ihres Browsers und legen mit nachfolgendem Befehl eine Datei im Verzeichnis
/var/www/html/gallery
an und kopieren die Zeichenkette in diese Datei:
# vim /var/www/html/gallery/login.txt
Abschließend müssen noch die Dateirechte korrekt gesetzt werden, was mit nachfolgendem Befehl durchgeführt werden kann:
# chwon apache.apache /var/www/html/gallery/login.txt
Anschließend drücken Sie, den grünlichen [Authentifizier mich]-Knopf.
Anschließend drücken Sie, den grünlichen [Weiter zum Schritt 2]-Knopf.
HINWEIS - Die hier gezeigte Warnung bezieht sich auf den Parameter output_buffering
in der Datei /etc/php.ini
, welcher mit einem Buffer-Wert versehen ist (siehe relevanten Ausschnitt aus der /etc/php.ini
-Datei).
... output_buffering = 4096 ...
HINWEIS - Falls es zu Performance-Problemen kommen sollte, kann diese Einstellung wie folgt abgeändert werden:
... output_buffering = Off ...
Anschließend drücken Sie, den grünlichen [Weiter zum Schritt 3]-Knopf.
Anschließend drücken Sie, den grünlichen [Weiter zum Schritt 4]-Knopf.
HINWEIS - Die Anlage eines entsprechenden Verzeichnisses, außerhalb des ROOT-Verzeichnisses des Apache-Webserver kann mit nachfolgendem Befehl erfolgen:
# mkdir /var/ww/gdata
Abschließend müssen noch die Dateirechte korrekt gesetzt werden, was mit nachfolgendem Befehl durchgeführt werden kann:
# chwon -R apache.apache /var/www/gdata
Anschließend drücken Sie, den grünlichen [Speichern]-Knopf.
HINWEIS - Nachfolgende Ordner-Struktur sollte im neuen Ordner /var/www/gdata
einstanden sein, was mit nachfolgendem Befehl überprüft werden kann:
# ll -la /var/www/gdata total 36 drwxr-xr-x 8 apache apache 4096 Aug 4 10:39 . drwxr-xr-x 7 apache apache 4096 Aug 4 10:32 .. drwxr-xr-x 2 apache apache 4096 Aug 4 10:39 albums drwxr-xr-x 2 apache apache 4096 Aug 4 10:39 cache -rw-r--r-- 1 apache apache 166 Aug 4 10:39 .htaccess drwxr-xr-x 2 apache apache 4096 Aug 4 10:39 locks drwxr-xr-x 4 apache apache 4096 Aug 4 10:39 plugins_data drwxr-xr-x 3 apache apache 4096 Aug 4 10:39 smarty drwxr-xr-x 2 apache apache 4096 Aug 4 10:39 tmp
Anschließend drücken Sie, den grünlichen [Weiter zum Schritt 5]-Knopf.
Anschließend drücken Sie, den grünlichen [Speichern]-Knopf.
Anschließend drücken Sie, den grünlichen [Weiter zum Schritt 6]-Knopf.
Anschließend drücken Sie, den grünlichen [Erstellen]-Knopf.
Anschließend drücken Sie, den grünlichen [Weiter zum Schritt 7]-Knopf.
Anschließend drücken Sie, den grünlichen [Weiter zum Schritt 8]-Knopf.
Anschließend drücken Sie, den grünlichen [Weiter zum Schritt 9]-Knopf.
Anschließend drücken Sie, den grünlichen [Ausgewählte Module aktivieren]-Knopf.
Anschließend drücken Sie, den grünlichen [Weiter zum Schritt 10]-Knopf.
Anschließend drücken Sie, den grünlichen [Weiter zum Schritt 11]-Knopf.
Abschließend drücken Sie, den grünlichen [Gehe zu meiner Gallery!]-Knopf.
Konfiguration LDAP-Authentifizierung
Nachfolgend soll beschrieben werden, wie die Authentifizierung der Anmeldung wie im nachfolgendem Bildschirm dargestellt, gegen LDAP hier z.B. für OpenLDAP realisiert werden kann.
WICHTIG - Ein lauffähiger LDAP-Server, wie hier beschrieben –> LDAP muss verfügbar sein!
WICHTIG - Die Benutzer von Gallery müssen auch im LDAP angelegt sein!
HINWEIS - Quelle für nachfolgende Beschreibung ist –> LDAP UserLogin for Gallery 2.3
Im wesentlich muss eine Datei innerhalb von Gallery getauscht werden, was mit nachfolgenden Befehlen durchgeführt werden kann.
Aus Sicherheitsgründen soll zuerst eine Kopie der zu tauschenden Datei innerhalb von Gallery2 erstellt werden, was mit nachfolgendem Befehl durchgeführt werden kann.
Die Datei um die es sich handelt ist
/var/www/html/gallery/modules/core/UserLogin.inc
# cp -a /var/www/html/gallery/modules/core/UserLogin.inc /var/www/html/gallery/modules/core/UserLogin.inc_orig
Der Inhalt der neuen zu tauschenden Datei sieht so aus:
<?php /* * Gallery - a web based photo album viewer and editor * Copyright (C) 2000-2007 Bharat Mediratta * * 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. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ /** * This controller will handle a user logging in to Gallery * @package GalleryCore * @subpackage UserInterface * @author Bharat Mediratta <bharat@menalto.com> * @version $Revision: 15955 $ */ class UserLoginController extends GalleryController { /** * ValidationPlugin instances to use when handling this request. Only used by test code. * * @var array $_plugins (array of GalleryValidationPlugin) * @access private */ var $_pluginInstances; /** * Tests can use this method to hardwire a specific set of plugin instances to use. * This avoids situations where some of the option instances will do unpredictable * things and derail the tests. * * @param array $pluginInstances of GalleryValidationPlugin */ function setPluginInstances($pluginInstances) { $this->_pluginInstances = $pluginInstances; } /** * @see GalleryController::isAllowedInMaintenance */ function isAllowedInMaintenance() { return true; } /** * @see GalleryController::handleRequest */ function handleRequest($form) { global $gallery; $results = array(); $error = array(); if (isset($form['action']['login'])) { if (empty($form['username'])) { $error[] = 'form[error][username][missing]'; } if (empty($form['password'])) { $error[] = 'form[error][password][missing]'; } if (empty($error)) { list ($ret, $isDisabled) = GalleryCoreApi::isDisabledUsername($form['username']); if ($ret) { return array($ret, null); } if ($isDisabled) { $error[] = 'form[error][username][disabled]'; } } if (empty($error)) { list ($ret, $user) = GalleryCoreApi::fetchUserByUsername($form['username']); if ($ret && !($ret->getErrorCode() & ERROR_MISSING_OBJECT)) { return array($ret, null); } /* LDAP Code begin */ $ldapRet = $this->ldapAuthentication($form['username'],$form['password']); if ($ldapRet && !is_array($ldapRet)) { // any error with LDAP connection. $error[] = "form[error]$ldapRet"; } else if(is_array($ldapRet)){ // User found: // At first login, create new User if (!isset($user)) { list ($ret, $user) = GalleryCoreApi::newFactoryInstance('GalleryEntity', 'GalleryUser'); if ($ret) { return array($ret, null); } if (!isset($user)) { return array(GalleryCoreApi::error(ERROR_MISSING_OBJECT), null); } $ret = $user->create($username); if ($ret) { // this should never happen: if (!($ret->getErrorCode() & ERROR_COLLISION)) { return array($ret, null); } // Set our error status and fall back to the view $error[] = 'form[error][userName][exists]'; } } // set the users properties and save them: $user->setEmail($ldapRet['email']); $user->setFullName($ldapRet['fullName']); $user->changePassword($ldapRet['password']); GalleryCoreApi::acquireWriteLock($user->getId()); $ret = $user->save(); GalleryCoreApi::releaseLocks($user->getId()); if ($ret) { return array($ret, null); } } else { // User not found in LDAP should not be a problem: normal user autentication } /* LDAP Code end */ GalleryUtilities::unsanitizeInputValues($form['password'], false); $isCorrect = (isset($user) && $user->isCorrectPassword($form['password'])); /* Prepare for validation */ $options = array('pass' => $isCorrect); list ($ret, $options['level']) = GalleryCoreApi::getPluginParameter('module', 'core', 'validation.level'); if ($ret) { return array($ret, null); } if ($options['level'] == 'MEDIUM') { $options['key'] = 'core.UserLogin.' . $form['username']; } if ($options['level'] == 'OFF') { $pluginInstances = array(); } else if (isset($this->_pluginInstances)) { $pluginInstances = $this->_pluginInstances; } else { list ($ret, $pluginInstances) = GalleryCoreApi::getAllFactoryImplementationIds('GalleryValidationPlugin'); if ($ret) { return array($ret, null); } foreach (array_keys($pluginInstances) as $pluginId) { list ($ret, $pluginInstances[$pluginId]) = GalleryCoreApi::newFactoryInstanceById('GalleryValidationPlugin', $pluginId); if ($ret) { return array($ret, null); } } } /* Let each plugin do its verification */ foreach ($pluginInstances as $plugin) { list ($ret, $pluginErrors, $continue) = $plugin->performValidation($form, $options); if ($ret) { return array($ret, null); } $error = array_merge($error, $pluginErrors); if (!$continue) { break; } } } if (empty($error)) { if ($isCorrect) { $gallery->setActiveUser($user); $event = GalleryCoreApi::newEvent('Gallery::Login'); $event->setEntity($user); list ($ret, $redirect) = GalleryCoreApi::postEvent($event); if ($ret) { return array($ret, null); } /* Redirect if requested by event listener, otherwise return */ if (!empty($redirect)) { $results['redirect'] = array_shift($redirect); } else { $results['return'] = 1; } } else { $error[] = 'form[error][invalidPassword]'; } } if (!empty($error)) { if (!empty($form['username'])) { $event = GalleryCoreApi::newEvent('Gallery::FailedLogin'); $event->setData(array('userName' => $form['username'])); list ($ret, $ignored) = GalleryCoreApi::postEvent($event); if ($ret) { return array($ret, null); } } } } else if (isset($form['action']['cancel'])) { $results['return'] = 1; } if (!empty($error)) { $results['delegate']['view'] = 'core.UserAdmin'; $results['delegate']['subView'] = 'core.UserLogin'; } $results['status'] = array(); $results['error'] = $error; return array(null, $results); } /* LDAP Code begin */ public function ldapAuthentication($username, $password) { $ldap = array('ldaphost' => 'ldap://ldap.domain.com', 'domain' => 'domain.com', 'dn' => 'ou=Users,dc=domain,dc=com', 'binduser' => 'CN=Proxy,ou=Users,dc=domain,dc=com', 'bindpass' => 'proxypassword' ); // Open LDAP connection to server $ldapconn = ldap_connect($ldap['ldaphost']); ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3); ldap_set_option($ldapconn, LDAP_OPT_REFERRALS, 0); // Bind with binduser as proxy to do the search $proxyBind = ldap_bind($ldapconn, $ldap['binduser'], $ldap['bindpass']); if (!$proxyBind) { return "[invalidLDAPProxy]"; } // search for the supplied username in the base DN $ldapSearchResult = ldap_search($ldapconn, $ldap['dn'], "(sAMAccountName=".$username.")" , array( "*" )); $ldapEntries = ldap_get_entries($ldapconn, $ldapSearchResult); if ($ldapEntries["count"] < 1) { return null; } $userdn = $ldapEntries[0]["dn"]; //use the found DN to bind again $userBind = ldap_bind($ldapconn, $userdn, $password); if (!$userBind) { return "[invalidPassword]"; } $user_info = array(); $user_info['fullName'] = $ldapEntries[0]["givenname"][0]." ".$ldapEntries[0]["sn"][0]; $user_info['email'] = $ldapEntries[0]["mail"][0]; $user_info['password'] = $password; ldap_unbind($ldapconn); return $user_info; } /* LDAP Code end */ } /** * This view prompts for login information */ class UserLoginView extends GalleryView { /** * @see GalleryView::loadTemplate */ function loadTemplate(&$template, &$form) { global $gallery; /* Check if the default login view URL has been overridden and redirect appropriately */ $loginRedirect = $gallery->getConfig('loginRedirect'); if (!(isset($loginRedirect['subView']) && $loginRedirect['subView'] == 'core.UserLogin') && !empty($loginRedirect)) { /* Do not redirect if we are logged in already */ list ($ret, $isGuest) = GalleryCoreApi::isAnonymousUser(); if ($ret) { return array($ret, null); } $phpVm = $gallery->getPhpVm(); $urlGenerator =& $gallery->getUrlGenerator(); if ($isGuest && !$phpVm->headers_sent()) { $redirectUrl = $urlGenerator->generateUrl($loginRedirect, array('forceSessionId' => false, 'forceFullUrl' => true)); $phpVm->header("Location: $redirectUrl"); $phpVm->exit_(); } } if ($form['formName'] != 'UserLogin') { $form['formName'] = 'UserLogin'; $form['username'] = ''; /* * When logging in we don't have a session yet, thus no navigation history / a place * to store the returnUrl. Thus store the returnUrl in the login form */ $returnUrl = GalleryUtilities::getRequestVariables('return'); $form['returnUrl'] = !empty($returnUrl) ? $returnUrl : ''; } $template->setVariable('controller', 'core.UserLogin'); return array(null, array('body' => 'modules/core/templates/UserLogin.tpl')); } } ?>
WICHTIG - Die Datei beinhaltet auch die LDAP Spezifikationen und muss daher angepasst werden !
Folgende Anpassungen an der Datei /var/www/html/gallery/modules/core/UserLogin.inc
sind noch durchzuführen (nur relevanter Ausschnitt) –> in etwa bei Zeile 228
:
... public function ldapAuthentication($username, $password) { /* Tachtler */ /* default $ldap = array('ldaphost' => 'ldap://ldap.domain.com', 'domain' => 'domain.com', 'dn' => 'ou=Users,dc=domain,dc=com', 'binduser' => 'CN=Proxy,ou=Users,dc=domain,dc=com', 'bindpass' => 'proxypassword' */ $ldap = array('ldaphost' => 'ldap://ldap.tachtler.net', 'domain' => 'tachtler.net', 'dn' => 'dc=tachtler,dc=net', 'binduser' => 'CN=Ersatzauthetifizerungsbenutzer,dc=tachtler,dc=net', 'bindpass' => 'geheim' ); ...
HINWEIS - Ein Benutzer der in Gallery2 angelegt ist, kann auch im OpenLDAP angelegt werden, ein Benutzer der in OpenLDAP angelegt ist muss in Gallery2 angelegt werden, da hier kein Abgleich der Benutzer statt findet !