Aller au contenu

Authentification Pour Le Group Et Pas Sur Le User

Featured Replies

Posté(e)

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

Posté(e)

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

Posté(e)

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é par CoolRaoul

Posté(e)
  • Auteur

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 ?

Posté(e)

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.

  • 1 an après...
Posté(e)

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é par nexius2

  • 1 an après...
Posté(e)

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é par starIst

  • 1 an après...
Posté(e)

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

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.

Invité
Répondre à ce sujet…

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.