| |
| /* |
| * 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; |
| } |