Allow PUT Verb in IIS/8.5

To allow the PUT verb in IIS/8.5 you need to remove WebDAV from the handlers listing and WebDAVModule from the modules listing. If you can’t remove the module on folder or application level try removing it on site level instead.

App-Berechtigungen in Intrexx konfigurieren

Vorbereitung

Verbinden Sie sich im Intrexx Portal Manager mit dem Portaldienst, dessen Apps bearbeitet werden sollen, indem Sie im Menü Datei > Portaldienst verbinden wählen und Ihre Anmeldeinformationen eingeben. Öffnen Sie dann die App, für die Sie die Berechtigungen ändern wollen, indem Sie auf den Reiter Applikationen wechseln, dann im Menü Datei > Applikation öffnen anklicken und schließlich im angezeigten Dialog die gewünschte App auswählen.

Über den Menüpunkt Applikation > Berechtigungen kann nun der Dialog zur Verwaltung der Rechte geöffnet werden.

Verschiedene Rechtearten

In Intrexx können pro App Applikationsrechte, Seitenrechte und Datengruppenrechte verwaltet werden. Diese werden nachfolgend beschrieben.

Berechtigungen für die Applikation

Auf dem Reiter Applikation werden die Applikationsrechte der App verwaltet. Das Recht „Applikation benutzen“ legt fest, ob Anwender im Browser den Link zur Applikation angezeigt bekommen. Je nach App und Unternehmen ist es sinnvoll dafür eine eigene Benutzergruppe anzulegen. Evtl. kann es reichen, allen Benutzern Zugriff auf die App zu gewähren.

Applikationsrechte

Berechtigungen für die Seiten

Auf dem Reiter Seiten werden die Rechte an einzelnen Seiten der App verwaltet. Dabei gibt das Recht „Seite benutzen“ an, ob Links und Buttons, die zu dieser Seite führen, für den entsprechenden Benutzer verfügbar sind oder nicht. Je nach App und Unternehmen macht hier eine Differenzierung zwischen Betrachtern, Bearbeitern und Verwaltern Sinn. In diesem Beispiel erhalten alle Benutzer das Recht die Seiten der App zu verwenden.

Seitenrechte

Berechtigungen für die Datengruppen

Auf dem Reiter Datengruppen werden die Rechte an den Daten selbst verwaltet. Zur Verfügung stehen Rechte zum Lesen, Hinzufügen, Ändern und Löschen von Datensätzen. Dabei können jeweils Lesen, Ändern und Löschen auf selbst erstellte Datensätze beschränkt werden. In diesem Beispiel erhalten alle Benutzer Leserechte…

Datengruppenrechte-1

…und eine spezielle Rolle zusätzlich weitere Rechte.

Datengruppenrechte-2

 

How To: Recover SQLite database from installed Android App

Five „easy“ steps:

  1. Install Helium Backup on your Android device and on your PC
  2. Backup your app’s data using the PC Download option
  3. Extract the *.ab file from the downloaded backup.zip
  4. Download Android Backup Extractor and execute the following command (watch your path and file names): java -jar abe.jar unpack backup.ab backup.tar
  5. Download TarTool and execute the following command (watching path/file names again): TarTool.exe -x backup.tar backup-unpacked

Why TarTool?

The Android Backup Extractor produces a TAR-file but this file uses the POSIX file format (ustar) which isn’t well supported by typical Windows archiving apps. Without it you won’t be able to access the contained files (as with typical command line tools) or only a reduced set of files will be shown (as with typical GUI tools).

Intrexx6: InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty

Beim Versuch einen IMAP Store zu verbinden, bekam ich die Ausnahme „java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty“. Das Problem war, dass das Portal den „truststore“ auf eine andere Datei umgebogen hatte und diese leer/ungültig war. Das Kopieren der Datei „C:\Program Files\intrexx\jre\windows\amd64\lib\security\cacerts“ nach „C:\ProgramData\intrexx\<portal_name>\internal\cfg\cacerts“ hat dieses Problem gelöst.

Windows 10 Upgrade-Probleme

