Archive for the ‘Zend’ category

Zend Server 5.0 beta http.conf Fehler htaccess, mod_rewrite

February 22nd, 2010

mit der http.conf die erstellt wird funktioniert das rewriting nicht.

Grund. Nach der <directory> Definition kommen noch die <directory > definitionen für die Serververwaltung , die überschreiben die vorgenommenen Einstellungen.

Lösung: Die directory directiven für das docroot des projektes ganz nach unten verschieben

Debain zend Zerver : Error sock connect pdo mysql

February 7th, 2010

Solved with

ln -s /var/run/mysqld/mysqld.sock /tmp/mysql.sock

warum auch immer

zend studio unter debian

February 6th, 2010

Die Linuxsourcen meckern und Java steigt bei dr installation des bin files aus wenn es Xserver env-vars nicht findet.

Lösung das binfile mit nem zusatz starten. Achtung den Installer nicht als root ausführen. gtk tuts sonst nicht

./ZendStudio7_1_1.bin LAX_VM /usr/bin/java

zend server unter debian via svn istallieren

February 6th, 2010

Hier ist die herstelleranleitung wie man sie sources.list erweitert und mittels aptitude den server installiert.

http://files.zend.com/help/Zend-Server-Community-Edition/zend-server-community-edition.htm#deb_installation.htm

neue Music-Downloadplattform mit Freedownloads mit Zend-Framework online.

February 4th, 2010

Hier ein Beispiel wie man es häufiger sehen möchte.

http://www.zeezee.de setzt in Ihrer innovativen Idee mal eine eine etwas andere Musik-Downloadplattform umzusetzen Zend-Framework und Jquery als Schlüsseltechnologie ein und überzeugt auf Anhieb mit Qualität, Einfachheit und Spass beim Musiksuchen.

Die Registrierung ist extrem einfach und man kann sofort loslegen.  Die Mail zur Aktivierung ist auch in der Schweiz unter 1 Minute verfügbar.

Als Erstes habe ich nach dem Login die Charts aus meinem Geburtsjahr gefunden. Coole Sache. Elvis lebt :-)

Die älteren Jahrgänge erinnern sich sicher an die Zeit als man noch am Radio mitgeschnitten hat. Das läuft hier ähnlich. Man sucht sich einen Song aus, der gespielt werden soll und wenn  ein User ihn abspielt wird er für Dich zum Download bereit gestellt. Bei mir dauerte das ca 3 Minuten. Man wird hier per Message über den bereitgestellten Song informiert.

Nach der Registrierung sind die aktuellen Top 20  Songs kostenfrei. Gute Sache.

Was mir persönlich sehr zusagt ist die Performance und die Usability der Seite. Sie ist schnell und sehr einfach. Man kommt mit wenigen Klicks an seine Wunschmusik.

Das Musik Angebot ist riesig. 16 Mio Tracks stehen zur Auswahl. Unglaublich.

Ein Besuch der Seite http://www.zeezee.de ist für PHP-ler eigentlich Pflicht. Musikliebhaber die auf Nostalgie stehen werden begeistert sein.

Zend Framework _forward() vs _redirect()

January 10th, 2010

Es ist ganz simple.

$this->_forward(’action’, ‘controller’, ‘module’, array(’params’=> $array_values)); macht keinen HTTP Request, sondern ruft eine Action in einem Controller eines Modules auf.

Wogegen $this->redirect(”/module/controller/action”, array(’params’=>$array)) einen echten header(”location:”) macht.

Ersteres ist wesentlich performanter und in punkto Verschlüsselung wäre es ein fataler Fehler nach der Entschlüsselung einen redirect mit den Values zu machen. Da diese nach der Entschlüsselung plain übertragen werden.

EXTJS Ext.Formpanel encrypted formvalues

January 9th, 2010

In meinem letzen Artikel habe ich beschrieben, wie man mit Ajax-PHP RSA PKi umsetzen kann.
Nun habe ich mir die Mühe gemacht und das Ganze in eine Extjs BasicForm implementiert.

Problem hierbei war die getForm().submit() Methode zu erweitern. submit() generiert die Values automatisch und überträgt sie.
Um die Values zu verschlüsseln, muss das Formpanel einen Listener bekommen der auf “beforeAction” und “actioncomplete” feuert.

