2 * Worldvisions Weaver Software:
3 * Copyright (C) 1997-2003 Net Integration Technologies, Inc.
5 * Re-write of wvpapsecrets.cc. This one supports CHAP as well, and is also
17 ///////////////////////////////////////////////////////////
18 // WvPapChap public functions
19 ///////////////////////////////////////////////////////////
21 void WvPapChap::put_secret( WvString username
, WvString password
,
23 /*******************************************/
29 load_file( PAP_SECRETS
);
30 do_secret( username
, password
, remote
);
31 if( write_file( PAP_SECRETS
) == false )
36 load_file( CHAP_SECRETS
);
37 do_secret( username
, password
, remote
);
38 if( write_file( CHAP_SECRETS
) == false )
43 ///////////////////////////////////////////////////////////
44 // WvPapChap private functions
45 ///////////////////////////////////////////////////////////
47 bool WvPapChap::load_file( char * filename
)
48 /******************************************/
49 // Loads filename into the "contents" string list, one line per entry.
54 WvFile
file( filename
, O_RDONLY
);
55 if( file
.isok() == false )
58 from_file
= file
.getline();
60 tmp
= new WvString( from_file
);
61 contents
.append( tmp
, true );
62 from_file
= file
.getline();
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
),