Angular ngx-translate TranslateLoader ohne http Modul

Um eine Kompatibilität mit alten Browsern, wie dem Firefox Version <= 5 zu erreichen, kann man das angular http Modul nicht verwenden. Das ngx-translate Module bneötigt einen Loader, der die richtige Sprache lädt per Ajax Request. Dies läst sich auch mit dem XMLHttpRequest und einem Observalbe lösen:

import {Injectable} from '@angular/core';
import {TranslateLoader} from '@ngx-translate/core';
import {Observable} from 'rxjs/Observable';

@Injectable()
export class LanguageLoader implements TranslateLoader {

  getTranslation(lang: string): Observable<any> {
    return Observable.create(function (observer) {
    let url = `./assets/i18n/${lang}.json?=` + new Date().getTime();
    let xhr = new XMLHttpRequest();

      xhr.onreadystatechange = function () {
        if (xhr.readyState == XMLHttpRequest.DONE || xhr.readyState == 4) {
              let response = JSON.parse(xhr.responseText);
              observer.next(response);
              observer.complete();
        }
      }
      xhr.open('GET', url, true);
      xhr.send(null);
    });
  }
}

In der app.module.ts kann man dann den Loader wie folgt einbinden:

TranslateModule.forRoot({
  loader: {provide: TranslateLoader, useClass: LanguageLoader}
})

PHP Skript als Windows-Dienst ausführen

Unter Windows lassen sich Skripte, die endlos laufen sollen mit PHP mittels eines Dienstes realisieren.

Dies hat den Vorteil, dass der Speicherverbrauch nicht mit der Zeit ins unendliche geht, bei endloser Skriptausführungen und eine Recovery und Restart Funktionalität implementiert werden kann, um den Dienst über lange Zeiträume am Laufen zu halten.

Außerdem erhält der Dienst vom Betriebsystem Events, wenn z.B. eine Shutdown ansteht, um sich rechtzeitig selber beenden zu können und keine korrupten Daten zu produzieren beim Abbruch in einer nicht atomaren Operation.

Um einen Windows Dienst anzulegen benötigt man die win32service PHP-Library.

Diese kann man hier downloaden und in der php.ini einbinden:

extension=php_win32service.dll

Dienst anlegen weiterlesen…

Windows 10 geplante Aufgabe für PHP Skript anlegen analog Crontab

Für wiederkehrende PHP Jobs kann man den Betriebsystem Scheduler verwenden, unter Linux ist das cron und unter Windows Aufgaben.

Um ein PHP Skript zu starten C:\foo\bar.php mittels der Aufgabenplanung jede Minute kann man unter Windows 10 und darunter wie folgt neue Aufgaben anlegen.

Unter Systemsteuerung -> Aufgabenplanung lassen sich neue Aufgaben verwalten:

Systemsteuerung -> Aufgabenplanung

weiterlesen…

PHP cURL verifizieren eines selbst-signierten FTPS Zertifikat

Leider kann man mit der PHP FTP Erweiterung keine SSL Zertifikate von FTPS Servern zu verifizieren, um Man-in-the-Middle Angriffe zu verhindern.

Es ist aber möglich über php-cURL das selbst signierte Zertifikat zu verifizieren:

public function checkFTPSCertificate(): bool
{
    $ftp_certificate = 'path/to/cert.crt'

    $ftp_server = 'ftp://foo.de/';
    $ftp_user = 'user';
    $ftp_password = 'password';

    $ch = curl_init();

    // curl_setopt($ch, CURLOPT_VERBOSE, '1');
    curl_setopt($ch, CURLOPT_URL, $ftp_server);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_USERPWD, $ftp_user . ':' . $ftp_password);
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);


    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, '1'); // Überprüfung des Serverzertifikats
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, '2');
    curl_setopt($ch, CURLOPT_CAINFO , $ftp_certificate);
    curl_setopt($ch, CURLOPT_FTP_SSL, CURLFTPSSL_ALL);
    curl_setopt($ch, CURLOPT_FTPSSLAUTH, CURLFTPAUTH_TLS);

    $result = curl_exec($ch);
    $error_no = curl_errno($ch);
    $error_msg = curl_error($ch);
    curl_close ($ch);
    return $error_no == 0 && empty($error_msg);
}

proftp log user traffic mit mod_sql

Um den User Traffic in proftp mitzuloggen in einer MySQL Datenbank, muss man nur in der User Tabelle eine Spalte “traffic” hinzufügen vom Typ BIGINT, Default 0:

ALTER TABLE `ftpuser` ADD COLUMN `traffic` BIGINT NOT NULL DEFAULT '0';

Dann kan man einen SQLNamedQuery verwenden in der sql.conf, um die Menge des Traffics mitzuschneiden:

SQLLog RETR,STOR,APPE extendedlog
SQLNamedQuery extendedlog UPDATE "traffic= (traffic + %b) WHERE userid='%u'" ftpuser

Achtung, die Verwendung führt zu erhöhtem Traffic auf der Datenbank.