Ersteren, um die Values verschlüsselt zurück ins form zu schreiben. Dannach steht in den Textfeldern jedoch verschlüsselter inhalt. Das ist unschön im Workflow, weil der User einen Fehler vermuten könnte. Daher werden die Values in einem Object zwischengespeichert bevor sie verschlüsselt werden.

Nach dem dem Submit werden die zwischengespeicherten Values mit den Originalvalues zurück ins Form geschrieben und der User sieht nur für einen Moment (dauer der Uebertragung) die verschlüsselten Values. Da über dem Form ein Overlay liegt und er einen Preloader sieht ist das kaum wahrnehmbar.
1) RSA Codes client und Serverseitig einbinden. siehe Tutorial
2) ein Form wie folgendes erstellen.

{xtype:'form',url:'/controller/0.0.1/public/admin/save',title:'Mailserver',listeners:
          {
             beforeaction: {
               fn: function(frm, action) {
                //klasse speichert die unverschlüssleten values zwischen
                function ValueObjects() {
                     this.values    = [];
                   }
                valueobject= new ValueObjects();
                        var form= Ext.getCmp('formMailserver').getForm();
                        var value = form.getValue();
                        valueobject.values['mailserver_server']=value;
                         form.findField('mailserver_server').setValue(rsajax.encrypt(value));

                }
              },
              actioncomplete : {
               fn: function(frm, action) {
                        var form= Ext.getCmp('formMailserver').getForm();
                        form.findField('mailserver_server').setValue(valueobject.values['mailserver_server']);
                }
              }
            }
,labelWidth:150,
id:'formMailserver',
frame:true,
items:[
{xtype:'textfield',
value:'test',
fieldLabel:'mailserver_server',
id:'mailserver_server',
allowBlank:false},
{id:'mailserver_buttonMailserver',
text:'speichern',
xtype:'button',handler:function(){
        var formAction = Ext.getCmp('formMailserver').getForm().url;
        if(formAction=='')
        {
            alert('URL or the formMailserver ist not defined in table : forms');
        }

          Ext.getCmp('formMailserver').getForm().submit({
                        method: 'POST',
                        waitMsg: 'saving ...',
                        success: function (f, a) {
                            Ext.Msg.alert('',''+a.result.data.message);
                        },
                        failure: function (f, a) {
                            Ext.Msg.alert("Error", "Failed .............")
                        }
                    });

    }}]}

RSA Verschlüsselung von Requests Client und Serverseitig für Zend mittels RC4 per Ajax

January 8th, 2010

Die einfachste Lösung seine Daten verschlüsselt zu übertragen ist SSL.
Wer an Opensource Webprojekten schraubt kann aber weder den User zwingen teure Zertifikate zu kaufen oder entsprechende Module wie mycrypt für AES oder openSSL bei seinem Hoster nachzurüsten.

Eine symetrische Verschlüsselung mit AES scheidet wegen dem “man in the middle” Problem aus. Also muss eine Methode her, die bei Netzwerküberwachung keine Daten preisgibt die einfach zu entschlüsseln wären.

Ich habe mich auf Anraten eines Commuitymitglieds (Danke an goosejan für die Nerven) entschieden, das asymetrische PKI Verfahren zu verwenden.
Auf der Clientseite werden die Formularinhalte mittels Javascript RC4 mit einem öffentlichen Schlüssel verschlüsselt, den der Server liefert und per Ajax an den Server übertragen. Das Ganze funktioniert 2 Way. Die Antwort des Servers wird natürlich auch verschlüsselt und clientseitig wieder entschlüsselt.

Als Privatekey auf dem Server wird eine 40 Zeichen lange Zeichenkette verwendet.

Als Grundlage habe ich die Implementierung verschiedener Programmierkollegen verwendet (siehe Sourcecomments).
Das Ganze habe ich auf Zend Framework 1.9.6 mit jquery (jquery-min) portiert und als Zend Modul “Zend_RSAjax” für Zend-Framework Projekte flott gemacht.

Hier sind die Sourcen dazu.
library: liegt bei mir unter library im Zend_Framework Projektordner, damit sie automatisch geladen werden
library:Zend_RSAjax
public: javascripte im publicordner
public:javascripts

Lizenzen: Bitte die Lizenzen MIT und GPL der einzelnen Implementierungen beachten.

