You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
83 lines
1.4 KiB
83 lines
1.4 KiB
|
|
/*
|
|
* Author: Arvin Schnell <arvin@suse.de>
|
|
*
|
|
* This plugin let's you pass the password to the pppd via
|
|
* a file descriptor. That's easy and secure - no fiddling
|
|
* with pap- and chap-secrets files.
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <errno.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
|
|
#include "pppd.h"
|
|
|
|
char pppd_version[] = VERSION;
|
|
|
|
static int passwdfd = -1;
|
|
static char save_passwd[MAXSECRETLEN];
|
|
|
|
static option_t options[] = {
|
|
{ "passwordfd", o_int, &passwdfd,
|
|
"Receive password on this file descriptor" },
|
|
{ NULL }
|
|
};
|
|
|
|
static int pwfd_check (void)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
static int pwfd_passwd (char *user, char *passwd)
|
|
{
|
|
int readgood, red;
|
|
|
|
if (passwdfd == -1)
|
|
return -1;
|
|
|
|
if (passwd == NULL)
|
|
return 1;
|
|
|
|
if (passwdfd == -2) {
|
|
strcpy (passwd, save_passwd);
|
|
return 1;
|
|
}
|
|
|
|
readgood = 0;
|
|
do {
|
|
red = read (passwdfd, passwd + readgood, MAXSECRETLEN - 1 - readgood);
|
|
if (red == 0)
|
|
break;
|
|
if (red < 0) {
|
|
error ("Can't read secret from fd\n");
|
|
readgood = -1;
|
|
break;
|
|
}
|
|
readgood += red;
|
|
} while (readgood < MAXSECRETLEN - 1);
|
|
|
|
close (passwdfd);
|
|
|
|
if (readgood < 0)
|
|
return 0;
|
|
|
|
passwd[readgood] = 0;
|
|
strcpy (save_passwd, passwd);
|
|
passwdfd = -2;
|
|
|
|
return 1;
|
|
}
|
|
|
|
void plugin_init (void)
|
|
{
|
|
add_options (options);
|
|
|
|
pap_check_hook = pwfd_check;
|
|
pap_passwd_hook = pwfd_passwd;
|
|
|
|
chap_check_hook = pwfd_check;
|
|
chap_passwd_hook = pwfd_passwd;
|
|
}
|