2
* Worldvisions Weaver Software:
3
* Copyright (C) 1997-2002 Net Integration Technologies, Inc.
5
* Re-write of wvpapsecrets.cc. This one supports CHAP as well, and is also
16
///////////////////////////////////////////////////////////
17
// WvPapChap public functions
18
///////////////////////////////////////////////////////////
20
void WvPapChap::put_secret( WvString username, WvString password,
22
/*******************************************/
28
load_file( PAP_SECRETS );
29
do_secret( username, password, remote );
30
if( write_file( PAP_SECRETS ) == false )
35
load_file( CHAP_SECRETS );
36
do_secret( username, password, remote );
37
if( write_file( CHAP_SECRETS ) == false )
42
///////////////////////////////////////////////////////////
43
// WvPapChap private functions
44
///////////////////////////////////////////////////////////
46
bool WvPapChap::load_file( char * filename )
47
/******************************************/
48
// Loads filename into the "contents" string list, one line per entry.
53
WvFile file( filename, O_RDONLY );
54
if( file.isok() == false )
57
from_file = file.getline( 0 );
59
tmp = new WvString( from_file );
60
contents.append( tmp, true );
61
from_file = file.getline( 0 );
68
bool WvPapChap::write_file( char * filename )
69
/*******************************************/
70
// Writes the "contents" list to the file, one entry per line.
72
WvFile file( filename, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR );
73
if( file.isok() == false )
76
WvStringList::Iter iter( contents );
77
for( iter.rewind(); iter.next(); )
78
file.print( "%s\n", *iter );
84
void WvPapChap::do_secret( const char * _username, const char * _password,
85
const char * _remote )
86
/***********************************************/
87
// Goes through the "contents" list, looking for lines that have the same
88
// username. If they do, and the remote value is either "*" or remote,
89
// the secret is removed. Otherwise, it is left in place. At the end of the
90
// list, the secret "username remote password" is added.
91
// remote defaults to "wvdial".
93
WvStringList::Iter iter( contents );
98
if( !_username || !_password )
101
// we need to backslash-escape all punctuation, so that pppd reads it
103
username = backslash_escape( _username );
104
password = backslash_escape( _password );
110
for( iter.rewind(); iter.next(); ) {
111
// Is this line a comment?
112
if( iter()[0] == '#' )
115
// Is the line blank?
116
const char * p = iter();
119
while( *p != '\0' && isspace( *p ) );
124
// p points at the first non-whitespace char.
128
while( *q != '\0' && !isspace( *q ) );
131
// illegal line, so get rid of it.
136
if( strncmp( username, p, q-p ) != 0 )
137
// different username, so let it stay.
143
while( *p != '\0' && isspace( *p ) );
144
// p now points to the beginning of the "remote" section.
145
if( strncmp( p, remote, strlen( remote ) ) == 0 || *p == '*' ) {
146
// conflicting secret, so get rid of it.
152
// This secret line should be fine.
155
contents.append( new WvString( "%s\t%s\t%s", username, remote, password ),