Hier das Tutorial:
1) Controller anlegen, der die Requests entgegennimmt. Bei mir liegt der im Modul Admin also :( Admin_PgpController)

<?php
/**
 * @desc implements the serverside RAS RC4
 * @author: Peter Boethig
 */
class Admin_PgpController extends Zend_Controller_Action {

    public function init() {

        $this->RSAWrapper = new Zend_RSAjax_Wrapper();
    }

    public function indexAction() {
        ;
    }
    //disable layout for Ajaxcalls
    public function preDispatch() {
        $this->_helper->layout()->disableLayout();
        $this->_helper->viewRenderer->setNoRender(true);
    }

    //return the pKey for clientsite
    public function getpublickeyAction() {
        $json = array('n'=>$this->RSAWrapper->rsajax_server_n, 'e'=>$this->RSAWrapper->rsajax_server_e);
        print(json_encode($json));
    }

    //saves PK into session
    public function setsessionAction() {
        if($this->_request->getParam('key') !=null) {
            if(!session_id){session_start();}
            $_SESSION['s_rsajax_client_key'] = $this->RSAWrapper->decrypt($this->_request->getParam('key'));
        }
    }

    //decodes Value and returns encoded
    public function getkeyAction() {
        if($this->_request->getParam('secure')=='t') {
            $val = $this->RSAWrapper->encrypt($this->RSAWrapper->decrypt($this->_request->getParam('val')));
        }
        header('Content-Type: text/html;charset=utf-8');
        print(json_encode(array('val'=>utf8_encode($val))));
    }
}

2) RC4 und RAS Javscripte für die Clientseite einhängen
Hier im Downloadlink sind die Sourcen dazu. einfach in den html Head einhängen.

3) In dem Viewscript oder in einem Helper, welches das Formular enthält zb. index.phtml wird ein Javascript ausgeben, welches die Secure Session startet.

$SecureSession = new Zend_RSAjax_SecureSession();
$this->getController     = $this->baseURL."/admin/pgp/getpublickey";  // Pfad auf  die Controlleraction (bei mir admin)
$this->sessionController = $this->baseURL."/admin/pgp/setsession";
echo $SecureSession->create();

4) Das Formular übertragen

<input type=’submit’ onclick=’sendForm()’>

function sendForm(){
        var secure = true; //should be tested
        var secureParam = secure ? 't' : 'f';
        val='testpass';  // your formvalues

        if(secure){
            val = rsajax.encrypt(val);
        }

        $.ajax({
            url: '/cocominZend/0.0.1/public/admin/pgp/getkey', //your requestcontroller in Zend
            data: {val: val, secure: secureParam},
            dataType: 'json',
            success: function(data)
            {
                var val = data.val;
                if(secure)
                {
                    val = rsajax.decrypt(val);
                    alert(val + 'As you can see, your data was encrypted. Nobody could have read it by monitoring your network activity.');
                }
                else
                {
                    alert('Anybody who happened to be monitoring your network activity could have seen that data.');
                }
          },
            error: function(e)
            {
                alert('error:'+e.responseText);
            }
        });
}

zend Framework 1.9.6 Autoloader für modulare Projekte leicht gemacht.

December 28th, 2009

Um sich die lästige Angewohnheit require_once() in meinen Projekten abzugewöhnen habe ich meine schnellen Hacks im Zend Projekt versucht durch ein simples Autoloading der Sourcen zu ersetzen.

Am Anfang steht dem Vorhaben die Tatsache im Weg, dass man dadurch auf einiges verzichten muss.
1) Ist Schluss mit einfachen Klassennamen wie “Customers{}” oder “Users”. Die Bindung des Auf SPL basierendem Autoloader ans Filesystem verlangt, das die Klassennamen den Zend Regeln entsprechen müssen.
Eine Modelklasse eines Modules Admin heist nun nicht mehr Admins in Admins.php sondern Admin_Model_Admins in Admins.php

Weil sie ja in “modules/admin/models/” liegt. Dass dabei die Klasse nicht Admin_Models-Admins heisen muss ist damit zu begründen, dass Zend den Ordner für die Models zwar “models” nennt, die harte Verdrahtung auf den Ordner aber “model” benennt.

Die Ordnerstruktur sieht folglich so aus
-application
  -modules
    - admin
    - models
      - Admins.php
    - forms
      - AdminForm.php
    - controller
    - forms