Schon gestern wollte ich auf Windows 10 aktualisieren, aber vier gescheiterte Upgrade-Versuche und nur eine Fehlermeldung „WindowsUpdate_C1900101“ ohne weitere Erklärungen waren schon ernüchternd. Schließlich fand ich aber im Netz einen Hinweis, dass Treiber und bestimmte Programme Probleme bereiten könnten. Deswegen beherzigte ich den Rat und deaktivierte die entsprechenden Programme vor dem Upgrade von 8.1 auf 10.

Meine Lösung

  • Alle Autostart-Programme in MSConfig deaktivieren
  • Alle Nicht-MS-Dienste im Task Manager deaktivieren
  • Windows 8.1 neu starten
  • Upgrade auf Windows 10
  • Alle Nicht-MS-Dienste wieder aktivieren
  • Alle Autostart-Programme wieder aktivieren

Fertig!

Löschen von Datensätzen in Ember.js

Bei der Verwendung von Ember (1.1.2) Data (1.0.0-beta) habe ich Datensätze, die als Teil eines Ganzen fungierten, bislang immer wie folgt gelöscht:

deleteEntry: function (entry) {
    entry.deleteRecord();
    if (entry.get("isDeleted")) this.removeObject(entry);
    entry.save();
}

Dies führte zwar dazu, dass der Datensatz aus der jeweiligen Ansicht verschwand (dank this.removeObject(entry);), aber andere Ansichten zeigten mitunter den betreffenden Datensatz immer noch. Ein erneuter Lösch-Versuch führte dann zu einer Ausnahme.

Seitdem ich allerdings auch das Ganze nach dem Löschen speichere, werden alle Ansichten korrekt aktualisiert, ohne dass ich manuell das Objekt aus dem Controller entfernen muss:

deleteEntry: function (entry) {
    entry.deleteRecord();
    entry.save();
    this.get("controllers.log").content.save();
}

Das klingt ja auch irgendwie logisch, wird aber leider mit keinem Wort in den Ember-Guides erwähnt.

Also merke: Sobald ich folgende Model-Definition habe, muss ich auch das übergeordnete Objekt speichern…

App.Log = DS.Model.extend({
    entries: DS.hasMany("logEntry", { async: true })
});
App.LogEntry = DS.Model.extend({
    log: DS.belongsTo("log", { async: true })
});

Android WebView: Calling C# from JavaScript

Laut Dokumentation soll es möglich sein, in einem Android WebView von JavaScript aus auf Java-Funktionen zuzugreifen. Entsprechend sollte dies auch mit C# und Xamarin möglich sein. Viel Nachforschen und Ausprobieren – leider war kein Online-Beispiel wirklich funktionsfähig – führten mich schließlich zu folgender Lösung (für API Level 19):

var webView = FindViewById(Resource.Id.webView);
webView.Settings.JavaScriptEnabled = true;

var webChromeClient = new MyWebChromeClient();
webView.SetWebChromeClient(webChromeClient);

var webViewClient = new MyWebViewClient();
webView.SetWebViewClient(webViewClient);

webView.AddJavascriptInterface(webViewClient, "apiCalls");
webView.LoadUrl(...);

Dabei scheint hier vor allem der eigene WebChromeClient wichtig zu sein. Das eigentliche Interface implementiert die veröffentlichten Methoden „public“ und mit „Export“ und „JavascriptInterace“ getaggt wie folgt:

[Export("setNextCallDetails")]
[JavascriptInterface]
public void SetNextCallDetails(string method, string jsonData)
{
	...
}

In JavaScript wird dies dann so aufgerufen:

<script src="js/vendor/jquery-2.1.3.min.js"></script>
<script>
	$(document).ajaxSend(function (event, jqXHR, ajaxOptions) {
		if (apiCalls) {
			if (apiCalls.setNextCallDetails) {
				var method = ajaxOptions.type;
				var jsonData = (typeof ajaxOptions.data === "string"
				? ajaxOptions.data
				: ajaxOptions.data
				? JSON.stringify(ajaxOptions.data)
				: null);

				apiCalls.setNextCallDetails(method, jsonData);
			}
		}
	});
</script>

Wozu das Ganze?

Ganz einfach: der WebView unterstützt (auf API Level 19) keine Übermittlung der HTTP-Methode und des POST/PUT-Bodys an den registrierten WebViewClient. Mit obiger Methode kann ich AJAX-Aufrufe abfangen, die nötigen Informationen vorab setzen und dann den WebViewClient seine Arbeit tun lassen.