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