smadon Posté(e) le 20 juin 2013 Posté(e) le 20 juin 2013 Hello, Question Programation sur le Syno J'ai crée un paquet base sur couchpotatoes assz simple pour faire du rsync, mais par defaut le fichier index.cgi gere l'authentification sur le compte Admin, or je voudrais juste verifier que le user fasse partie du group Administrator, mais je ne sais pas comment verifier cela. :-( Donc ma question est comment changer le code pour faire une authentication sur le group et non pas sur le user ?? code : index.cgi #!/usr/bin/perl use File::Copy; print "Content-type: text/htmlnn"; # Are we authenticated yet ? if (open (IN,"/usr/syno/synoman/webman/modules/authenticate.cgi|")) { $user=<IN>; chop($user); close(IN); } # if not admin or no user at all...no authentication...so, bye-bye if ($user ne 'admin') { print "<HTML><HEAD><TITLE>Login Required</TITLE></HEAD><BODY>Please login as admin first, before using this webpage</BODY></HTML>n"; die; } D'avance merci pour votre aide. Smadon 0 Citer
bud77 Posté(e) le 20 juin 2013 Posté(e) le 20 juin 2013 Faut modifier le script pour récupérer le GID du user (via la fichier /etc/passwd), et pas son ID, et adapter le IF en conséquence 0 Citer
CoolRaoul Posté(e) le 21 juin 2013 Posté(e) le 21 juin 2013 (modifié) Pour compléter la réponse de Bud, Ajouter ces deux fonctions dans le script: sub usergroups { my $user = shift; my @groups = scalar getgrgid((getpwnam $user)[3]); # init group list to user main group while (my ($name, $users) = (getgrent)[0, -1]) { $users =~ /b$userb/ and push @groups, $name } return @groups; } sub havegroup { my $user=shift; my $whichgroup=shift; foreach my $groupname (usergroups($user)) { return 1 if $whichgroup eq $groupname; } return undef; } et ensuite remplacer $user ne 'admin' par havegroup($user, 'administrators') Modifié le 21 juin 2013 par CoolRaoul 0 Citer
smadon Posté(e) le 21 juin 2013 Auteur Posté(e) le 21 juin 2013 Super, Merci pour les réponses, je test ca ce soir. :-) 0 Citer
smadon Posté(e) le 22 juin 2013 Auteur Posté(e) le 22 juin 2013 Hello, Je viens de tester, et ca marche. :-) Par contre, j'ai utilisé la function unless pur avoir la bonne condition avec havegroup, c'est correct ?? voila resultat : # Are we authenticated yet ? if (open (IN,"/usr/syno/synoman/webman/modules/authenticate.cgi|")) { $user=<IN>; chop($user); close(IN); } # test if member of the group sub havegroup { my $user=shift; my $whichgroup=shift; foreach my $groupname (usergroups($user)) { return 1 if $whichgroup eq $groupname; } return undef; } # Find the group sub usergroups { my $user = shift; my @groups = scalar getgrgid((getpwnam $user)[3]); # init group list to user main group while (my ($name, $users) = (getgrent)[0, -1]) { $users =~ /b$userb/ and push @groups, $name } return @groups; } # if not in administrator groups ...no authentication...so, bye-bye unless (havegroup($user, 'administrators')) { print "<HTML><HEAD><TITLE>Access forbidden</TITLE></HEAD><BODY>You need to be part of the administrators group to view this webpage.</BODY></HTML>n"; die; } C'est correct ? 0 Citer
CoolRaoul Posté(e) le 22 juin 2013 Posté(e) le 22 juin 2013 Je viens de tester, et ca marche. :-) Par contre, j'ai utilisé la function unless pur avoir la bonne condition avec havegroup, c'est correct ?? C'est correct ? Oui c'est bien ça, j'avais mal explicité cette partie en effet. 0 Citer
nexius2 Posté(e) le 21 novembre 2014 Posté(e) le 21 novembre 2014 (modifié) hello, je galere sur le sujet.... pour mon applis, je cherche a recuperer le nom du user et savoir s'il est admin ou non, sinon, l'applis marche pas.... apres avoir essayer plein de méthodes et de bout de script, j'en viens a demander de l'aide..... avec le code ci dessus, ca marche..... pour tout le monde..... juste avant, je testais ceci : if (open (IN,"/usr/syno/synoman/webman/login.cgi|")) { while(<IN>) { if (/SynoToken/) { ($token)=/SynoToken" *: *"([^"]+)"/; } } close(IN); } $TMPENV=$ENV{QUERY_STRING}; $ENV{QUERY_STRING}="SynoToken=$token"; if (open (IN,"/usr/syno/synoman/webman/modules/authenticate.cgi|")) { $user=<IN>; chop($user); close(IN); } $ENV{QUERY_STRING}=$TMPENV; # if not admin or no user at all...no authentication...so, bye-bye if ($user ne 'admin') { print "<HTML><HEAD><TITLE>Login Required</TITLE></HEAD><BODY>Please login as admin first, before using this webpage</BODY></HTML>n"; die; } mais le resultat etait que l'identification marchait, mais plus mon applis.... HELP ! Modifié le 21 novembre 2014 par nexius2 0 Citer
starIst Posté(e) le 1 juin 2016 Posté(e) le 1 juin 2016 (modifié) Je suis en train de modifier le package nClone pour faire fonctionner sur le DSM6, j'ai réussi mais je souhaiterais le modifier, notamment sur l'authentification, en effet pour le moment on ne peut pas lancer l'icone nClone si on est pas avec le compte admin hors je voudrais que cela soit n'importe qui du groupe Admin (ou un autre groupe), donc je souhaite modifier le script nclone.cgi qui est le suivant : #!/usr/bin/php -nqd safe_mode_exec_dir="/usr/syno/synoman/webman/modules" <?php /** * nClone (free edition) GUI * * Copyright (C) Maxnet 2012 * All rights reserved */ /* Ugly workarounds when running under php-cli */ if (PHP_SAPI == 'cli') { /* Parse CGI variables */ parse_str($_SERVER['QUERY_STRING'], $_GET); if ($_SERVER['REQUEST_METHOD'] == 'POST' && !empty($_SERVER['CONTENT_LENGTH'])) { parse_str(fread(STDIN, $_SERVER['CONTENT_LENGTH']), $_POST); } else { $_POST = array(); } ini_set('date.timezone', 'Europe/Amsterdam'); echo "Content-Type: text/html\n\n"; } /* Authentication */ if (isset($_POST['token'])) { $token = $_POST['token']; putenv("REQUEST_URI=/nclone.cgi?SynoToken=$token"); } else if (isset($_GET['SynoToken'])) { $token = $_GET['SynoToken']; } else { ?> <html><head> <script type="text/javascript" src="/scripts/ext-3/adapter/ext/ext-base.js"></script> <script type="text/javascript" src="/scripts/ext-3/ext-all.js"></script> <script type="text/javascript" src="/webman/dsmtoken.cgi"></script> <script type="text/javascript"> location.href = location.href+"?SynoToken="+SYNO.SDS.Session.SynoToken; </script> </head></html> <?php exit(0); } $synology_username = exec("/usr/syno/synoman/webman/modules/authenticate.cgi"); if ($synology_username != 'admin') { die("Not authorized. Only user 'admin' is allowed access"); } Comment faire pour tester le groupe et non le user, j'ai essayé le code plus haut mais cela ne semble pas fonctionner... Modifié le 1 juin 2016 par starIst 0 Citer
411ebay Posté(e) le 29 avril 2018 Posté(e) le 29 avril 2018 Bonjour StarLst Le seul moyen que j'ai trouvé et de mettre en commentaire la partie ci-dessous. /* # Are we authenticated yet ? $synology_username = exec("/usr/syno/synoman/webman/modules/authenticate.cgi"); if ($synology_username != 'admin') { die("Not authorized. Only user 'admin' is allowed access"); } */ Malgré mes recherches je n'ai trouvé à remplacer par le group admin 0 Citer
Messages recommandés
Rejoindre la conversation
Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.