1 2 /* 3 * Author: Arvin Schnell <arvin (at) suse.de> 4 * 5 * This plugin let's you pass the password to the pppd via 6 * a file descriptor. That's easy and secure - no fiddling 7 * with pap- and chap-secrets files. 8 */ 9 10 #include <stdio.h> 11 #include <errno.h> 12 #include <string.h> 13 #include <unistd.h> 14 15 #include "pppd.h" 16 17 char pppd_version[] = VERSION; 18 19 static int passwdfd = -1; 20 static char save_passwd[MAXSECRETLEN]; 21 22 static option_t options[] = { 23 { "passwordfd", o_int, &passwdfd, 24 "Receive password on this file descriptor" }, 25 { NULL } 26 }; 27 28 static int pwfd_check (void) 29 { 30 return 1; 31 } 32 33 static int pwfd_passwd (char *user, char *passwd) 34 { 35 int readgood, red; 36 37 if (passwdfd == -1) 38 return -1; 39 40 if (passwd == NULL) 41 return 1; 42 43 if (passwdfd == -2) { 44 strcpy (passwd, save_passwd); 45 return 1; 46 } 47 48 readgood = 0; 49 do { 50 red = read (passwdfd, passwd + readgood, MAXSECRETLEN - 1 - readgood); 51 if (red == 0) 52 break; 53 if (red < 0) { 54 error ("Can't read secret from fd\n"); 55 readgood = -1; 56 break; 57 } 58 readgood += red; 59 } while (readgood < MAXSECRETLEN - 1); 60 61 close (passwdfd); 62 63 if (readgood < 0) 64 return 0; 65 66 passwd[readgood] = 0; 67 strcpy (save_passwd, passwd); 68 passwdfd = -2; 69 70 return 1; 71 } 72 73 void plugin_init (void) 74 { 75 add_options (options); 76 77 pap_check_hook = pwfd_check; 78 pap_passwd_hook = pwfd_passwd; 79 80 chap_check_hook = pwfd_check; 81 chap_passwd_hook = pwfd_passwd; 82 } 83