Synology 3rd Party CONFIG

Status
Für weitere Antworten geschlossen.

Tommes

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
26. Okt 2009
Beiträge
9.669
Punkte für Reaktionen
1.566
Punkte
314
Hm, per hidden Field über GET, da passt doch etwas nicht...habe ich da jetzt etwas verpasst?

Das weiter oben von dir bereits verlinkte Script, welches GET und POST Anfragen auswertet, sammelt ja alle key/value Werte die über Links (GET) und/oder Formularen (GET / POST) anfallen. Wenn ich nun das Hidden Field...

PHP:
<input type="hidden" name="token" value="$synotoken" />

... per GET übergebe, dann hängt mir das Script den entsprechenden key="value" an die URL an, so wie im Screenshot gezeigt. Übergebe ich das aber per POST, dann passiert nichts und die Anfrage wird nicht weiterverarbeitet. Die Firefox-Konsole gibt mir dementsprechend keine Kopfdaten aus, weil es scheinbar garnicht erst soweit kommt dieses zu erfassen. Ich muss mir das mit der Environment Variable "X-SYNO-TOKEN" später aber nochmal genauer anschauen, da ich hier wohl noch ein kleines Verständnisproblem habe.

Wie dem auch sei... bisher bin ich mit der GET Methode immer noch gut zurecht gekommen und theoretisch bräuchte ich POST nicht zwangsläufig. Nichts desto trotz ist die Datenübergabe mittels POST wesentlich charmanter. Sollten wir hier also zu keiner Lösung kommen, wäre das für mich durchaus verkraftbar.

Interssant wäre aber auch zu erfahren, wie @Kalysto es umgesetzt bekommen hat, das eine POST Anfrage unter Verwendung des SynoToken durchläuft. Ich schließe ja durchaus nicht aus, das ich mal wieder ziemlich auf dem Schlauch stehe und meine Fehler einfach nicht erkenne.

Tommes
 
Zuletzt bearbeitet:

Tommes

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
26. Okt 2009
Beiträge
9.669
Punkte für Reaktionen
1.566
Punkte
314
Ich glaub ich habe den Übeltäter gefunden, nur habe ich keine Lösung dafür. PsychoHH hatte *hier* damals auch bereits darauf aufmerksam gemacht. Folgendes habe ich gemacht...

