Newsgroup: it.comp.os.linux.development
Titolo: Autenticazione tramite il sistema

Salve a tutti,
devo scrivere un'applicazione in cui è richiesta l'autenticazione tramite
login e password. Io voglio che la login e la password siano quelle di un
utente valido nel sistema operativo (linux ovviamente). Quello che voglio
fare io è chiedere al sistema operativo l'autenticazione e farmi
restituire si/no.
Il problema è che ora il sistema operativo autentica tramite il file
/etc/passwd ma poi userà altri sistemi i(i famosi PAM).
Mi potete indirizzare verso un tutorial o delle risorse in cui sia
spiegato come demandare l'autenticazione al sistema, verificando
possibilmente anche l'appartenenza ad un gruppo?
Su giigle non ho saputo cosa cercare...
Grazie
Mit
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 restituire si/no.
Al sistema operativo sarà un po' dura.. non so se c'è qualcosa di
pronto, ma intanto puoi scrivere qualcosa tu, in una combinazione di
getpwuid(), getspnam() e crypt().
Controlla le manpages delle suddette funzioni. Ciao
M`

lo fai con le pam , 
crei un file in /etc/pam.d che si chiama per esempio mylogin contenente:
#%PAM-1.0
auth       required     /lib/security/pam_stack.so service=system-auth
account    required     /lib/security/pam_stack.so service=system-auth
password   required     /lib/security/pam_stack.so service=system-auth
session    required     /lib/security/pam_stack.so service=system-auth
poi usi un codice simile a questo:
-------------------------------------------------------------------------------------
#include <security/pam_appl.h>
#include <security/pam_misc.h>
#include <stdio.h>
//#define VERBOSE
#define pam_my_auth "mylogin"
static char *PAM_password;
static int PAM_error = 0;
static int PAM_conv (int num_msg,const struct pam_message **msg,struct
pam_response **resp,void *appdata_ptr);
int user_login( char *user , char *pass );
static int PAM_conv (int num_msg,const struct pam_message **msg,struct
pam_response **resp,void *appdata_ptr) {
        int replies = 0;
        struct pam_response *reply = NULL;
        #define COPY_STRING(s) (s) ? strdup(s) : NULL
        reply = malloc(sizeof(struct pam_response) * num_msg);
        if (!reply) return PAM_CONV_ERR;
        for (replies = 0; replies < num_msg; replies++) {
                switch (msg[replies]->msg_style) {
                        case PAM_PROMPT_ECHO_OFF:
                                reply[replies].resp_retcode = PAM_SUCCESS;
                                reply[replies].resp = COPY_STRING(PAM_password);
                                /* PAM frees resp */
                        break;
                        case PAM_TEXT_INFO:
                                /* fall through */
                        case PAM_ERROR_MSG:
                                /* ignore it, but pam still wants a NULL response... */
                                reply[replies].resp_retcode = PAM_SUCCESS;
                                reply[replies].resp = NULL;
                        break;
                        case PAM_PROMPT_ECHO_ON:
                                /* fall through */
                        default:
                                /* Must be an error of some sort... */
                                free (reply);
                                PAM_error = 1;
                                return PAM_CONV_ERR;
                        }
                }
        *resp = reply;
        return PAM_SUCCESS;
}
static struct pam_conv conv = {
        PAM_conv,
        NULL
        };
int user_login( char *user , char *pass ) {
        pam_handle_t *pamh=NULL;
        int retval;
 
        PAM_password = ( void *) malloc ( 1024 );
        strcpy ( PAM_password , pass ); /* password */
#ifdef VERBOSE
        printf ("1)\n");
#endif
        retval = pam_start( pam_my_auth , user, &conv, &pamh);
        if (retval == PAM_SUCCESS) {
#ifdef VERBOSE
                printf ("2)\n");
#endif
                retval = pam_authenticate(pamh, 0);
        } else {
#ifdef VERBOSE
                printf ("2 -- %s --\n", pam_strerror( pamh, retval) );
#endif
        }
        if (retval == PAM_SUCCESS) {
#ifdef VERBOSE
                printf ("3)\n");
#endif
                retval = pam_acct_mgmt(pamh, 0); 
        } else {
#ifdef VERBOSE
                printf ("3 -- %s --\n", pam_strerror( pamh, retval) );
#endif
        }
 
        if (retval == PAM_SUCCESS) {
#ifdef VERBOSE
                fprintf(stdout, "Authenticated\n");
#endif
        } else {
#ifdef VERBOSE
                printf ("4 -- %d -- %s --\n", retval ,pam_strerror( pamh, retval) );
#endif
        }
        if (pam_end(pamh,retval) != PAM_SUCCESS) {     /* close Linux-PAM */
                pamh = NULL;
#ifdef VERBOSE
                fprintf(stderr, "check_user: failed to release auth\n");
#endif
                exit(1);
        }
        free (PAM_password);
        return ( retval == PAM_SUCCESS ? 0:1 );       /* indicate success */
}
-------------------------------------------------------------------------------------
attenzione che il binario che fa' autenticazione deve essere suid root.
ciao.
-- 
Cosa causa la misteriosa morte di ognuno?