[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 uporabniška imena in gesla.
>
> Zanima me ali obstaja kaksna enostavna funkcija, kateri bi ob klicu
> kot parametra podal uporabniško 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