Wenn ich das Script ( https://oinkzwurgl.org/hacking/bash_cgi/ ) ohne den SynoToken ausführe, dann läuft GET und POST.

2018-07-10_Screenshot_01.PNG

Füge ich die SynoToken-Abfrage hinzu geht nur noch GET. Soweit bekannt. Wenn ich im Script innerhalb der Funktion cgi_get_POST_vars() die Zeile...

PHP:
read -N $CONTENT_LENGTH QUERY_STRING_POST

... auskommentiere, dann läuft das Script per POST komischerweise wieder durch nur sind für mich key="value" nicht mehr greifbar, da die Formularfelder als auch die Rückgabe im HTML-Dokument nach dem Absenden leer bleiben.

2018-07-10_Screenshot_02.PNG


Es muss also eine Verbindung zwischen dem SynoToken und der Zeile read -N $CONTENT_LENGTH QUERY_STRING_POST bestehen, nur ist mein Horizont zu beschränkt um hier eine Lösung zu erkennen.

Ich hoffe, ich konnte mich einigermaßen gut erklären und du verstehst, was ich meine.

Tommes
 
Zuletzt bearbeitet:

QTip

Super-Moderator
Teammitglied
Mitglied seit
04. Sep 2008
Beiträge
2.341
Punkte für Reaktionen
14
Punkte
84
Die Zeile
Rich (BBCode):
read -N $CONTENT_LENGTH QUERY_STRING_POST
ist für das Auslesen zuständig, wenn du sie auskommentierst passiert auch nix.
Lass dir doch mal $CONTENT_LENGTH und $QUERY_STRING_POST ausgeben und schauen was in den Variablen enthalten ist.

Das Bash-Script habe ich damals ebenfalls benutzt und POST funktionierte. Liest du mit cgi_getvars BOTH ALL aus?

Formular:
PHP:
<form action="backend.cgi" method="POST"> 
<input type="text" name="bar">
<input type="textarea" name="foo">
<input type="hidden" name="token" value="124567890" />
<input type="submit">
</form>
in Verbindung mit dem backend.cgi und cgi_getvars POST ALL gibt alle Variablen korrekt zurück.
form_result.png
 

Tommes

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
26. Okt 2009
Beiträge
9.669
Punkte für Reaktionen
1.566
Punkte
314
Ich kann $CONTENT_LENGTH und $QUERY_STRING_POST nur ausgeben lassen, wenn der SynoToken nicht aktiv ist. Dann erhalte ich sowas...

2018-07-10_Screenshot_05.PNG

Augenscheinlich funktioniert ja alles. Ich lade ich die Funtion mit cgi_getvars BOTH ALL, aber auch mit cgi_getvars POST ALL funktioniert das nicht. Ich versteh das nicht. Ich glaub, ich bleib bei GET und höre auf, mir wegen des POST's den Kopf zu zerbrechen. Ich werd da wohl eh nicht drauf kommen. Oder es liegt tatsächlich an der Art und Weise wie wir den SynoToken implementieren.

Tommes
 

QTip

Super-Moderator
Teammitglied
Mitglied seit
04. Sep 2008
Beiträge
2.341
Punkte für Reaktionen
14
Punkte
84
Was meinst du mit "...wenn der SynoToken nicht aktiv ist.". Ist damit die Einstellung unter Systemsteuerung - Sicherheit gemeint?
An welcher Stelle im Script fragst du $CONTENT_LENGTH und $QUERY_STRING_POST ab? Ich würde es gleich am Anfang abfragen (hinter echo -e "Content-type: text/html\n\n") und danach ein exit einbauen, dann dürfte nix hängen.

Verwendest du für den Test eine index.html mit dem Formular, das bash_cgi und mehr nicht?
Mein Formular, ist reines HTML:
HTML:
<!DOCTYPE html>
<html>
<body>
<form action="backend.cgi" method="POST"> 
<input type="text" name="bar">
<input type="textarea" name="foo">
<input type="hidden" name="token" value="1234567890" />
<input type="submit" value="Abschicken">
</form>
</body>
</html>
Der SynoToken wird noch nicht einmal mitgeschickt und es funktioniert trotzdem, egal ob SynoToken-Funktion aktiv oder nicht.
 

Tommes

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
26. Okt 2009
Beiträge
9.669
Punkte für Reaktionen
1.566
Punkte
314
Ich habe unter volume1/@appstore/Holodeck eine index.cgi sowie unter /includes eine token.php sowie die check_appprivilege.php. Letztere ist die Orginale aus deinem SynoToken Thread. Die token.php rufe ich dann innerhalb der index.cgi auf und extrahiere daraus die nötigen Daten. Ebenfalls in der index.cgi ist das GET/POST-Script, um das es hier ja bereits die ganze Zeit geht. Im späteren Verlauf möchte ich mir die empfangen key="value" Werte mittels der synosetkeyvalue - Funktion in einer Datei wegspeichern um sie weiterverarbeiten zu können. Das funktioniert auch bereits, nur habe ich das hier mal weggelassen.

Einmal die token.php
PHP:
<?php
require('includes/check_appprivilege.php'); list($synotoken,
$synouser, $is_admin) =
check_privilege('SYNO.SDS.Holodeck.Application'); if ($synouser == '')
	{
		echo "0";
	}
else
	{
		echo "token: $synotoken user: $synouser admin: $is_admin";
	}
?>

Und hier die index.cgi
PHP:
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/syno/bin:/usr/syno/sbin

# SPK lokalisieren
app_home=$(echo /volume*/@appstore/Holodeck) || exit

# Zugangsberechtigungen überprüfen (Syno-Token)
app_privilege=$(php -f $app_home/includes/token.php) || exit
synotoken=$(echo $app_privilege | sed "s/.*token: //;s/ user:.*//") || exit
synouser=$(echo $app_privilege | sed "s/.*user: //;s/ admin:.*//") || exit
is_admin=$(echo $app_privilege | sed -e 's/.*admin: //') || exit
if [ -n "$app_privilege" ]; then
	if [[ "$app_privilege" != "0" ]] && [[ "$synouser" != "0" ]]; then
		access="yes"
	fi
fi
# Beenden wenn keine Zugangsberechtigung...
if [ -z "$access" ]; then
	exit
# ... ansonsten SPK ausführen!
else
	# (internal) routine to store POST data
	function cgi_get_POST_vars()
	{
		# only handle POST requests here
		[ "$REQUEST_METHOD" != "POST" ] && return

		# save POST variables (only first time this is called)
		[ ! -z "$QUERY_STRING_POST" ] && return

		# skip empty content
		[ -z "$CONTENT_LENGTH" ] && return

		# check content type
		# FIXME: not sure if we could handle uploads with this..
		[ "${CONTENT_TYPE}" != "application/x-www-form-urlencoded" ] && \
			echo "bash.cgi warning: you should probably use MIME type "\
				 "application/x-www-form-urlencoded!" 1>&2

		# convert multipart to urlencoded
		local handlemultipart=0 # enable to handle multipart/form-data (dangerous?)
		if [ "$handlemultipart" = "1" -a "${CONTENT_TYPE:0:19}" = "multipart/form-data" ]; then
			boundary=${CONTENT_TYPE:30}
			read -N $CONTENT_LENGTH RECEIVED_POST
			# FIXME: don't use awk, handle binary data (Content-Type: application/octet-stream)
			QUERY_STRING_POST=$(echo "$RECEIVED_POST" | awk -v b=$boundary 'BEGIN { RS=b"\r\n"; FS="\r\n"; ORS="&" }
			   $1 ~ /^Content-Disposition/ {gsub(/Content-Disposition: form-data; name=/, "", $1); gsub("\"", "", $1); print $1"="$3 }')

		# take input string as is
		else
			read -N $CONTENT_LENGTH QUERY_STRING_POST
		fi

		return
	}

	# (internal) routine to decode urlencoded strings
	function cgi_decodevar()
	{
		[ $# -ne 1 ] && return
		local v t h
		# replace all + with whitespace and append %%
		t="${1//+/ }%%"
		while [ ${#t} -gt 0 -a "${t}" != "%" ]; do
			v="${v}${t%%\%*}" # digest up to the first %
			t="${t#*%}"       # remove digested part
			# decode if there is anything to decode and if not at end of string
			if [ ${#t} -gt 0 -a "${t}" != "%" ]; then
				h=${t:0:2} # save first two chars
				t="${t:2}" # remove these
				v="${v}"`echo -e \\\\x${h}` # convert hex to special char
			fi
		done
		# return decoded string
		echo "${v}"
		return
	}

	# routine to get variables from http requests
	# usage: cgi_getvars method varname1 [.. varnameN]
	# method is either GET or POST or BOTH
	# the magic varible name ALL gets everything
	function cgi_getvars()
	{
		[ $# -lt 2 ] && return
		local q p k v s
		# get query
		case $1 in
			GET)
				[ ! -z "${QUERY_STRING}" ] && q="${QUERY_STRING}&"
				;;
			POST)
				cgi_get_POST_vars
				[ ! -z "${QUERY_STRING_POST}" ] && q="${QUERY_STRING_POST}&"
				;;
			BOTH)
				[ ! -z "${QUERY_STRING}" ] && q="${QUERY_STRING}&"
				cgi_get_POST_vars
				[ ! -z "${QUERY_STRING_POST}" ] && q="${q}${QUERY_STRING_POST}&"
				;;
		esac
		shift
		s=" $* "
		# parse the query data
		while [ ! -z "$q" ]; do
			p="${q%%&*}"  # get first part of query string
			k="${p%%=*}"  # get the key (variable name) from it
			v="${p#*=}"   # get the value from it
			q="${q#$p&*}" # strip first part from query string
			# decode and assign variable if requested
			[ "$1" = "ALL" -o "${s/ $k /}" != "$s" ] && \
				export "$k"="`cgi_decodevar \"$v\"`"
		done
		return
	}

	echo "Content-type: text/html"
	echo
	echo '
	<!doctype html>
	<html lang="en">
	<head>
		<meta charset="utf-8" />
		<title>Holodeck</title>
		<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0">
	</head>
	<body>
		<header></header>
		<nav></nav>	
		<article>'
			# register all GET variables
			cgi_getvars BOTH ALL
			echo '
			<form action="index.cgi" method="post" autocomplete="on">
				bar: <input type="text" name="bar"><br /><br />
				foo: <input type="textarea" name="foo"><br /><br />
				<input type="hidden" name="token" value="124567890" />
				       <input type="submit">
			</form>	
			<p> </p>	
			<table>
				<tr><th colspan="2">Empfangene Daten</th></tr>
				<tr><td>bar</td><td>: '$bar'</td></tr>
				<tr><td>foo</td><td>: '$foo'</td></tr>
				<tr><td>token (hidden)</td><td>: '$token'</td></tr>
				<tr><td>CONTENT_LENGTH</td><td>: '$CONTENT_LENGTH'</td></tr>
				<tr><td>QUERY_STRING_POST</td><td>: '$QUERY_STRING_POST'</td></tr>
				<tr><td>app_privilege</td><td>: '$app_privilege'</td></tr>
				<tr><td>synotoken</td><td>: '$synotoken'</td></tr>
				<tr><td>synouser</td><td>: '$synouser'</td></tr>
				<tr><td>is_admin</td><td>: '$is_admin'</td></tr>
			</table>	
		</article>
		<footer></footer>
	</body>
	</html>'
fi

Wie gesagt, wenn ich <form method="post"... setze bleibt das System hängen, bei <form method="get"... läuft es durch. Wenn ich die Zeilen...

PHP:
# Zugangsberechtigungen überprüfen (Syno-Token)
app_privilege=$(php -f $app_home/includes/token.php) || exit
synotoken=$(echo $app_privilege | sed "s/.*token: //;s/ user:.*//") || exit
synouser=$(echo $app_privilege | sed "s/.*user: //;s/ admin:.*//") || exit
is_admin=$(echo $app_privilege | sed -e 's/.*admin: //') || exit
if [ -n "$app_privilege" ]; then
	if [[ "$app_privilege" != "0" ]] && [[ "$synouser" != "0" ]]; then
		access="yes"
	fi
fi
# Beenden wenn keine Zugangsberechtigung...
if [ -z "$access" ]; then
	exit
# ... ansonsten SPK ausführen!
else
...
..
.
fi

aus der index.cgi lösche, dann funktioniert POST auch! Nur nicht in Verbindung mit dem SynoToken.

Tommes
 

Tommes

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
26. Okt 2009
Beiträge
9.669
Punkte für Reaktionen
1.566
Punkte
314
BTW: Oder gibt es als Alternative zum SynoToken noch eine andere... vielleicht einfachere Möglichkeit, das ein SPK nur nach Anmeldung am DSM ausgeführt werden kann/darf? Lasse ich den SynoToken nämlich weg, kann ich das SPK ja durch die Eingabe der URL, in meinem Fall http://192.168.178.2:5000/webman/3rdparty/Holodeck/index.cgi aufrufen. Sorry für meine vielleicht dämliche Frage!

Tommes
 

Kalysto

Benutzer
Mitglied seit
30. Dez 2014
Beiträge
384
Punkte für Reaktionen
10
Punkte
18
kannst du mir das SPK mal zukommen lassen dann schaue ich auch nochmal ??
denn das Script Funktioniert definitiv!!
und das auch mit SynoToken ich verwende es auch :D
 

Tommes

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
26. Okt 2009
Beiträge
9.669
Punkte für Reaktionen
1.566
Punkte
314
Es gibt eigentlich kein SPK, welches ich dir zukommen lassen könnte. Ich spiele aktuell nur mit dem POST/GET-Script rum und habe mir dafür - wenn man es so nennen will - ein kleines Pseudo-SPK gebastelt, welches ich dann gerne Holodeck nenne. Das ist meine Testumgebung um neue Dinge auszuprobieren. Das, was du in meinem Post #66 siehst, ist quasi das SPK... wenn du so willst. Sicherlich habe ich auch noch Funktionen für die Sprachauswahl etc. aber das ist ja hier nicht Gegenstand meines Problems.

Es kann gut sein, das dieses POST/GET-Script unter einer php-Umgebung zusammen mit dem SynoToken läuft, ich arbeite aber in erster Linie mit BASH und hier wird wohl vermutlich auch das Problem liegen... nämlich in der Art und Weise, wie ich den SynoToken (welcher ja in php geschrieben ist) in BASH implementiere. Ich arbeite hier halt nicht mit dem php welchses du über das Paketzentrum installieren kannst, sondern mit dem System php des DSM.

Tommes
 

Kalysto

Benutzer
Mitglied seit
30. Dez 2014
Beiträge
384
Punkte für Reaktionen
10
Punkte
18
Ich verwende es auch über Bash sprich über die .cgi
Wenn du willst kann ich dir morgen erst gegen Abend zeigen wie ich es verwende bzw in meine html Page eingebunden habe evtl hilft es dir und deinem Problem:)

Verwende den SynoToken sowie das Script mit Post get über die cgi/Bash
 

Tommes

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
26. Okt 2009
Beiträge
9.669
Punkte für Reaktionen
1.566
Punkte
314

Kalysto

Benutzer
Mitglied seit
30. Dez 2014
Beiträge
384
Punkte für Reaktionen
10
Punkte
18
so jetzt aber ;)

Hier meine Abfrage bzw. Einleitung des SynoTokens:
Rich (BBCode):
# Zugangsberechtigungen überprüfen
# -------------------------------------------------------------------------
LOGIN=$(php -f "/usr/syno/synoman/webman/3rdparty/${PACKAGE_NAME}/webapp/login/check_login.php") || LOGIN_ERR="1"
LOGIN_USER=$(echo "${LOGIN}")
D.h. dies hier ist meine Zweit Seite hier wird nur eine Abfrage gestartet ob der Benutzer auch wirklich Angemeldet ist.

Dies steht in der check_login.php:
PHP:
<?php
	if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])){
		$clientIP = $_SERVER['HTTP_X_FORWARDED_FOR'];
	}
	elseif (isset($_SERVER['HTTP_X_REAL_IP'])){
		$clientIP = $_SERVER['HTTP_X_REAL_IP'];
	}
	else {
		$clientIP = $_SERVER['REMOTE_ADDR'];
	}
	
	parse_str($_SERVER['QUERY_STRING']);
	putenv('HTTP_COOKIE='.$_SERVER['HTTP_COOKIE']);
	putenv('REMOTE_ADDR='.$clientIP);
	putenv('QUERY_STRING=SynoToken='.$SynoToken);
	$synouser = shell_exec("/usr/syno/synoman/webman/modules/authenticate.cgi");
	if ($synouser == '') {
		exit();
	}
	else {
		echo "$synouser";
	}
