Redmine unter Docker

09.11.2021 - Lesezeit: ~1 Minute

docker-compose.yml


version: '3.3'

services:

  redmine:
    image: redmine
    restart: always
    ports:
      - 8080:3000
    secrets:
      - mysql_root
      - mysql_user
    environment:
      REDMINE_DB_MYSQL: db
      REDMINE_DB_PASSWORD_FILE: /run/secrets/mysql_root
      REDMINE_SECRET_KEY_BASE_FILE: /run/secrets/mysql_user
    volumes:
      - ./files:/usr/src/redmine/files

  db:
    image: mariadb:latest
    restart: always
    secrets: 
      - mysql_root
    environment:
      MYSQL_ROOT_PASSWORD_FILE: /run/secrets/mysql_root
      MYSQL_DATABASE: redmine
    volumes:
      - ./db:/var/lib/mysql
      - ./init:/docker-entrypoint-initdb.d
      - ./backup:/var/backups

secrets:
  mysql_root:
    file: ./mysql_root.txt
  mysql_user:
    file: ./mysql_user.txt
```-
Tags: Docker Redmine

FirebirdSql Too many Contexts of Relation/Procedure/Views. Maximum allowed is 255.

09.06.2021 - Lesezeit: ~1 Minute
Unsuccessful execution caused by a system error that precludes successful execution of subsequent statements.
SQL error state =54001
Dynamic SQL Error.
Too many Contexts of Relation/Procedure/Views. Maximum allowed is 255.

Dieser Fehler tritt auf, obwohl der EXECUTE BLOCK definitiv nur 250 Update Anweisungen enthält.

Was ich nicht bedacht hatte, war dass durch die Update-Anweisungen Trigger ausgelöst wurden ...

Deshalb habe ich die Anzahl der Anweisungen im Execute-Block auf 60 begrenzt und der Fehler wird nicht mehr ausgelöst.

Tags: FirebirdSQL

Delphi - Komponente - TNetHTTPClient und Sonderzeichen

28.04.2021 - Lesezeit: 3 Minuten

Beim Zugriff auf die Keycloak-API zum Abruf eines Tokens kommt die Fehlermeldung 401 Not Authorized wenn das Passwort ein Sonderzeichen enthält.

In einer Python-Testumgebung kann der Token ohne Probleme abgerufen werden.

Mit Wireshark kann man sich die erzeugten Abfragen anzeigen (damit man in Wireshark die unverschlüsselten Daten angezeigt bekommt muss man zum Debuggen die URL von https:// auf http:// umstellen):

Python erzeugt:

POST /keycloak/rest/v1/token/generate HTTP/1.1
Host: demo.wlsoft.de
User-Agent: python-requests/2.22.0
Accept-Encoding: gzip, deflate
Accept: */*
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Authorization: Basic xxxx:yyyyyyyyyyyyyyyy
Content-Length: 70

grant_type=password&username=xxxxx@xxxxxx.xx&password=123456789%C3%840

Delphi erzeugt

POST /keycloak/rest/v1/token/generate HTTP/1.1
Host: demo.wlsoft.de
User-Agent: Embarcadero URI Client/1.0
Accept-Encoding: gzip, deflate
Accept: */*
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded; charset=utf-8
Authorization: Basic xxxx:yyyyyyyyyyyyyyyy
Content-Length: 70

grant_type=password&username=xxxxx@xxxxxx.xx&password=123456789%C3%840

Der Unterschied steckt im Content-Type

Python: Content-Type: application/x-www-form-urlencoded;
Delphi: Content-Type: application/x-www-form-urlencoded; charset=utf-8

Der falsche Eintrag in Delphi wird durch die Funktion THTTPClient.CreateFormFromStrings() erzeugt:

Deshalb darf bei Abruf eines Token nur eine Post-Anweisung aufgerufen werden, die CreateFormFromStrings() nicht aufruft.

Das wäre zum Beispiel ein solcher Aufruf:

function TNetHTTPClient.Post(
  const AURL: string; 
  const ASource, AResponseContent: TStream;
  const AHeaders: TNetHeaders): IHTTPResponse;
type
  THCloudZugangsdaten = record
    User: string;
    Pass: string;
    Token:string; 
    TokenResponseCode: integer;
    TokenResponseText: string;
  end;

function getToken(var aZugangsdaten: TZugangsdaten): boolean;
var
  s, aURL: string;
  j: TJSONObject;
  aSource: TStringStream;
  m: TMemoryStream;
  sl: TStringlist;
  Response: IHTTPResponse;
  HTTP: TNetHTTPClient;
  aHeaders: TNetHeaders;
begin
  Result := False;
  sl := TStringlist.Create;
  aSource := TStringStream.Create(
    'grant_type=password' +
    '&username=' + EncodeURIComponent(aZugangsdaten.User) +
    '&password=' + EncodeURIComponent(aZugangsdaten.Pass));
  m := TMemoryStream.Create;
  HTTP := TNetHTTPClient.Create(nil);
  try
    try
      HTTP.ContentType := cContentType_x_www_form_urlencoded;
      HTTP.AcceptEncoding := 'gzip, deflate';
      HTTP.CustomHeaders['Accept'] := '*/*';
      HTTP.CustomHeaders['Authorization'] := 'Basic xxxx:yyyyyyyyyyyyyyyy';
      aURL := 'https://demo.wlsoft.de/keycloak/rest/v1/token/generate';
      Response := HTTP.Post(aURL, aSource, m, aHeaders);
      if Response.StatusCode = 200 then begin
        m.Position := 0; 
        sl.LoadFromStream(m);
        s := sl.Text;
        j := TJSONObject.ParseJSONValue(s) as TJSONObject;
        try
          if Assigned(j) then begin
            if j.TryGetValue('access_token', aZugangsdaten.Token) then begin
            end;
          end;
        finally
          FreeAndNil(j);
        end;
      end;
      aZugangsdaten.TokenResponseCode := Response.StatusCode;
      aZugangsdaten.TokenResponseText := Response.StatusText;
      Result := not aZugangsdaten.Token.IsEmpty;
    except
      on E: Exception do begin
        aZugangsdaten.TokenResponseCode := Response.StatusCode;
        aZugangsdaten.TokenResponseText := E.Message;
        // kein raise;
      end;
    end;
  finally
    m.Free;
    aSource.Free;
    FreeAndNil(sl);
    FreeNetHttp(HTTP);
  end;
end;
Tags: Delphi-Programmierung

Drupal-Lehrgang Bedienung

26.03.2021 - Lesezeit: 3 Minuten

Vorbereitung

  • Herunterladen Teamviewer zur Fernwartung
  • Herunterladen IrfanView zur Bildbearbeitung
  • Herunterladen Totalcommander zum Hochladen der Bilder per FTP

    Anmelden im CMS Drupal7

  • Anmelden unter www.niederfrohna.de oder
  • Anmelden unter www.ghmslo.de
  • Den Benutzernamen und das Passwort vom Browser speichern lassen
  • Diesen Link als Lesezeichen abspeichern

    Neuer Artikel

  • Titel eingeben
  • Tags eingeben (Bitte zuerst nach bereits vorhandenen Tags suchen, in dem einige Buchstaben eingegeben werden)
  • Body eingeben
  • Wenn der Artikel länger als 600 Zeichen wird, den Artikel aufspalten in Zusammenfassung und Body
  • In Informationen zum Autor wird das Feld geschrieben am beim Speichern ausgefüllt.

    Bilder bearbeiten

  • Bild mit Irfanview öffnen
  • mit gedrückter Maustaste gewünschten Ausschnitt wählen
  • Strg+Y zuschneiden des Bildes
  • Strg+R neue Bildgröße wählen (Width 600 Pixel)
  • S Bild speichern unter (bitte einen sprechenden Namen vergeben: z.B. saxionade_test_01.jpg) Die Bildnamen dürfen keine Leerzeichen, Sonderzeichen oder Umlaute enthalten.
  • JPEG-Qualität auf 90% einstellen um die Dateigröße zu verringern.

    Bilder hochladen

  • Totalcommander starten
  • Strg+F Mit FTP-Server verbinden
  • mit der Einfg-Taste auf der linken Seite die hochzuladenden Bilder markieren.
  • auf der rechten Seite das Verzeichnis 2014 auswählen
  • F5 Bilder kopieren

    Bilder im Artikel anzeigen

  • Niederfrohna.de arbeitet mit der Markup Language Texy!
  • Deshalb müssen keine HTML-Befehle verwendet werden, um Bilder anzuzeigen Die Textauszeichnung
    ![](https://www.wlsoft.de/bilder/2014/saxionade_test_01.jpg)

    zeigt das soeben hochgeladen Bild an

    Texy!-Syntax

    ---- horizontale Linie
    **Fettschrift** 
    [Bitte bei der Freien Presse weiterlesen](https://www.freiepresse.de)
    "Weitere Fotos":?q=node/1148
Tags: Drupal Drupal7


Delphi 10.4.2 Sydney und der Edgebrowser

04.03.2021 - Lesezeit: ~1 Minute

Aus Delphi heraus wird nicht der Edgebrowser angesprochen sonder das Tool WebView2.

Das hat den Vorteil, dass eventuelle Restriktionen die der Win-Admin für den Edgebrowser festgelegt hat, nicht für die Delphi-Anwendung gelten.

Installation beim Delphi - Programmierer

Installation beim Anwender

Tags: