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 );
61
contents.append( tmp, true );
62
from_file = file.getline( 0 );
69
bool WvPapChap::write_file( char * filename )
70
/*******************************************/
71
// Writes the "contents" list to the file, one entry per line.
73
WvFile file( filename, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR );
74
if( file.isok() == false )
77
WvStringList::Iter iter( contents );
78
for( iter.rewind(); iter.next(); )
79
file.print( "%s\n", iter );
85
void WvPapChap::do_secret( const char * _username, const char * _password,
86
const char * _remote )
87
/***********************************************/
88
// Goes through the "contents" list, looking for lines that have the same
89
// username. If they do, and the remote value is either "*" or remote,
90
// the secret is removed. Otherwise, it is left in place. At the end of the
91
// list, the secret "username remote password" is added.
92
// remote defaults to "wvdial".
94
WvStringList::Iter iter( contents );
99
if( !_username || !_password )
102
// we need to backslash-escape all punctuation, so that pppd reads it
104
username = backslash_escape( _username );
105
password = backslash_escape( _password );
111
for( iter.rewind(); iter.next(); ) {
112
// Is this line a comment?
113
if( iter()[0] == '#' )
116
// Is the line blank?
117
const char * p = iter();
120
while( *p != '\0' && isspace( *p ) );
125
// p points at the first non-whitespace char.
129
while( *q != '\0' && !isspace( *q ) );
132
// illegal line, so get rid of it.
137
if( strncmp( username, p, q-p ) != 0 )
138
// different username, so let it stay.
144
while( *p != '\0' && isspace( *p ) );
145
// p now points to the beginning of the "remote" section.
146
if( strncmp( p, remote, strlen( remote ) ) == 0 || *p == '*' ) {
147
// conflicting secret, so get rid of it.
153
// This secret line should be fine.
156
contents.append( new WvString( "%s\t%s\t%s", username, remote, password ),