~ubuntu-branches/ubuntu/quantal/wvdial/quantal

« back to all changes in this revision

Viewing changes to src/wvpapchap.cc

  • Committer: Bazaar Package Importer
  • Author(s): Martin Pitt
  • Date: 2004-10-06 11:05:06 UTC
  • mfrom: (0.1.1 upstream)
  • mto: This revision was merged to the branch mainline in revision 3.
  • Revision ID: james.westby@ubuntu.com-20041006110506-138x19fe4q0iu46e
Tags: 1.54.0-1ubuntu1
postinst: Disable command-line configuration to not disturb installation;
the script just exits early, so the postinst code is not completely lost
(Warty bug #2069)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*
2
 
 * Worldvisions Weaver Software:
3
 
 *   Copyright (C) 1997-2002 Net Integration Technologies, Inc.
4
 
 *
5
 
 * Re-write of wvpapsecrets.cc.  This one supports CHAP as well, and is also
6
 
 * much safer.
7
 
 */
8
 
 
9
 
#include "wvpapchap.h"
10
 
#include "wvfile.h"
11
 
#include <assert.h>
12
 
#include <ctype.h>
13
 
#include <sys/stat.h>
14
 
 
15
 
 
16
 
///////////////////////////////////////////////////////////
17
 
// WvPapChap public functions
18
 
///////////////////////////////////////////////////////////
19
 
 
20
 
void WvPapChap::put_secret( WvString username, WvString password,
21
 
                            WvString remote )
22
 
/*******************************************/
23
 
{
24
 
    assert( remote[0] );
25
 
 
26
 
    // PAP secrets:
27
 
    contents.zap();
28
 
    load_file( PAP_SECRETS );
29
 
    do_secret( username, password, remote );
30
 
    if( write_file( PAP_SECRETS ) == false )
31
 
        pap_success = false;
32
 
 
33
 
    // CHAP secrets:
34
 
    contents.zap();
35
 
    load_file( CHAP_SECRETS );
36
 
    do_secret( username, password, remote );
37
 
    if( write_file( CHAP_SECRETS ) == false )
38
 
        chap_success = false;
39
 
}
40
 
 
41
 
 
42
 
///////////////////////////////////////////////////////////
43
 
// WvPapChap private functions
44
 
///////////////////////////////////////////////////////////
45
 
 
46
 
bool WvPapChap::load_file( char * filename )
47
 
/******************************************/
48
 
// Loads filename into the "contents" string list, one line per entry.
49
 
{
50
 
    char *      from_file;
51
 
    WvString *  tmp;
52
 
 
53
 
    WvFile file( filename, O_RDONLY );
54
 
    if( file.isok() == false )
55
 
        return( false );
56
 
 
57
 
    from_file = file.getline( 0 );
58
 
    while( from_file ) {
59
 
        tmp = new WvString( from_file );
60
 
        tmp->unique();
61
 
        contents.append( tmp, true );
62
 
        from_file = file.getline( 0 );
63
 
    }
64
 
    file.close();
65
 
 
66
 
    return( true );
67
 
}
68
 
 
69
 
bool WvPapChap::write_file( char * filename )
70
 
/*******************************************/
71
 
// Writes the "contents" list to the file, one entry per line.
72
 
{
73
 
    WvFile file( filename, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR );
74
 
    if( file.isok() == false )
75
 
        return( false );
76
 
 
77
 
    WvStringList::Iter  iter( contents );
78
 
    for( iter.rewind(); iter.next(); )
79
 
        file.print( "%s\n", iter );
80
 
 
81
 
    file.close();
82
 
    return( true );
83
 
}
84
 
 
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".
93
 
{
94
 
    WvStringList::Iter  iter( contents );
95
 
    WvString username;
96
 
    WvString password;
97
 
    WvString remote;
98
 
 
99
 
    if( !_username || !_password )
100
 
        return;
101
 
    
102
 
    // we need to backslash-escape all punctuation, so that pppd reads it
103
 
    // correctly.
104
 
    username = backslash_escape( _username );
105
 
    password = backslash_escape( _password );
106
 
    remote   = _remote;
107
 
 
108
 
    if( !remote )
109
 
        remote = "*";
110
 
 
111
 
    for( iter.rewind(); iter.next(); ) {
112
 
        // Is this line a comment?
113
 
        if( iter()[0] == '#' )
114
 
            continue;
115
 
 
116
 
        // Is the line blank?
117
 
        const char * p = iter();
118
 
        do 
119
 
            p++;
120
 
        while( *p != '\0' && isspace( *p ) );
121
 
        p--;
122
 
        if( *p == '\0' )
123
 
            continue;
124
 
 
125
 
        // p points at the first non-whitespace char.
126
 
        const char * q = p;
127
 
        do
128
 
            q++;
129
 
        while( *q != '\0' && !isspace( *q ) );
130
 
        q--;
131
 
        if( *q == '\0' ) {
132
 
            // illegal line, so get rid of it.
133
 
            iter.unlink();
134
 
            iter.rewind();
135
 
            continue;
136
 
        }
137
 
        if( strncmp( username, p, q-p ) != 0 )
138
 
            // different username, so let it stay.
139
 
            continue;
140
 
 
141
 
        p=q;
142
 
        do
143
 
            p++;
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.
148
 
            iter.unlink();
149
 
            iter.rewind();
150
 
            continue;
151
 
        }
152
 
 
153
 
        // This secret line should be fine.
154
 
    }
155
 
 
156
 
    contents.append( new WvString( "%s\t%s\t%s", username, remote, password ), 
157
 
                     true );
158
 
}