Posts Tagged ‘hack’

Bilder mit css nicht vergrößern

Ich habe in meinen Blog inzwischen auch Bilder und ich nutze die NextGEN Gallery. Aus Platzgründen verkleinere ich die Bilder. Die Bilder, welche im Hochformat sind sehen einfach grausam aus, da sie stark vergrößert werden. Durch den folgenden Hack im css werden die Bilder nicht mehr vergrößert. Dazu muss man die Datei nextgen-gallery/css/nggallery.css wie folgt ändern:

.ngg-imagebrowser img {
    border: 1px solid #A9A9A9;
    display: block !important;
    margin: 10px auto;
    max-width: 100%;
    padding: 5px;
}

Achtung: Die Änderung geht bei einen automatischen Update des Plugins verloren!

OpenIndiana und erste Erfahrungen

Ich habe es endlich geschafft: ein Update auf OpenIndiana Im großen und ganzen kann man es einigermaßen benutzen. Die Lokalisierung ist mehr als schlecht. Das meiste kann man irgendwie fixen

Update auf OpenIndiana

Man findet hier auch die orginale Anleitung zum Update.

  1. update auf Build 134 bzw. Build 134 booten (wie man bootet zeige ich nicht ;-) )
    rennecke@walhalla ~ % pfexec pkg install SUNWipkg SUNWipkg-um SUNWipkg-gui
    rennecke@walhalla ~ % pfexec pkg set-publisher -O http://pkg.openindiana.org/legacy opensolaris.org
    rennecke@walhalla ~ % pfexec pkg image-update
  2. Update auf OpenIndiana
    rennecke@walhalla ~ % pfexec pkg set-publisher --non-sticky opensolaris.org
    rennecke@walhalla ~ % pfexec pkg set-publisher -p http://pkg.openindiana.org/dev
    rennecke@walhalla ~ % pfexec pkg set-publisher -P openindiana.org
    rennecke@walhalla ~ % pfexec pkg uninstall entire
    rennecke@walhalla ~ % pfexec pkg uninstall thunderbird # das Paket konnte ich nicht updaten
    rennecke@walhalla ~ % pfexec pkg uninstall songbird    # das Paket konnte ich nicht updaten
    rennecke@walhalla ~ % pfexec pkg image-update

Troubleshooting

  • Ich bekomme folgende Fehler
    rennecke@walhalla ~ % pfexec pkg image-update
    DOWNLOAD                                  PKGS       FILES    XFER (MB)
    mail/thunderbird                       183/838  8825/40200  120.2/648.9  
     
    Fehler beim Abrufen von Paket oder Dateidaten für
    den angeforderten Vorgang.
    Details folgen:
     
    Invalid content path usr/lib/thunderbird/thunderbird-bin: chash failure: expected: 64fd9c1561c244e0563dfc675dbd3a8c3c86f469 computed: 9179b65e28cc293105c6368ee818f1729eb7f991. (happened 4 times)

    oder

    rennecke@walhalla ~ % pfexec pkg image-update
    DOWNLOAD                                  PKGS       FILES    XFER (MB)
    mail/thunderbird                       190/838  7945/40200  131.8/648.9  
     
    Errors were encountered while attempting to retrieve package or file data for
    the requested operation.
    Details follow:
     
    Framework error: code: 18 reason: transfer closed with 13603900 bytes remaining to read
    URL: 'http://pkg.openindiana.org/dev/file/0/c5df73fea1fb6f63f0f17cf5e996e8525fc1a4f4'. (happened 4 times)

    Dann einfach das betreffende Paket deinstallieren und später wieder installieren.

  • Firefox und Thunderbird gehen nicht. Das Problem ist die Lokalisierung.


    rennecke@walhalla ~ % export LANG=C
    rennecke@walhalla ~ % firefox &
  • Ich habe das falsche Tastaturlayout
    rennecke@trantor ~ $ setxkbmap de           # setzt das persönlich Layout auf de
    rennecke@trantor ~ $ cat .Xkbmap            # Datei wird ausgewertet, beim starten der Sitzung
    de

    Die ganzen anderen Möglichkeiten (welche solaristypisch sind) haben bei mir nicht funktioniert.

  • Enigmail bei Thunderbird funktioniert nicht mehr. Einfach auf der Webseite das Plugin herunter laden und installieren