?>

Hier wäre nun eine Verkürzung des form Elements:

HTML:
<form action="?SynoToken='${SynoToken}'&SynoAdmin='${SynoAdmin}'" method="post">
						<!-- Anpassung der Farbausgaben im UDB Log -->
						<fieldset class="formular">
							<!-- Eintrag der Neuen Log Farben -->
							<!-- @HTML_PHP Anpassung der Farbausgaben im UDB Log -- Eintrag der Neuen Log Farben -->
							<legend class="formular heading">'$("${GET_VAR}" "${webui_lang}" overview_cgi_UDBlog)'</legend>
							'${CHANGE_CFG}'
							<div class="center UDB_LOG">
								<legend class="formular heading_low">'$("${GET_VAR}" "${webui_lang}" setup_cgi_install)'</legend>
								<input class="formular" type="text" name="install" value="'${get_var_install}'" />
								<div class="beam_color" style="background-color: '${get_var_install}';"></div>
								<button class="infobox" type="button" data-toggle="popover" data-html="true" data-container="body" data-placement="bottom" data-content="'$("${GET_VAR}" "${webui_lang}" setup_cgi_install_desc)'"><i class="fas fa-question"></i></button>
							</div>

Hier nun der Aufruf meines bzw. welches QTip empfohlene Script:
Rich (BBCode):
# Deklarieren der GET, POST Variablen
# -------------------------------------------------------------------------
. "${path_to_sys}" form

