ProFTPd mit mySQL-Anbindung auf Ubuntu einsetzen

ProFTPd ist einer der meistgenutzten FTP-Server auf Ubuntu-Systemen. Aus der Dose kann er jedoch nur mit Systembenutzern umgehen, was mitunter einen recht großen Pflegeaufwand mit sich bringt.
Daher erfreut sich die MySQL-basierte Variante großer Beliebtheit.
Noch einfacher in der Bedienung wird es, wenn man dem ProFTPd gleich die GID und UID des Webservers (meistens Apache2) übergibt, sodass die Dateirechte von Anfang an stimmen.

Die Installation ist mit wenigen Schritten durchgeführt:

Schritt 1: Die benötigten Pakete installieren

sudo apt-get install proftpd-basic proftpd-mod-mysql

Schritt 2: Apassungen in /etc/proftpd/proftpd.conf
I.d.R. verlangt ProFTPd Systembenutzer, diese Abhängigkeit muss aufgelöst und ProFTPd der Umgang mit MySQL beigebracht werden.
Dazu müssen die folgenden Zeilen in der mitgelieferten Konfiguration einkommentiert werden.

DefaultRoot ~
Include /etc/proftpd/sql.conf
RequireValidShell off

# SQLMinID legt die kleinste mögliche ID fest. Um ProFTPd mit dem Apache2 zu verknüpfen und dessen GID und UID meistens "33" lautete, muss dieser Wert 
# explizit definiert werden, Standard = 999. Ohne diesen Eintrag wären Uploads und Änderungen nicht möglich das sie zu Fehlern in der Berechtitigung führen würden und nur
# über ein chmod 777 umgangen werden könnten
SQLMinID 33

Schritt 3: Die Datenbank vorbereiten
Man legt nun eine MySQL-Datenbank an, z.B. “proftpd”

CREATE DATABASE `proftp` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

In dieser Datenbank werden zwei Tabellen angelegt, eine für die Benutzergruppen, eine für die Benutzer selbst

CREATE TABLE IF NOT EXISTS `ftpgroup` (
  `groupname` varchar(16) NOT NULL DEFAULT '',
  `gid` smallint(6) NOT NULL DEFAULT '33',
  `members` varchar(16) NOT NULL DEFAULT '',
  KEY `groupname` (`groupname`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='ProFTP Benutzergruppen';
CREATE TABLE IF NOT EXISTS `ftpuser` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `userid` varchar(32) NOT NULL DEFAULT '',
  `passwd` varchar(32) NOT NULL DEFAULT '',
  `uid` smallint(6) NOT NULL DEFAULT '33',
  `gid` smallint(6) NOT NULL DEFAULT '33',
  `homedir` varchar(255) NOT NULL DEFAULT '',
  `shell` varchar(16) NOT NULL DEFAULT '/sbin/nologin',
  `count` int(11) NOT NULL DEFAULT '0',
  `accessed` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `modified` timestamp NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`id`),
  UNIQUE KEY `userid` (`userid`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='ProFTP user table' AUTO_INCREMENT=3 ;

Sinnvollerweise definiert man für die soeben angelegte Datenbank einen exklusiven Benutzer, z.B. “proftpd”

Schritt 4: Module in ProFTPd einbinden
In /etc/proftpd/modules.conf müssen nun die folgenden Zeilen einkommentiert werden

LoadModule mod_sql.c
LoadModule mod_sql_mysql.c

Schritt 5: ProFTPd die Kommunikation mit MySQL beibringen
In der Modulkonfiguration /etc/proftpd/sql.conf (diese enthält bei einer Installation aus dem Repository schon jede Menge auskommentierte Einträge, die man getrost ignorieren kann) werden nun innerhalb des Abschnitts [...] die notwendigen Optionen definiert:

SQLBackend mysql
SQLAuthTypes Crypt
SQLConnectInfo [Datenbankname]@localhost [Benutzername] [Passwort]
SQLUserInfo ftpuser userid passwd uid gid homedir shell
SQLGroupInfo ftpgroup groupname gid members
# Den Zeitpunkt des letzten Logins aktualisieren
SQLLog PASS updatecount
SQLNamedQuery updatecount UPDATE "count=count+1, accessed=now() WHERE userid='%u'" ftpuser
SQLLog STOR,DELE modified
SQLNamedQuery modified UPDATE "modified=now() WHERE userid='%u'" ftpuser

Schritt 6: Benutzer anlegen
Die beiden Tabellen mit einer Benutzergruppe und einem Benutzer füllen (hier am Beispiel des Benutzers www-data für den Apache2).

INSERT INTO `ftpgroup` (`groupname`, `gid`, `members`) VALUES ('www-data', 33, 'www-data');
INSERT INTO `ftpuser` (`id`, `userid`, `passwd`, `uid`, `gid`, `homedir`, `shell`, `count`, `accessed`, `modified`) VALUES ('', 'ftpuser', ENCRYPT('password'), 33, 3, '/var/www/default/', '/sbin/nologin', 0, '', '');

Damit kann sich der Benutzer “ftpuser” nun mit dem Passwort “password” anmelden und erhält Zugriff auf /var/www/default/ und dessen Unterverzeichnisse.

Schritt 7: ProFTPd neu starten

sudo /etc/init.d/proftpd restart

Sollte ProFTPd nicht neu starten, kann man es mithilfe von

proftpd -nd6

manuell starten. So erhält man Debug-Informationen die einem bei der Ursachenforschung helfen können.

Ansonsten sind auch die Einträge im ProFTPd-Log unter

/var/log/proftpd/proftpd.log

mitunter sehr hilfreich.

jfmulticontent nur Inline Elemente zur Auswahl geben

Wir wollen den Redakteuren die Auswahl der “richtigen” Inhalte etwas vereinfachen und stellen Ihnen defaultmäßig nur die Inline Elemente zur Verfügung:

Im Page TSConfig wird folgendes eingefügt:

TCEFORM.tt_content.tx_jfmulticontent_view.removeItems := addToList(page,content)

Jetzt fehlt uns nur noch das Überschreiben des eigentlichen Default Wertes um die unschöne Meldung “Invalid value” zu entfernen.

Einfach ins User-TS oder Group-TS

TCAdefaults.tt_content.tx_jfmulticontent_view = irre

Und schon hat der Redakteur nur noch die Inline Elemente zur Auswahl.

MySQL FROM_UNIXTIME und negative Timestamps

Seit der MySQL-Version 4 liefert die Funktion FROM_UNIXTIME([UNIX-Timestamp) für negative UNIX-Timestamps "NULL" zurück. Das ist natürlich unschön, da manche Datums-Funktionen über MySQL wesentlich schneller und einfacher zu realisieren sind als bspw. mit PHP.

Abhilfe schafft hier ein kleiner Umweg über die Funktion DATE_ADD(). Diese ermöglicht es, einem beliebigen Datum eine zu definierende Zeitspanne hinzuzuaddieren.

Statt nun also der Funktion FROM_UNIXTIME() die Spalte mit dem UNIX-Timestamp als Parameter zu übergeben, kann man mit

DATE_ADD(FROM_UNIXTIME(0),INTERVAL [Spalte mit dem UNIX-Timestamp] SECOND)

dafür sorgen, dass man stets den korrekten Wert auch für Daten vor dem 01.01.1970 erhält.

Subheader im Backend anzeigen (falls nicht default eingestellt)

Folgendes in die pageConfigTS einfügen:

TCEFORM.tt_content.subheader.disabled = 0

Jetzt muss noch die extTables angepasst werden:

t3lib_extMgm::addFieldsToPalette('tt_content','header','--linebreak--,subheader;LLL:EXT:cms/locallang_ttc.xml:subheader_formlabel','after:header');

Und zu guter Letzt, diese Zeilen ins setup.ts (TYPO3 6.0)

lib.stdheader.20 = TEXT
lib.stdheader.20 {
 field = subheader
 wrap = <h2>|</h2>

 if >
 if.isTrue.field = subheader
}

Schriftlizenzen und Fontnutzung

Im Moment wird immer häufiger der Wunsch nach anderen Schriftarten auf der Website, die nicht unter die Standardschriften fallen geäußert.
Eine Recherche im Netz ergab zwei sehr interessante Artikel zum Thema Schriftlizenzen und die Nutzung der Fonts im Web sowie im Print Bereich.

Hier die beiden Links zu den Artikeln:

Herzlichen Dank an den Autor!