“Sichere” Captchas programmieren

Man möchte manchmal Teile seiner Seite mittels Captchas schützen. Es gibt zahlreiche fertige Varianten, auch für wordpress. Diese haben fast immer den Nachteil, dass sie JavaScript, Flash, oder Sessions benutzen. Persönlich habe ich eine Abneigung gegen JavaScript und Flash. Sessions lassen sich nicht immer nachträglich nutzen und man erzeugt serverseitig etwas Last. Fakt ist, dass ich keine Sessions mag! Das schlimmste an fertigen Captcha-Lösungen ist der zum Teil invalide html-Code. Ich möchte validen xhtml 1.0 strict-Code haben und das Captcha sollte in mein Design passen. Wenn man die ganzen Anforderungen erfüllt haben möchte, so muss man wohl oder übel sein Captcha selbst programmieren.

Wie komme ich zum sicheren Captcha

Wenn ich auf Sessions verzichten möchte, so muss ich die Lösung des Captcha mit auf die Seite schreiben. Das kann man in einen nicht sichtbaren Feld machen. Damit man dieses Feld nicht so einfach auslesen kann, schreibt man einen Hash hinein bzw. man verschlüsselt den Inhalt.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
define(KEY, "Ich bin ein Key");
define(IV, "KlyV6gxG3MOPzlfuj8azF6sKKTnsdsiN58i0zjHA0EU=");
 
function Crypt($plaintext){
    $td = mcrypt_module_open('rijndael-256', '', 'ofb', '');
 
    $iv = base64_decode(IV);
    $ks = mcrypt_enc_get_key_size($td);
 
     /* Create key */
    $key = substr(md5(KEY), 0, $ks);
 
    /* Intialize encryption */
    mcrypt_generic_init($td, $key, $iv);
 
    /* Encrypt data */
    $encrypted = mcrypt_generic($td, $plaintext);
 
    /* Terminate decryption handle and close module */
    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);
 
    return base64_encode($encrypted);
}
 
function Decrypt($chiffre){
    $td = mcrypt_module_open('rijndael-256', '', 'ofb', '');
 
    $iv = base64_decode(IV);
    $ks = mcrypt_enc_get_key_size($td);
 
     /* Create key */
    $key = substr(md5(KEY), 0, $ks);
 
    $chiffre = base64_decode($chiffre);
    mcrypt_generic_init($td, $key, $iv);
    $plaintext = mdecrypt_generic($td, $chiffre);
 
    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);
 
    return $plaintext;
}
 
function draw_captcha_form(){
    .....
    $time = time() + 60*30;
    $captchaSolution = "Test"
    echo "\t\n\tBitte Captcha lösen<br/>\n";
    // erzeuge ein Captcha
    echo "\t\n";
    echo "\t" . '
<input name="captvalue" id="captvalue" value="" size="40" tabindex="4" type="text"/>' . "\n";
    echo "\t"    . '
<input name="captcha" value="'. Crypt($time . "~" . $captchaSolution . "~" . $REMOTE_ADDR) . '" type="hidden"/>' . "\n";
}
 
function check_post($) {
    ....
    $captcha = $_POST['captvalue'];
    list($timeOld, $secret, $addr) = explode('~',Decrypt($_POST['captcha']));
    ....
    if($timeOld <= time()){
            echo "Deine Zeit ist abgelaufen";
            return;
    }
    if($addr != $REMOTE_ADDR){
            echo "Falsche IP";
            return;
    }
    if($secret != $captcha){
            echo "Falsches Captcha";
            return;
    }
    .....
}

Mit diesen Ideen kann man sich nun sein eigenes Captcha zusammen bauen. Ich generiere z.B. Matheaufgaben.

Captcha

Ich habe mir ein neues Captcha-Plugin gebaut. Dieses besteht aus netten Matheaufgaben. Diese gehen immer glatt auf. Ich muss noch etwas an dem Plugin pfeilen. Sagt mir was ihr davon haltet. Die Aufgaben werden via \LaTeX erzeugt.

Ich habe das Plugin etwas geändert, da Martin meinte es zu knacken…

