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