Benutzer-Werkzeuge

Webseiten-Werkzeuge


tachtler:gallery2

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
  • 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:

Gallery2 Installation - Schritt 1

Drücken Sie, hier nach Auswahl der Sprache den grünlichen [Installation starten]-Knopf.

Gallery2 Installation - Schritt 2

:!: 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.

Gallery2 Installation - Schritt 3

Anschließend drücken Sie, den grünlichen [Weiter zum Schritt 2]-Knopf.

Gallery2 Installation - Schritt 4

:!: 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.

Gallery2 Installation - Schritt 5

Anschließend drücken Sie, den grünlichen [Weiter zum Schritt 4]-Knopf.

Gallery2 Installation - Schritt 6

:!: 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.

Gallery2 Installation - Schritt 7

:!: 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.

Gallery2 Installation - Schritt 8

Anschließend drücken Sie, den grünlichen [Speichern]-Knopf.

Gallery2 Installation - Schritt 9

Anschließend drücken Sie, den grünlichen [Weiter zum Schritt 6]-Knopf.

Gallery2 Installation - Schritt 10

Anschließend drücken Sie, den grünlichen [Erstellen]-Knopf.

Gallery2 Installation - Schritt 11

Anschließend drücken Sie, den grünlichen [Weiter zum Schritt 7]-Knopf.

Gallery2 Installation - Schritt 12

Anschließend drücken Sie, den grünlichen [Weiter zum Schritt 8]-Knopf.

Gallery2 Installation - Schritt 13

Anschließend drücken Sie, den grünlichen [Weiter zum Schritt 9]-Knopf.

Gallery2 Installation - Schritt 14

Anschließend drücken Sie, den grünlichen [Ausgewählte Module aktivieren]-Knopf.

Gallery2 Installation - Schritt 15

Anschließend drücken Sie, den grünlichen [Weiter zum Schritt 10]-Knopf.

Gallery2 Installation - Schritt 16

Anschließend drücken Sie, den grünlichen [Weiter zum Schritt 11]-Knopf.

Gallery2 Installation - Schritt 17

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!

Gallery - Anmelden

:!: 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 !

Diese Website verwendet Cookies. Durch die Nutzung der Website stimmen Sie dem Speichern von Cookies auf Ihrem Computer zu. Außerdem bestätigen Sie, dass Sie unsere Datenschutzbestimmungen gelesen und verstanden haben. Wenn Sie nicht einverstanden sind, verlassen Sie die Website.Weitere Information
tachtler/gallery2.txt · Zuletzt geändert: 2012/08/29 12:17 von klaus