- Mitglied seit
- 04. Sep 2008
- Beiträge
- 2.341
- Punkte für Reaktionen
- 14
- Punkte
- 84
Vorgeschichte
Wieder einmal packte mich mein Forscherdrang um die letzten Geheimnisse des DSM ans Licht zu bringen. Bedingt durch eines meiner aktuellen Projekte (Notification messanger), in diesem ich eine eigene Benutzerberechtrigung integrierte, begab ich mich auf die Suche, unter welchen Kriterien bzw. welcher Konfiguration ein App unter den Anwendungsberechtigungen erscheint.
Da nun auch die von Synology separat angebotenen Applikationen teilweise in dem Dialog der Anwendungsberechtigungen zu sehen waren, untersuchte ich diese ein wenig näher.
Mit dem Eintrag "grantPrivilege" in der config des App's wird die Grundlage geschaffen, damit das App in der Liste auswählbar ist. Der DSM durchsucht nämlich alle App-Verzeichnisse nach den config Dateien. Wird der EIntrag "grantPrivilege" gefunden, stellt die Systemsteuerung das entsprechende App in der Liste dar. Erste Versuche zeigten den erhofften Erfolg, allerdings war da noch eine Kleinigkeit, für die ich eine Lösung finden musste.
Synology hat diese Funktion nicht für App's vorgesehen, die per type "legacy" oder "url" gestartet werden. Denn eine App mit einer dieser beiden type's, welche in einem neuen Fenster aufgerufen wird, wird immer per URL aufgerufen. Und dort wird einfach keine Prüfung auf Berechtigung des Benutzers durchgeführt. Jeder angemeldete Benutzer der die URL kennt, kann das App direkt öffnen. Ich schreibe mit Absicht "angemeldete Benutzer", da trotz Allem noch eine Prüfung diesbezüglich durchgeführt wird.
Nach ein wenig Suche bin ich in der Datei initdata.cgi fündig geworden. Die initdata.cgi gibt die Information über die Berechtigung des Benutzer aus, man muss sie nur noch extrahieren und auswerten.
Damit das Ganze auch funktioniert, muss man unbedingt die Variante mit der config benutzen. Die application.cfg ist veraltet und nur noch aus Kompatibilitätsgründen vorhanden. Über die Vorteile der config habe ich schon im Wiki geschrieben - Aufbau der Datei 'config'
Default ist nur der "admin" berechtigt, andere Benutzer (auch Administratoren) müssen erst explizit zugewiesen werden.
Als Wert für den Eintrag "grantPrivilege" stehen die folgenden 4 zur Verfügung, meist wird "local" benutzt.
Von der Theorie nun zur Praxis...
Ich habe 2(3) Skripte erarbeitet, die diese Aufgabe erledigen sollen, in Perl / Javascript / PHP. (siehe Anhänge)
Perl
Einfach den folgenden Code möglichst am Anfang der normalerweise aufzurufenden Datei einfügen und die Datei aus dem Anhang in ein Verzeichnis packen (Pfade anpassen nicht vergessen). Wichtig ist, das ihr den internen Anwendungsnamen wisst. Da eh die config benutzt werden muss, steht oben der komplette Name. Er fängt für gewöhnlich mit SYNO.SDS._ThirdParty..App. <Text> an, hinter dem Punkt folgt dann der frei wählbare Text. Er kann natürlich auch anders lauten und muss nicht mit SYNO.SDS._ThirdParty.App. beginnen, einfach mal nachsehen. Dieser komplette Name muss in der aufgerufenen Funktion übergeben werden.
Javascript
Die Javascript Variante eignet sich für HTML- und PHP-Skripte. Die Prüfung ob der Benutzer angemeldet ist muss zuvor stattfinden, da dies nicht im Javascript-Code durchgeführt wird.
Für eine reine Javascript-Anwendung kann auch das im "3rd-Party Apps Developer Guide" von Synology auf Seite 87 erwähnte dsmtoken.cgi benutzt werden.
PHP
Es existiert nun auch ein Stück Code für PHP (Dank an mrsandman), das Script kommt nun ohne Javascript-Teil aus.
Was machen die Skripte
Zuerst wird überprüft, ob ein SynoToken existiert und bei Bedarf der Url angehangen. Danach wird die initdata.cgi bzw. ab DSM 6.0 die synowebapi aufgerufen und ausgewertet. Im Anschluss folgt die Suche nach der Applikation im Abschnitt "AppPrivilege". Die 3 gesammelten Werte werden dann als Rückgabewerte der Funktion ausgegeben.
Update 20.07.2013
Für den DSM 4.3 beta habe ich das Perl-Skript um das SynoToken erweitert. Das Skript ist nun eine Funktion und man erhält als Rückgabe den SynoToken, den Usernamen und ob dieser der Administratoren Gruppe angehört.
Growler, Notification forwarder und iPKGui sind bereits mit der neuen Variante ausgestattet.
Die Javascript Variante ist nun ebenfalls eine Funktion, allerdings kann sie bis jetzt nur bei deaktiviertem Sicherheitsfeature benutzt werden. Als Rückgabe erhält man ein Array mit dem Usernamen und ob dieser der Administratoren Gruppe angehört.
Update 26.01.2014
In DSM 5 existiert die Datei in /tmp nicht mehr, deshalb musste ein anderer Weg her, um an das SynoToken zu kommen. Wie schon im letzten "3rd-Party Apps Developer Guide" von Synology erwähnt, liefert login.cgi die notwendige Information, wenn ein Benutzer im DSM angemeldet ist (Dank an mrsandman für den Schubs in die richtige Richtung).
Update 01.09.2015
Scripte wurde geringfügig überarbeitet, kleinere Fehler behoben.
Update 07.03.2016
Anpassungen für DSM 6.0 rc
Variante in plain PHP und Perl, Javascript Variante vorerst entfernt
Update 18.09.2016
Auf Anregung von Tosoboso wird nun vor Durchführung in beiden Scripten ein Backup der Environmentvariable "QUERY_STRING" angelegt und am Ende wiederhergestellt.
Wie immer ist Alles was ihr auf eurer DS anstellt euer Ding, ich übernehme keine Haftung.
Wieder einmal packte mich mein Forscherdrang um die letzten Geheimnisse des DSM ans Licht zu bringen. Bedingt durch eines meiner aktuellen Projekte (Notification messanger), in diesem ich eine eigene Benutzerberechtrigung integrierte, begab ich mich auf die Suche, unter welchen Kriterien bzw. welcher Konfiguration ein App unter den Anwendungsberechtigungen erscheint.
Da nun auch die von Synology separat angebotenen Applikationen teilweise in dem Dialog der Anwendungsberechtigungen zu sehen waren, untersuchte ich diese ein wenig näher.
Mit dem Eintrag "grantPrivilege" in der config des App's wird die Grundlage geschaffen, damit das App in der Liste auswählbar ist. Der DSM durchsucht nämlich alle App-Verzeichnisse nach den config Dateien. Wird der EIntrag "grantPrivilege" gefunden, stellt die Systemsteuerung das entsprechende App in der Liste dar. Erste Versuche zeigten den erhofften Erfolg, allerdings war da noch eine Kleinigkeit, für die ich eine Lösung finden musste.
Synology hat diese Funktion nicht für App's vorgesehen, die per type "legacy" oder "url" gestartet werden. Denn eine App mit einer dieser beiden type's, welche in einem neuen Fenster aufgerufen wird, wird immer per URL aufgerufen. Und dort wird einfach keine Prüfung auf Berechtigung des Benutzers durchgeführt. Jeder angemeldete Benutzer der die URL kennt, kann das App direkt öffnen. Ich schreibe mit Absicht "angemeldete Benutzer", da trotz Allem noch eine Prüfung diesbezüglich durchgeführt wird.
Nach ein wenig Suche bin ich in der Datei initdata.cgi fündig geworden. Die initdata.cgi gibt die Information über die Berechtigung des Benutzer aus, man muss sie nur noch extrahieren und auswerten.
Damit das Ganze auch funktioniert, muss man unbedingt die Variante mit der config benutzen. Die application.cfg ist veraltet und nur noch aus Kompatibilitätsgründen vorhanden. Über die Vorteile der config habe ich schon im Wiki geschrieben - Aufbau der Datei 'config'
Default ist nur der "admin" berechtigt, andere Benutzer (auch Administratoren) müssen erst explizit zugewiesen werden.
Als Wert für den Eintrag "grantPrivilege" stehen die folgenden 4 zur Verfügung, meist wird "local" benutzt.
local | nur für lokale Benutzer kann diese App ausgewählt werden |
domain | nur für domain Benutzer kann diese App ausgewählt werden |
ldap | nur für LDAP Benutzer kann diese App ausgewählt werden |
all | für alle Benutzer kann diese App ausgewählt werden |
Von der Theorie nun zur Praxis...
Ich habe 2(3) Skripte erarbeitet, die diese Aufgabe erledigen sollen, in Perl / Javascript / PHP. (siehe Anhänge)
Perl
Einfach den folgenden Code möglichst am Anfang der normalerweise aufzurufenden Datei einfügen und die Datei aus dem Anhang in ein Verzeichnis packen (Pfade anpassen nicht vergessen). Wichtig ist, das ihr den internen Anwendungsnamen wisst. Da eh die config benutzt werden muss, steht oben der komplette Name. Er fängt für gewöhnlich mit SYNO.SDS._ThirdParty..App. <Text> an, hinter dem Punkt folgt dann der frei wählbare Text. Er kann natürlich auch anders lauten und muss nicht mit SYNO.SDS._ThirdParty.App. beginnen, einfach mal nachsehen. Dieser komplette Name muss in der aufgerufenen Funktion übergeben werden.
Rich (BBCode):
require "include/check_appprivilege.pl";
my ($synotoken,$synouser,$is_admin) = check_privilege('<Name_der_Anwendung>');
Javascript
Die Javascript Variante eignet sich für HTML- und PHP-Skripte. Die Prüfung ob der Benutzer angemeldet ist muss zuvor stattfinden, da dies nicht im Javascript-Code durchgeführt wird.
Rich (BBCode):
var check = check_appprivilege('<Name_der_Anwendung>')
PHP
Es existiert nun auch ein Stück Code für PHP (Dank an mrsandman), das Script kommt nun ohne Javascript-Teil aus.
PHP:
require('check_appprivilege.php');
list($synotoken, $synouser, $is_admin) = check_privilege('<Name_der_Anwendung>');
Zuerst wird überprüft, ob ein SynoToken existiert und bei Bedarf der Url angehangen. Danach wird die initdata.cgi bzw. ab DSM 6.0 die synowebapi aufgerufen und ausgewertet. Im Anschluss folgt die Suche nach der Applikation im Abschnitt "AppPrivilege". Die 3 gesammelten Werte werden dann als Rückgabewerte der Funktion ausgegeben.
Update 20.07.2013
Für den DSM 4.3 beta habe ich das Perl-Skript um das SynoToken erweitert. Das Skript ist nun eine Funktion und man erhält als Rückgabe den SynoToken, den Usernamen und ob dieser der Administratoren Gruppe angehört.
Growler, Notification forwarder und iPKGui sind bereits mit der neuen Variante ausgestattet.
Die Javascript Variante ist nun ebenfalls eine Funktion, allerdings kann sie bis jetzt nur bei deaktiviertem Sicherheitsfeature benutzt werden. Als Rückgabe erhält man ein Array mit dem Usernamen und ob dieser der Administratoren Gruppe angehört.
Update 26.01.2014
In DSM 5 existiert die Datei in /tmp nicht mehr, deshalb musste ein anderer Weg her, um an das SynoToken zu kommen. Wie schon im letzten "3rd-Party Apps Developer Guide" von Synology erwähnt, liefert login.cgi die notwendige Information, wenn ein Benutzer im DSM angemeldet ist (Dank an mrsandman für den Schubs in die richtige Richtung).
Update 01.09.2015
Scripte wurde geringfügig überarbeitet, kleinere Fehler behoben.
Update 07.03.2016
Anpassungen für DSM 6.0 rc
Variante in plain PHP und Perl, Javascript Variante vorerst entfernt
Update 18.09.2016
Auf Anregung von Tosoboso wird nun vor Durchführung in beiden Scripten ein Backup der Environmentvariable "QUERY_STRING" angelegt und am Ende wiederhergestellt.
Wie immer ist Alles was ihr auf eurer DS anstellt euer Ding, ich übernehme keine Haftung.
Anhänge
Zuletzt bearbeitet: