[LUGOS-PROG] Authentikacija uporabnikov
Rok Papež
rok.papez at lugos.si
Sun Feb 23 10:13:20 CET 2003
Zivjo!
Dne sobota 22. februar 2003 18:03 je Janez Grad napisal(a):
> V svojem programu (C) bi rad naredil enostavno prijavljanje uporabnikov.
> Pri tem bi uporabljal kar sistemska uporabnika imena in gesla.
>
> Zanima me ali obstaja kaksna enostavna funkcija, kateri bi ob klicu
> kot parametra podal uporabniko ime ter geslo, funkcija pa bi vrnila
> TRUE, ce kombinacija user/pwd na sistemu obstaja oz FALSE, ce
> kombinacija ne obstaja.
:-). Ne. Zal to ne obstaja.
Imash lahko sledece 3 scenarije:
- samo /etc/passwd datoteko
- /etc/passwd z /etc/shadows
- PAM (ki podpira she vse kaj drugega)
Dandanes imajo vsi UNIX sistemi podporo za PAM, torej si to oglej :-).
Kos kode za PAM avtentikacijo:
//------------------------------------------------------------------------------------------------------------
int users_pam_auth_cb( int num_msg,
const struct pam_message **msg,
struct pam_response **resp,
void *appdata_ptr
)
{
struct pam_response *data;
int i;
data = safe_calloc(sizeof(*data), num_msg);
if(!data)
return PAM_CONV_ERR; //error code.
for(i=0; i<num_msg; i++) {
switch(msg[i]->msg_style) {
case PAM_PROMPT_ECHO_ON: // username
data[i].resp = strdup(g.user);
data[i].resp_retcode = PAM_SUCCESS;
break;
case PAM_PROMPT_ECHO_OFF: // password
data[i].resp = strdup(appdata_ptr);
data[i].resp_retcode = PAM_SUCCESS;
break;
default:
data[i].resp = NULL;
data[i].resp_retcode = PAM_SUCCESS;
break;
}
}
*resp = data;
return PAM_SUCCESS;
}
//------------------------------------------------------------------------------------------------------------
int users_pam_auth(const char *pass) {
struct pam_conv pamcnv;
pam_handle_t *pamh = NULL;
int rc;
pamcnv.conv = users_pam_auth_cb;
pamcnv.appdata_ptr = (void *)pass;
err_suspend(); // suspend our error logging since PAM may walk all over us.
rc = pam_start("pulsar", g.user, &pamcnv, &pamh);
if(rc != PAM_SUCCESS) {
err_resume();
err_error(EX_OSERR,"pam_start failed: \"%s\"",pam_strerror(pamh,rc));
rc = defAuth;
goto error;
}
rc = pam_authenticate(pamh, PAM_SILENT | PAM_DISALLOW_NULL_AUTHTOK);
if(rc != PAM_SUCCESS) {
err_resume();
err_error(EX_OSERR,
"PAM authentication for user \"%s\" FAILED; Reason: \"%s\"",
g.user,
pam_strerror(pamh,rc)
);
rc = defAuth;
goto error;
}
err_resume();
err_debug(5,"PAM authentication for user \"%s\" OK.", g.user);
pam_end(pamh,PAM_SUCCESS);
Ce te zanimajo se ostali nacini avtentikacije si oglej:
http://pulsar.sourceforge.net in sicer datoteke v imeniku /pulsar/src/users
--
best regards,
Rok Papež.
More information about the lugos-prog
mailing list