Kategorien
Programmierung

LDAP-Suche schlägt bei Namen mit Umlauten fehl

Solange ein Benuztername keinen Umlaut besitzt, kann man den Datensatz Daten mit dem Perl-Modul Net::LDAP recht einfach aus dem Active Directory auslesen:

use Net::LDAP;
$loginUser = Win32::LoginName();

$ldap = Net::LDAP->new($ldapServer) or die "$0";
$ldap->bind($ldapUser, $ldapPass});
$ldap_base = 'OU=Users';
$ldap_results = $ldap->search(base => $ldapBase, filter => "sAMAccountName=$loginUser");

if ($ldap_results->count) {
    # was ganz tolles mit dem Datensatz anstellen
}

Sofern aber ein Umlaut in dem Login-Namen steckt, so schlägt die Suche nach „benjamin.tröt“ fehl, obwohl ein entsprechender sAMAccountName im Active Directory vorhanden ist.

Eine einfache Lösung bietet der Beitrag „Windows logon behavior if your user name contains characters that have accents or other diacritical marks„, welcher – auf das Login bezogen – folgende Ausweichmöglichkeit skizziert:

If your user name in the Active Directory directory service contains one or more characters that have accents or other diacritical marks, you may find that you do not have to use the diacritical mark as you type your user name to log on to Windows. You can log on by using the simple form of the character or characters. For example, if your user name in Active Directory is jésush, you can type jesush in the User name box in the Log On to Windows dialog box to log on to Windows.

Interessanterweise funktioniert dies auch bei LDAP-Anfragen im Active Directory, so daß eine Suche nach dem sAMAccountName „benjamin.trot“ zum gewünschten Datensatz führt.

Stellt sich die Frage, was passiert, wenn tatsächlich ein Benjamin Trot neben seinem Kollegen Tröt Platz nimmt …

Kategorien
Programmierung

Firefox ignoriert charset=UTF-8

Ein Perl-Skript stellt sein UI als Website mit Hilfe des Moduls HTTP::Server::Simple zur Verfügung. Eigentlich sollte ein

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

im Header-Bereich ausreichen, um anzuzeigen, daß die Daten in UTF-8 kodiert sind. Firefox weigerte sich hartnäckig und benutze immer den Default „windows-1252“ zur Darstellung, was alle Umlaute bis zur Unkenntlichkeit verstümmelte.

Erst durch Mitsenden der Zeichenkodierung im Header

print $cgi->header(
	-nph => 1,
	-status => '200 OK',
	-type => 'text/html',
	-charset => 'UTF-8'
);

ließ sich Firefox überreden, die Seite auch tatsächlich als UTF-8 darzustellen.

Kategorien
Programmierung

Experimental keys on scalar is now forbidden

Nach einem Wechsel der Interpreter- oder Compilerversion stolpert die neue Version ab und an über Dinge, die bisher problemlos verarbeitet wurden. Im aktuellen Fall mag Perl 5.28 eine Zeile nicht mehr, die von Perl 5.14 noch problemlos verarbeitet wurde:

Die fragliche Zeile

foreach $type ( keys $phonebook{ $entry } ) {

wird nur noch mit einem

Experimental keys on scalar is now forbidden at scriptname.pl line 123.
Type of arg 1 to keys must be hash or array (not hash element) at scriptname.pl line 123, near "} ) "
Execution of fritzphone.pl aborted due to compilation errors.

und das, obwohl es sich bei „%phonebook“ um einen Hash handelt. Die Lösung des Problems ist glücklicherweise recht einfach und schnell erledigt

foreach $type ( keys %{ $phonebook{ $entry } } ) {

in dem der von „keys“ auszuwertende Eintrag mit „%{ … }“ als Hash gekennzeichnet wird

Kategorien
Programmierung

Aktuelles Verzeichnis nicht mehr Teil von @INC

Gerade beim Wechsel zwischen verschiedenen Perl-Versionen über ein Feature (und keinen Bug) gestolpert: seit Version 5.26 ist das aktuelle Verzeichnis nicht mehr im Standard-Include-Pfad @INC enthalten.

Als Grund hierfür gibt perldelta zur Version 5.26 unschöne Begleiterscheinungen der bisherigen Vorgehensweise an:

While convenient, this has security implications: for example, where a script attempts to load an optional module when its current directory is untrusted (such as /tmp), it could load and execute code from under that directory.

Der Beitrag listet auch einige Möglichkeiten auf, wie man das bisherige Verhalten auf sicherem Weg wiederherstellen kann.

Wer es (quick & dirty) genauso unsicher wie vorher haben will, kann auch

use Cwd qw(abs_path);
use File::Basename qw(dirname);
use lib dirname(abs_path(__FILE__));

in seinem Skript verwenden.

Kategorien
Programmierung

Bytefolge mit Perl ersetzen

Die Funktionen, die Perl für das Suchen und Ersetzen innerhalb von Strings bereitstellt, lassen sich auch hervorragend dazu verwenden, Bytefolgen innerhalb von Binärdaten zu bearbeiten.

Mittels der pack-Funktion wird die zu suchende Bytefolge in einer Variable gespeichert

$source = pack("C*", 0x00, 0x40, 0x06, 0x00, 0x00, 0xB0, 0x04, 0x00);

Deren Position innerhalb der zu durchsuchenden Daten kann durch die Funktion index ermittelt

$pos = index($data, $source);

und ggf. auch mit einer Ziel-Bytefolge mit Hilfe der Funktion subst ersetzt werden

substr($data, $pos, length($dest), $dest);