Gut Martin hat es wieder geschafft, auf die offensichtliche Art. Er ließt meine alt bzw. title-Attribute aus, welche meine Seite barrierefrei machen. Für das parsen hat er sich 3 Bier verdient

Wie ärgere ich mein zfs

zfs hat den Ruf, dass es unzerstörbar ist. Ab und zu hört man, dass User xy sein zfs kaputt bekommen hat und meint, dass zfs nicht mehr kann als sein altes Dateisystem. Wenn man sich mal ansieht, was der User xy gemacht hat, dann bemerkt der aufmerksame Systemheld, dass man mit derartigen Attacken auch Enterprise Storage-Systeme im Wert von mehreren Millionen kaputt bekommt.

Was kann zfs nicht

  • im laufenden Betrieb mehr Plattenausfälle verkraften als die zur Verfügung stehende Redundanz
  • im laufenden Betrieb mehr Platten tauschen, als man Redundanz hat
  • mit kaputten Platten laufen

Auch wenn es zu den einen oder andern Punkt abweichende Behauptungen gibt, so muss ich hier ausdrücklich sagen, dass ein solches Verhalten im Allgemeinen Fall unmöglich ist. Es kann hingegen sein, dass man aus einem zerstörten zpool noch Daten retten kann. Das funktioniert aber nur mit Glück.

Was kann zfs

Das folgende habe ich auf einer Sun Enterprise E450 und einem StorEdge D1000 ausprobiert. Im StorEdge hatte ich einen bunten Mix aus 36 GB und 18 GB Platten. Das folgende sollte man nicht an einem Produktivsystem ausprobieren! Bei den Testläufen habe ich /dev/random bzw. /dev/zero in eine Datei, auf den betreffenden zpool geschrieben.

  • Sämtliche Schweinereien mit den Platten gehen, solange man die Redundanz einhält.
  • Die Platten vom Strom trennen oder ein Systemabsturz provozieren. Das zfs überlebt das alles und bleibt konsistent
  • Wenn das System herunter gefahren ist, alle Platten des nicht exportierten zpool mischen. Das ärgert das zfs schon sehr,
    ich musste meinen zpool exportieren und wieder importieren, damit alles wieder korrekt funktioniert hat
  • Aus einen buten Plattenmix ein raidz bzw. ein raidz2 bauen. Das macht aber aus Performancesicht keinen Sinn.
  • Im laufenden Betrieb eine Platte wechseln (wenn man Redundanz hat)

Das war eigenlich alles, was ich mit zfs probiert habe. Ich hatte nicht mehr dumme Ideen. zfs verhält sich auf Dateien anderst als auf echten Devices. Was daran liegt, dass Dateien evtl. noch im Cache sind. Jeder, der die Möglichkeit hat, sollte einige Szenarien vorher einmal ausprobieren.

Java-Applet – eine sinnfreie Erfindung

Ich kam leider nicht herum einmal ein Java-Applet auszuführen. Mein Firefox hat sich geweigert und meinte, dass es kein entsprechendes Plugin gibt. Das ganze ist mir auf meinen aktuellen Open Solaris (64-Bit Intel) und meinem Solaris 10 auf Ultrasparc (64-Bit) passiert. Auf beiden Systemen ist das aktuelle JDK installiert. Auf meinen Open Solaris-System habe ich außerdem das Package web/browser/firefox/plugin/firefox-java installiert

rennecke@walhalla /tmp % pkg info web/browser/firefox/plugin/firefox-java
          Name: web/browser/firefox/plugin/firefox-java
Zusammenfassung: Java runtime integration - plugin
  Beschreibung: Java runtime integration - plugin
     Kategorie: Applications/Plug-ins and Run-times
        Status: Installiert
   Herausgeber: opensolaris.org
       Version: 0.5.11
 Build-Release: 5.11
         Zweig: 0.134
Packaging-Datum:  2. März 2010, 07:19:23 Uhr
         Größe: 93.00 B
          FMRI: pkg://opensolaris.org/web/browser/firefox/plugin/firefox-java@0.5.11,5.11-0.134:20100302T071923Z

Die Lösung für das Problem findet man im Kleingedruckten auf der Download-Seite der JRE:

Bitte verwenden Sie die 32-Bit-Version für Java-Applet- und Java Web Start-Support.

Nachdem ich explizit die 32-Bit JRE installiert habe und einen symbolischen Link in das Plugin-Verzeichnis des Firefox gemacht habe gingen auch Java-Applets.

root@walhalla ~ % cd <Firefox-Installation>/plugins
root@walhalla /usr/lib/firefox/plugins % ln -s <JRE>/plugin/<i386|sparc>/ns7/libjavaplugin_oji.so .

Nun muss man den Firefox nur noch neu starten.

Noch ein Wort zum Schluss: Wann hört dieser Java-Wahnsinn aus? Wenn es Sun/Oracle nicht hinbekommt eine 64-Bit JRE zu bauen, welche auch Applets ausführt? Man kann es auch quick&dirty lösen: Einfach den 32-Bit Müll mit in das 64-Bit Paket packen, so wie ich es händisch mache.

bunter Host in der Codeumgebung

Ich wurde gefragt, wie ich den user und den hostname in meinen Code-Umgebungen bunt bekomme. Ich benutze für das Syntaxhighlighting das Plugin WP-Syntax. Dieses wiederrum nutzt GeSHi im Hintergrund.

Damit der Hostname bunt wird, habe ich die Syntax der bash etwas erweitert. Dazu habe ich in der Datei wp-content/plugins/wp-syntax/geshi/geshi ein paar Zeilen hinzu gefügt:

language_data = array (
    'LANG_NAME' => 'Bash',
    // Bash DOES have single line comments with # markers. But bash also has
    // the  $# variable, so comments need special handling (see sf.net
    // 1564839)
    'COMMENT_SINGLE' => array('#'),
    'COMMENT_MULTI' => array(),
    'COMMENT_REGEXP' => array(
        //Variables
        1 => "/\\$\\{[^\\n\\}]*?\\}/i",
        //BASH-style Heredoc
        2 => '/<<-?\s*?(\'?)([a-zA-Z0-9]+)\1\\n.*\\n\\2(?![a-zA-Z0-9])/siU',
        //Escaped String Starters
        3 => "/\\\\['\"]/siU",
	4 => "/(root@[a-z]+)/i",          // root hat sich angemeldet
	5 => "/([a-z]+@[a-z]+)/i"         // ein normaler User hat sich angemeldet
        ),
        ....
'STYLES' => array(
        'KEYWORDS' => array(
            1 => 'color: #000000; font-weight: bold;',
            2 => 'color: #c20cb9; font-weight: bold;',
            3 => 'color: #7a0874; font-weight: bold;'
            ),
        'COMMENTS' => array(
            0 => 'color: #666666; font-style: italic;',
            1 => 'color: #800000;',
            2 => 'color: #cc0000; font-style: italic;',
            3 => 'color: #000000; font-weight: bold;',
  	    4 => 'color: #FF0000; font-weight: bold;',     // Farbe und Font für root
	    5 => 'color: #0000FF; font-weight: bold;'      // Farbe und Font für einen normalen User
            ),
           ...

Es handelt sich hierbei um einen Hack. Wenn man das Plugin updatet, muss man diese Änderung wieder vornehmen.

Kein Upload bei WordPress

Martin hat mich darauf  aufmerksam gemacht, dass bei wordpress die Upload-Funktion für Dateien nicht funktioniert. Also habe ich es promt ausprobiert und siehe da es ging bei mir auch nicht. Die Fehlermeldung Fehler beim Upload der ausgewählten Datei. das hilft einen gar nicht weiter. Die Ursache war, dass man per default in wordpress nur bekannte Dateien hinzufügen darf. Also habe ich in der Datei wp-inludes/functions.php die mime-Typen etwas editiert:

function get_allowed_mime_types() {
	static $mimes = false;
 
	if ( !$mimes ) {
		// Accepted MIME types are set here as PCRE unless provided
		$mimes = apply_filters( 'upload_mimes', array(
		'jpg|jpeg|jpe' => 'image/jpeg',
                ...
                'odf' => 'application/vnd.oasis.opendocument.formula',
		'.*' => 'text/plain', // hinzugefügt
		) );
	}
 
	return $mimes;
}