Eine Klasse im Ordner “foms” heist folglich “Admin_Form_AdminForm”. Die Datei heist also AdminForm.php

Das ist zwar kein 100% ges Abbild des Filesystems, aber man weis was gemeint ist.

Man würde die Klasse über $AdminForm = new Admin_Form_AdminForm() instatiieren.

Um den Autoloader zu aktivieren reicht es schon in die Bootstrap folgenden Code zu platzieren. Er aktiviert den Modulautoloader und mapt die Pfade aufs Filesystems.

index.php (oder alternativ: Bootstrap.php in der methode _initAutoload())

$admin_loader = new Zend_Application_Module_Autoloader(array(
       'namespace' => 'Admin', //Admin_Form_DeinForm
       'basePath'  => APPLICATION_PATH . '/modules/admin'  //modulepfad an den Autoloader übergeben
));

Die 3 Zeilen muss man für jedes Modul wiederholen.

Extjs “Combo -Boxen” und der geliebte “selected” status auf die aktive Option.

December 22nd, 2009

Manche Dinge, die in Standard – HTML so gewohnt einfach und selbstverständlich daherkommen, dass die Erstellung für einen Programmierer ein paar Sekunden dauern, können einen Einsteiger in DOM und speziell in Extjs 3.1 Tage abverlangen.
Ein Selectfield in HTML ist schnell geschrieben. Die selected-Option auf ein bestimmtes Value noch schneller gesetzt.

in HTML sag ich einfach

<select  id ="" name="" >
<option value="id" selected>ein optionvalue</option>
</select>

fertig. Das Value ist voreingestellt.

In Extjs gibts die Komponente “combo” dafür. Sieht echt toll aus und man hat viele Ajaxoptions dafür.
Sie ist auch leicht erstellt.

{
            xtype: 'combo',
            id: 'username',
            fieldLabel: 'Username',
            hiddenName: 'userID',
            emptyText: 'Select a username...',
            store:
              new Ext.data.SimpleStore({
                fields: ['userID','username'],
                data: [['1','cocomin'],['2','testuser']]

            }), // end of Ext.data.SimpleStore
            displayField: 'username',
            valueField: 'userID',
            selectOnFocus: true,
            mode: 'local',
            typeAhead: true,
            editable: false,
            triggerAction: 'all',
            valueField: 'userID',
            value: '1',
          }

Ja, ist doch easy. Klar. Leicht und verständlich.
Ja. Wenn man folgendes berücksichtigt schon.

1) Wenn man weis, dass man für die Options einen Datastore erstellen muss

2) das forceSelection auf true stehen muss

3) das der hiddenvalue (zb userid). der variablenname im request ist

4) das man den Diplayvalue explizit setzen muss
(in diesem Fall displayField: ‘,valueField: ‘username’,)

5) Das die Verwendung eines lokalen Datastores immer mode:local benötigt. (mode:remote versucht einen jsonstring vom server in den Store zu laden)

6) und das ist das wichtigste in Bezug auf vorselectierte Options
value:’Herr Kannengiesser’ setzt einerseits einfach einen Direktvalue. Tut man das so wird jedoch nur der Value übertragen (”Herr Kannengiesser”), weil er ja keine dazugehörige ID kennt. Klar soweit.
Verwendet man jedoch eine ID (z.B.valueField: ‘userID’, value=’1′) aus dem Datastore zeigt er nicht etwa die ID an. Nein, gut erkannt, er sucht im Datastore zuerst eine ID zum Value=’1′. Exsitiert diese ID im Datastorte zeigt er statt “1″ (value:’1′) den value unter “value:’1′” an. Hierzu muss man den Valuefield auf den Key im Store setzen (valueField: ‘userID’),
Dieser ist dann auch fein selected. Im Request kommt dann brav unter $_REQUEST[userID] (hiddenvalue:’userID’) die “1″ als userID an.
Die Doku und das Forum dazu dazu ist so umfangreich, dass ich von Hacks bis zum dynamischen Nachladen bis über eingeharkte HTML Selectfields in Panelkonstrukten alles gefunden und ausprobiert habe.

Ein “selectedValueInStore” wäre eine feine Sache gewesen.. Nunja. Ich freue ich mich nun über die gefundene Lösung und dass ich vielleicht jemandem die 2 Tage Suche sparen kann.

KISS. Keep it short and simple………..