18ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 28ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 38ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Author: Arvin Schnell <arvin@suse.de> 48ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 58ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * This plugin let's you pass the password to the pppd via 68ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * a file descriptor. That's easy and secure - no fiddling 78ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * with pap- and chap-secrets files. 88ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 98ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <stdio.h> 118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <errno.h> 128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <string.h> 138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <unistd.h> 148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include "pppd.h" 168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectchar pppd_version[] = VERSION; 188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic int passwdfd = -1; 208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic char save_passwd[MAXSECRETLEN]; 218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic option_t options[] = { 238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { "passwordfd", o_int, &passwdfd, 248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "Receive password on this file descriptor" }, 258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { NULL } 268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}; 278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic int pwfd_check (void) 298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return 1; 318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic int pwfd_passwd (char *user, char *passwd) 348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int readgood, red; 368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (passwdfd == -1) 388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return -1; 398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (passwd == NULL) 418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return 1; 428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (passwdfd == -2) { 448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project strcpy (passwd, save_passwd); 458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return 1; 468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project readgood = 0; 498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project do { 508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project red = read (passwdfd, passwd + readgood, MAXSECRETLEN - 1 - readgood); 518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (red == 0) 528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (red < 0) { 548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project error ("Can't read secret from fd\n"); 558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project readgood = -1; 568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project readgood += red; 598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } while (readgood < MAXSECRETLEN - 1); 608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project close (passwdfd); 628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (readgood < 0) 648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return 0; 658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project passwd[readgood] = 0; 678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project strcpy (save_passwd, passwd); 688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project passwdfd = -2; 698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return 1; 718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid plugin_init (void) 748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project add_options (options); 768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project pap_check_hook = pwfd_check; 788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project pap_passwd_hook = pwfd_passwd; 798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project chap_check_hook = pwfd_check; 818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project chap_passwd_hook = pwfd_passwd; 828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 83