Операционные системы - статьи


Делаем собственное PAM-приложение - часть 3


#define DEFAULT_ADDR "0.0.0.0"

main(int argc, char *argv[])

//единственная и главная функция.

{ int s; int pid; int i,j; struct sockaddr_in serv_addr; struct hostent *hp; char username[80],hostname[80]=DEFAULT_ADDR; char *tmp=malloc(80);

if (argc<2){ printf("Usage: passwdc username host\n"); exit(1); }

//Работать будем или с локальной машиной или с удаленной (а почему бы и нет, если силы позволяют, только аутентификация //должна быть очень продуманной)

strncpy(username,argv[1],80); printf("Changing password for user:%s \n",username);

if (argc>2) { strncpy(hostname,argv[2],80); }

printf("on host:%s\n",hostname);

if((hp=gethostbyname(hostname))==0) { perror("gethostbyname()"); exit(3); }

bzero(&serv_addr, sizeof(serv_addr)); bcopy(hp->h_addr,&serv_addr.sin_addr,hp->h_length);

serv_addr.sin_family=hp->h_addrtype; serv_addr.sin_port=htons(PORTNUM);

if((s=socket(AF_INET, SOCK_STREAM, 0))==-1){ perror("socket()"); exit(1); }

if (connect(s, (struct sockaddr_in *) &serv_addr, sizeof(serv_addr))==-1){ perror("connect()"); }

//где-то тут после успешного соединения клиент должен убедить сервер, что он //действительно тот за кого себя выдает и что работает именно от имени того пользователя чей пароль так хочется изменить.

//посылаем имя пользователя

send(s, username, sizeof(username),0);

//считываем с локальной консоли и отсылаем пароль пользователя //Тонкий момент: или соединение должно быть шифорванным или пароль посылается уже после применения к нему хеш-функции.

tmp=getpass("New UNIX password:"); strncpy(username,tmp); send(s, username, sizeof(username),0);

//После этого работает уже сервер. Нас интересуют только результаты //Возможно более сложный обмен сообщениями по определенному протоколу. Например если пароль оказался слишком прост, то надо //Ввести новый.

if (recv(s, username, sizeof(username), 0)<0){ perror("recv()"); }

printf("Result:%s\n",username); close(s);




Начало  Назад  Вперед



Книжный магазин