und form beinhaltet einfach nur das besagte script:
Rich (BBCode):
cgi_get_POST_vars() {
		# check content type
		# FIXME: not sure if we could handle uploads with this..
		[ "${CONTENT_TYPE}" != "application/x-www-form-urlencoded" ] && \
		echo "Warning: you should probably use MIME type "\
			 "application/x-www-form-urlencoded!" 1>&2
		# save POST variables (only first time this is called)
		[ -z "$QUERY_STRING_POST" \
		  -a "$REQUEST_METHOD" = "POST" -a ! -z "$CONTENT_LENGTH" ] && \
		read -n $CONTENT_LENGTH QUERY_STRING_POST
		return
	}
	
	cgi_decodevar() {
		[ $# -ne 1 ] && return
		local v t h
		# replace all + with whitespace and append %%
		t="${1//+/ }%%"
		while [ ${#t} -gt 0 -a "${t}" != "%" ]; do
		v="${v}${t%%\%*}" # digest up to the first %
		t="${t#*%}"       # remove digested part
		# decode if there is anything to decode and if not at end of string
		if [ ${#t} -gt 0 -a "${t}" != "%" ]; then
			h=${t:0:2} # save first two chars
			t="${t:2}" # remove these
			v="${v}"`echo -e \\\\x${h}` # convert hex to special char
		fi
		done
		# return decoded string
		echo "${v}"
		return
	}
	
	cgi_getvars() {
		[ $# -lt 2 ] && return
		local q p k v s
		# get query
		case $1 in
		GET)
			[ ! -z "${QUERY_STRING}" ] && q="${QUERY_STRING}&"
			;;
		POST)
			cgi_get_POST_vars
			[ ! -z "${QUERY_STRING_POST}" ] && q="${QUERY_STRING_POST}&"
			;;
		BOTH)
			[ ! -z "${QUERY_STRING}" ] && q="${QUERY_STRING}&"
			cgi_get_POST_vars
			[ ! -z "${QUERY_STRING_POST}" ] && q="${q}${QUERY_STRING_POST}&"
			;;
		esac
		shift
		s=" $* "
		# parse the query data
		while [ ! -z "$q" ]; do
		p="${q%%&*}"  # get first part of query string
		k="${p%%=*}"  # get the key (variable name) from it
		v="${p#*=}"   # get the value from it
		q="${q#$p&*}" # strip first part from query string
		# decode and evaluate var if requested
		[ "$1" = "ALL" -o "${s/ $k /}" != "$s" ] && \
			eval "$k=\"`cgi_decodevar \"$v\"`\""
		done
		return
	}
	
	cgi_getvars BOTH ALL

Das wars eig. und somit habe ich keine Probleme und es Funktioniert wunderbar!
 

Tommes

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
26. Okt 2009
Beiträge
9.669
Punkte für Reaktionen
1.566
Punkte
314
Hier läuft doch was falsch! Also entweder versteh ich dich nicht, oder du verstehst mich nicht! Oder ich hab echt einen an der Waffel!

Deine Abfrage bzw. Einleitung des SynoTokens... wo bitte fragst du da den SynoToken ab? Das einzige, was das php-Script da abfragt, ist die authenticate.cgi, ob ein Benutzer angemeldet ist. Wenn ich mir dann die Variable LOGIN_USER, SynoToken oder sonst was ausgeben lassen möchte, bleiben diese leer! Das ist für mich also absolut nicht logisch! Und wenn ich mich vom DSM abmelde und die URL zum SPK eingebe, dann kann ich die Seite öffen, obwohl das ja garnicht gehen sollte.

Von daher... entweder reden wir zwei jetzt total aneinander vorbei oder ich versteh deinen Wink mit dem Zaunpfahl einfach nicht. Kann ja durchaus sein, das ich mal wieder total auf dem Schlauch stehe.

Vielleicht verknüpfst du deine Erkenntnisse einfach mal mit meinem Script aus Post #66... vielleicht kann ich dir dann besser folgen.

Tommes
 

Kalysto

Benutzer
Mitglied seit
30. Dez 2014
Beiträge
384
Punkte für Reaktionen
10
Punkte
18
Frage zu: check_apprivilege.php
PHP:
Zeile: 41$appprivilege = (array_key_exists($appname, $initdata['data']['AppPrivilege']) && $initdata['data']['AppPrivilege'][$appname]) ? 1 : 0;
          Zeile: 42$is_admin = (array_key_exists('is_admin', $initdata['data']['Session']) && $initdata['data']['Session']['is_admin'] == 1) ? 1 : 0;
Seid meinem Update auf DSM 6.0 bekomme ich hier die Aussage / Ausgabe das
PHP:
 array_key_exists
ein array erwarten würde
ist darüber etwas bekannt wie man das fixen kann ?

hier noch die Ausgabe des Fehlers:
Rich (BBCode):
LOGIN -- Warning: array_key_exists() expects parameter 2 to be array, null given in /volume1/@appstore/SynoDSApps/webapp/login/check_appprivilege.php on line 41 Warning: array_key_exists() expects parameter 2 to be array, null given in /volume1/@appstore/SynoDSApps/webapp/login/check_appprivilege.php on line 42 0

@QTip
Ich habe hierzu eine Lösung gefunden weis nicht ob das Problem nur bei mir besteht oder auch bei anderen Auftreten würde.
Das ist der geänderte Code:
PHP:
$synouser_raw_data = str_replace(' ', '\ ', $synouser);
          $raw_data = shell_exec("/usr/syno/bin/synowebapi --exec api=SYNO.Core.Desktop.Initdata method=get version=1 runner=".$synouser_raw_data);
D.h. Mein Benutzer hatte Leerzeichen und diese haben zu dieser Fehlerausgabe geführt gehabt!
Kannst du evtl bei dir anpassen oder nochmal checken :D



Hier läuft doch was falsch! Also entweder versteh ich dich nicht, oder du verstehst mich nicht! Oder ich hab echt einen an der Waffel!

Deine Abfrage bzw. Einleitung des SynoTokens... wo bitte fragst du da den SynoToken ab? Das einzige, was das php-Script da abfragt, ist die authenticate.cgi, ob ein Benutzer angemeldet ist. Wenn ich mir dann die Variable LOGIN_USER, SynoToken oder sonst was ausgeben lassen möchte, bleiben diese leer! Das ist für mich also absolut nicht logisch! Und wenn ich mich vom DSM abmelde und die URL zum SPK eingebe, dann kann ich die Seite öffen, obwohl das ja garnicht gehen sollte.

Von daher... entweder reden wir zwei jetzt total aneinander vorbei oder ich versteh deinen Wink mit dem Zaunpfahl einfach nicht. Kann ja durchaus sein, das ich mal wieder total auf dem Schlauch stehe.

Vielleicht verknüpfst du deine Erkenntnisse einfach mal mit meinem Script aus Post #66... vielleicht kann ich dir dann besser folgen.

Tommes

Hast mich glaube Falsch verstanden :)
Das "Script" welches ich dir gezeigt habe dient Lediglich nur dazu um zu Prüfen ob der Benutzer auch Eingeloggt ist und auf der Loginseite ist....
Nochmal anders :D

In meiner Index.cgi ist folgendes als Prüfung und Ausgabe:
Rich (BBCode):
# Zugangsberechtigungen überprüfen
# -------------------------------------------------------------------------
LOGIN=$(php -f "/usr/syno/synoman/webman/3rdparty/${PACKAGE_NAME}/webapp/login/privilege.php") || LOGIN_ERR="1"
LOGIN_TOKEN=$(echo ${LOGIN} | awk -F:_ '{print$1}') || LOGIN_ERR="1"
LOGIN_USER=$(echo ${LOGIN} | awk -F:_ '{print$2}') || LOGIN_ERR="1"
LOGIN_ADMIN=$(echo ${LOGIN} | awk -F:_ '{print$3}') || LOGIN_ERR="1"

in privilege.php ist folgendes:
PHP:
<?php
	require('webapp/login/check_appprivilege.php');
	
	list($synotoken,$synouser,$is_admin) = check_privilege('SYNO.SDS.SynoDSApps.Application');
	if ($synouser == '') {
		exit();
	}
	else {
		echo "$synotoken:_$synouser:$is_admin";
	}
?>

check_appprivilege.php ist QTip`s Script!

und auf meiner Zweiten Seite in meinem Fall setup.cgi wo ich die form abfrage habe verwende ich das so:
Rich (BBCode):
# Zugangsberechtigungen überprüfen
# -------------------------------------------------------------------------
LOGIN=$(php -f "/usr/syno/synoman/webman/3rdparty/${PACKAGE_NAME}/webapp/login/check_login.php") || LOGIN_ERR="1"

in check_login.php ist folgendes:
PHP:
<?php
	if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])){
		$clientIP = $_SERVER['HTTP_X_FORWARDED_FOR'];
	}
	elseif (isset($_SERVER['HTTP_X_REAL_IP'])){
		$clientIP = $_SERVER['HTTP_X_REAL_IP'];
	}
	else {
		$clientIP = $_SERVER['REMOTE_ADDR'];
	}
	
	parse_str($_SERVER['QUERY_STRING']);
	putenv('HTTP_COOKIE='.$_SERVER['HTTP_COOKIE']);
	putenv('REMOTE_ADDR='.$clientIP);
	putenv('QUERY_STRING=SynoToken='.$SynoToken);
	$synouser = shell_exec("/usr/syno/synoman/webman/modules/authenticate.cgi");
	if ($synouser == '') {
		exit();
	}
	else {
		echo "$synouser";
	}
?>

Das heißt hier Prüfe ich nur noch ob der Benutzer auch wirklich den Loginprozess erledigt hatte in der Index.cgi mehr nicht... meinen SynoToken und SynoAdmin bekomme ich somit alles von der Index.cgi....
evtl ist das der Unterscheid bei uns beiden....

Hoffe du hast mich nun besser verstanden ansonsten könnte ich dir anbieten das ich die form Geschichte einmal auf meine Index.cgi teste worin die eigentliche abfrage des Synotokens ist...
 

Tommes

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
26. Okt 2009
Beiträge
9.669
Punkte für Reaktionen
1.566
Punkte
314
Sooooo.... Feierabend, mir reichts!

Scheinbar verwende ich hier einen anderen DSM als du (oder ihr), denn sobald ich über eine .cgi einen php-Befehl ausführe wie z.B. sowas hier...

PHP:
login=$(php -f /bla/bla/blubb.php)

... bleibt das System hängen, sobald ich <form method="POST"... verwende. Kommentiere ich den php-Aufruf aus, dann läuft alles wie gewünscht. Es gibt also definitiv ein Problem mit dem System php-Dienst (/bin/php) und POST. Der Witz ist nur, das der php-Befehl innerhalb der .cgi durchaus funktioniert und mir auch Werte wie den SynoToken etc. zurückliefert, solange ich mit GET arbeite bzw. solange ich nicht auf den Formuar-Abschick-Button in Verbindung mit POST klicke.

Selbst wenn ich mit zwei Dateien arbeite...
- login.cgi (Abfrage und Auswertung der check_appprivilege.php)
- index.cgi (Abfrage und Auswertung, ob Benutzer angemeldet)
... so komm ich am Ende immer auf das selbe Ergebnis. Ich hab keine Ahnung, was ich anders mache als ihr, aber bei mir geht das definitv nicht und ich hab die letzten Tage so einiges ausprobiert, das könnt ihr mir glauben.

Ich habe es sogar mit der /webman/login.cgi probiert. Nach Auswerten und aufbereiten des Response: {"SynoToken": "123456789", "result": "success", "success": true}, welcher natürlich auch über ein php-Script läuft, komm ich auf's Gleiche raus.

Jetzt ist der Punkt gekommen, wo ich die Sache an den Nagel hängen werde und auch in Zukunft meine zu übermittelnden Daten mit GET durch den Äther schicken werde. Vielen Dank für eure Mühe und sorry, das ich euch mit meinen Problemen auf den Sack gegangen bin.

Tommes
 
Zuletzt bearbeitet:
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat