/*
> tentei v�rias solu��es mas na� consegui ainda. Estou precisando conseguir
> alterar tanto a senha do /etc/passwd como do /etc/samba/smbpasswd de forma
n�o
> interativa e n�o consegui �xito. Na verdade tenho um programa C que recebe
o
> login do usu�rio e sua senha, e preciso de um c�digo que permita realizar
> estas altera��es. Mesmo que a solu��o fosse chamar um segundo programa
> passando esses par�metros.
*/

Segue o c�digo fonte feito por um desenvolvedor da empresa que trabalho.
Claro que pode ser copiado e utilizado desde que obedecendo a GPL.

- Marcus Lima.

/*
* Author: Ariel Nigri
* Version: 1.0 stable
* By: Winco Tec. e Sis. Ltda.
* www.winco.com.br
* Please observe the General Public License (GPL) to use this code
* Thanks for all that makes Linux an exemple of freedom
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/file.h>
#include <pwd.h>
#include <grp.h>

extern "C" {
#include <security/pam_appl.h>
#include <security/pam_misc.h>
};

int respIndex = 0;

//--------------------------------------------------------------------------
-
pam_handle_t *pamh=NULL;
static int my_conv(int nmsg, const struct pam_message **msg,
                struct pam_response **resp, void *appdata_ptr)
{
    int i;
    const char **senhas = (const char **) appdata_ptr;

    *resp = (struct pam_response *) malloc(sizeof(struct pam_response) *
nmsg);
    memset(*resp, 0, sizeof(struct pam_response) * nmsg);
        for (i = 0; i < nmsg; i ++) {
        // printf("%s\n", (*msg)[i].msg);
        fflush(stdout);
            (*resp)[i].resp = strdup(senhas[respIndex]);
    }
    return PAM_SUCCESS;
}
//--------------------------------------------------------------------------
-
int main(int argc, char *argv[])
{
    if (argc != 4) {
    printf("uso: %s <usuario> <senha_antiga> <senha_nova>\n", argv[0]);
    return 1;
    }
    struct pam_conv conv = {
    my_conv,
    (void *) (argv + 2) // passamos a senha antiga e a nova.
    };

    if (pam_start("passwd", argv[1], &conv, &pamh) != PAM_SUCCESS) {
    printf("ERRO: Iniciando biblioteca PAM\n");
        return 1;
    }
    int retval = pam_authenticate(pamh, 0);
    if (retval != PAM_SUCCESS) {
    printf("ERRO: Logon invalido\n");
    } else {
    setuid(0);
    respIndex = 1;
        retval = pam_chauthtok(pamh, 0);    /* is user really user? */
        if (retval != PAM_SUCCESS) {
        printf("ERRO: Nova senha invalida\n");
    }
    }

    /* This is where we have been authorized or not. */
    if (retval == PAM_SUCCESS) {
        // umask(0117);
        // strcpy(user, luser);
        // Vamos mudar nosso uid e gid.
    printf("Senha alterada com sucesso\n");
    } else {
    printf("Houve algum erro. Tente novamente\n");
    }
    pam_end(pamh, PAM_SUCCESS);
    return retval;
}
//--------------------------------------------------------------------


Assinantes em 23/10/2002: 2229
Mensagens recebidas desde 07/01/1999: 187774
Historico e [des]cadastramento: http://linux-br.conectiva.com.br
Assuntos administrativos e problemas com a lista: 
            mailto:linux-br-owner@;bazar.conectiva.com.br

Responder a