~ubuntu-branches/ubuntu/lucid/ebox-openvpn/lucid

« back to all changes in this revision

Viewing changes to src/EBox/CGI/EditClient.pm

  • Committer: Bazaar Package Importer
  • Author(s): Chuck Short
  • Date: 2008-02-27 13:31:29 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20080227133129-6mpzfq43hghuxtaz
Tags: 0.11.99-0ubuntu1
New upstream version.

Show diffs side-by-side

added added

removed removed

Lines of Context:
12
12
use File::Basename;
13
13
use File::Slurp qw(read_file write_file);
14
14
 
15
 
my @clientPropierties = qw(proto caCertificatePath certificatePath certificateKey  service);
 
15
my @clientPropierties = qw(proto  service ripPasswd);
 
16
my @clientCertificates = qw( caCertificate certificate certificateKey);
16
17
my @serverPropierties  = qw(serverAddr serverPort); # this special treatment is due because the module is ready to use more than one server but no the CGIs.
17
18
 
18
19
sub new # (error=?, msg=?, cgi=?)
31
32
{
32
33
    my ($self) = @_;
33
34
    if ($self->param('edit')) {
34
 
        return ['name', 'edit'];
 
35
      return [qw(name edit)];
35
36
    }
36
37
    else {
37
38
        return ['name'];
49
50
    @optional = qw(name network netmask submit);
50
51
 
51
52
    if ($self->param('edit')) {
52
 
        push @optional, (@clientPropierties, @serverPropierties);
 
53
        push @optional, (@clientPropierties, @serverPropierties, @clientCertificates);
53
54
    }
54
55
 
55
56
    return \@optional;
94
95
{
95
96
  my ($self) = @_;
96
97
 
 
98
  my $name = $self->param('name');
 
99
  my $openVPN = EBox::Global->modInstance('openvpn');
 
100
  my $client = $openVPN->client($name);
 
101
 
 
102
  if ($client->internal) {
 
103
    $self->setErrorchain('OpenVPN/Index');
 
104
    throw EBox::Exceptions::Internal("The client $name doesn't allow UI modification");
 
105
  }
 
106
 
 
107
 
97
108
  if ($self->param('edit')) {
98
 
    $self->_doEdit();
 
109
    $self->_doEdit($name, $client);
99
110
  }
100
111
 
101
112
}
105
116
 
106
117
sub _doEdit
107
118
{
108
 
    my ($self) = @_;
109
 
 
110
 
    my $name = $self->param('name');
111
 
    my $openVPN = EBox::Global->modInstance('openvpn');
112
 
    my $client = $openVPN->client($name);
113
 
    my $changed = 0;
114
 
 
115
 
    my $anyPropiertyParam = any @clientPropierties;
116
 
 
117
 
    my @mutatorsParams = grep { $_ eq $anyPropiertyParam } @{ $self->params() };
118
 
    my $anyParamWithUpload = any(qw(caCertificatePath certificatePath certificateKey));  
119
 
 
120
 
    foreach my $attr (@mutatorsParams) {
121
 
        my $value =  $self->param($attr);
122
 
        next if $value eq '';
123
 
 
124
 
        if ($attr eq $anyParamWithUpload) {
125
 
          $value = $self->upload($attr); # value must be the file path, not the
126
 
                                         # parameter value 
127
 
        }  
128
 
 
129
 
 
130
 
        if ($client->$attr() ne $attr) {
131
 
            my $mutatorName = "set\u$attr";
132
 
            my $mutator_r   = $client->can($mutatorName);
133
 
            defined $mutator_r or throw EBox::Exceptions::Internal "$mutatorName not found in client object";
134
 
 
135
 
            $mutator_r->($client, $value);
136
 
            $changed = 1;
137
 
        }
138
 
    }
139
 
 
140
 
    if ($self->param('serverAddr') ||  $self->param('serverPort')) {
141
 
      my ($newServerAddr, $newServerPort) = ($self->param('serverAddr'), $self->param('serverPort'));
142
 
      my ($oldServerAddr, $oldServerPort) = $self->_getServerPropierties($client);
143
 
 
144
 
      my $serverAddr  = defined $newServerAddr ? $newServerAddr : $oldServerAddr;
145
 
      my $serverPort  = defined $newServerPort ? $newServerPort : $oldServerPort;
146
 
 
147
 
      my @newServers = ([$serverAddr, $serverPort],);
148
 
      $client->setServers(\@newServers);
149
 
    }
150
 
 
151
 
    
152
 
    if ($changed) {
153
 
        $self->setMsg(__x("Client {name} configuration updated", name => $name) );
154
 
        $self->{chain} = 'OpenVPN/Index';
155
 
    }
156
 
    else {
157
 
        $self->setMsg( __('There are no changes to be saved'));
158
 
    }
 
119
  my ($self, $name, $client) = @_;
 
120
 
 
121
  $self->_editClientCertificates($client);
 
122
  $self->_editClientProperties($client);
 
123
  $self->_editServerProperties($client);
 
124
 
 
125
  if ($self->_changed) {
 
126
    $self->setMsg(__x("Client {name} configuration updated", name => $name) );
 
127
    $self->{chain} = 'OpenVPN/Index';
 
128
  } 
 
129
  else {
 
130
    $self->setMsg( __('There are no changes to be saved'));
 
131
  }
 
132
}
 
133
 
 
134
 
 
135
 
 
136
sub _editClientProperties
 
137
{
 
138
  my ($self, $client) = @_;
 
139
 
 
140
  my $anyPropiertyParam = any @clientPropierties;
 
141
 
 
142
  my @mutatorsParams = grep { $_ eq $anyPropiertyParam } @{ $self->params() };
 
143
  my $anyParamWithUpload = any(@clientCertificates);  
 
144
 
 
145
  foreach my $attr (@mutatorsParams) {
 
146
    my $value =  $self->param($attr);
 
147
    next if $value eq '';
 
148
 
 
149
    if ($client->$attr() ne $attr) {
 
150
      my $mutatorName = "set\u$attr";
 
151
      my $mutator_r   = $client->can($mutatorName);
 
152
      defined $mutator_r or throw EBox::Exceptions::Internal "$mutatorName not found in client object";
 
153
 
 
154
      $mutator_r->($client, $value);
 
155
      $self->_setAsChanged();
 
156
    }
 
157
  }
 
158
 
 
159
}
 
160
 
 
161
sub _editClientCertificates
 
162
{
 
163
  my ($self, $client) = @_;
 
164
 
 
165
  # check if all certificate params have value
 
166
  my $certParamCount = grep { 
 
167
    $self->param($_)  
 
168
  } @clientCertificates;
 
169
 
 
170
  if ($certParamCount == 0) {
 
171
    # no changes in clients certificates
 
172
    return;
 
173
  }
 
174
  elsif ($certParamCount < @clientCertificates) {
 
175
    throw EBox::Exceptions::External(
 
176
       __('Certificate files cannot be changed in isolation. You must change all files at the same time')
 
177
                                    );
 
178
  }
 
179
 
 
180
 
 
181
 
 
182
  my $caCert = $self->upload('caCertificate');
 
183
  my $cert   = $self->upload('certificate');
 
184
  my $key    = $self->upload('certificateKey');
 
185
 
 
186
  $client->setCertificateFiles($caCert, $cert, $key);
 
187
 
 
188
  $self->_setAsChanged();
 
189
}
 
190
 
 
191
sub _editServerProperties
 
192
{
 
193
  my ($self, $client) = @_;
 
194
 
 
195
  if ($self->param('serverAddr') ||  $self->param('serverPort')) {
 
196
    my ($newServerAddr, $newServerPort) = ($self->param('serverAddr'), $self->param('serverPort'));
 
197
    my ($oldServerAddr, $oldServerPort) = $self->_getServerPropierties($client);
 
198
    
 
199
    my $serverAddr  = defined $newServerAddr ? $newServerAddr : $oldServerAddr;
 
200
    my $serverPort  = defined $newServerPort ? $newServerPort : $oldServerPort;
 
201
    
 
202
    my @newServers = ([$serverAddr, $serverPort],);
 
203
    $client->setServers(\@newServers);
 
204
    
 
205
    $self->_setAsChanged();
 
206
  }
 
207
}
 
208
 
 
209
 
 
210
sub _setAsChanged
 
211
{
 
212
  my ($self) = @_;
 
213
  $self->{changed} = 1;
 
214
}
 
215
 
 
216
sub _changed
 
217
{
 
218
  return 1;
159
219
}
160
220
 
161
221