Fix 'can't change uid' error when the account *has* a uid but svc_acct-edit_uid isn...
[freeside.git] / httemplate / edit / svc_acct.cgi
1 <%
2
3 my $conf = new FS::Conf;
4 my @shells = $conf->config('shells');
5
6 my($svcnum, $pkgnum, $svcpart, $part_svc, $svc_acct, @groups);
7 if ( $cgi->param('error') ) {
8
9   $svc_acct = new FS::svc_acct ( {
10     map { $_, scalar($cgi->param($_)) } fields('svc_acct')
11   } );
12   $svcnum = $svc_acct->svcnum;
13   $pkgnum = $cgi->param('pkgnum');
14   $svcpart = $cgi->param('svcpart');
15   $part_svc = qsearchs( 'part_svc', { 'svcpart' => $svcpart } );
16   die "No part_svc entry for svcpart $svcpart!" unless $part_svc;
17   @groups = $cgi->param('radius_usergroup');
18
19 } else {
20
21   my($query) = $cgi->keywords;
22   if ( $query =~ /^(\d+)$/ ) { #editing
23     $svcnum=$1;
24     $svc_acct=qsearchs('svc_acct',{'svcnum'=>$svcnum})
25       or die "Unknown (svc_acct) svcnum!";
26
27     my($cust_svc)=qsearchs('cust_svc',{'svcnum'=>$svcnum})
28       or die "Unknown (cust_svc) svcnum!";
29
30     $pkgnum=$cust_svc->pkgnum;
31     $svcpart=$cust_svc->svcpart;
32
33     $part_svc = qsearchs( 'part_svc', { 'svcpart' => $svcpart } );
34     die "No part_svc entry for svcpart $svcpart!" unless $part_svc;
35
36     @groups = $svc_acct->radius_groups;
37
38   } else { #adding
39
40     foreach $_ (split(/-/,$query)) {
41       $pkgnum=$1 if /^pkgnum(\d+)$/;
42       $svcpart=$1 if /^svcpart(\d+)$/;
43     }
44     $part_svc = qsearchs( 'part_svc', { 'svcpart' => $svcpart } );
45     die "No part_svc entry for svcpart $svcpart!" unless $part_svc;
46
47     $svc_acct = new FS::svc_acct({svcpart => $svcpart}); 
48
49     $svcnum='';
50
51   }
52 }
53
54 my( $cust_pkg, $cust_main ) = ( '', '' );
55 if ( $pkgnum ) {
56   $cust_pkg = qsearchs('cust_pkg', { 'pkgnum' => $pkgnum } );
57   $cust_main = $cust_pkg->cust_main;
58 }
59
60 unless ( $svcnum || $cgi->param('error') ) { #adding
61
62   #set gecos
63   if ($cust_main) {
64     unless ( $part_svc->part_svc_column('uid')->columnflag eq 'F' ) {
65       $svc_acct->setfield('finger',
66         $cust_main->getfield('first') . " " . $cust_main->getfield('last')
67       );
68     }
69   }
70
71   #set fixed and default fields from part_svc
72   foreach my $part_svc_column (
73     grep { $_->columnflag } $part_svc->all_part_svc_column
74   ) {
75     if ( $part_svc_column->columnname eq 'usergroup' ) {
76       @groups = split(',', $part_svc_column->columnvalue);
77     } else {
78       $svc_acct->setfield( $part_svc_column->columnname,
79                            $part_svc_column->columnvalue,
80                          );
81     }
82   }
83
84 }
85
86 #fixed radius groups always override & display
87 if ( $part_svc->part_svc_column('usergroup')->columnflag eq 'F' ) {
88   @groups = split(',', $part_svc->part_svc_column('usergroup')->columnvalue);
89 }
90
91 my $action = $svcnum ? 'Edit' : 'Add';
92
93 my $svc = $part_svc->getfield('svc');
94
95 my $otaker = getotaker;
96
97 my $username = $svc_acct->username;
98 my $password;
99 if ( $svc_acct->_password ) {
100   if ( $conf->exists('showpasswords') || ! $svcnum ) {
101     $password = $svc_acct->_password;
102   } else {
103     $password = "*HIDDEN*";
104   }
105 } else {
106   $password = '';
107 }
108
109 my $ulen = 
110   $conf->exists('usernamemax')
111   ? $conf->config('usernamemax')
112   : dbdef->table('svc_acct')->column('username')->length;
113 my $ulen2 = $ulen+2;
114
115 my $pmax = $conf->config('passwordmax') || 8;
116 my $pmax2 = $pmax+2;
117
118 my $p1 = popurl(1);
119
120 %>
121
122 <%= header("$action $svc account") %>
123
124 <% if ( $cgi->param('error') ) { %>
125   <FONT SIZE="+1" COLOR="#ff0000">Error: <%= $cgi->param('error') %></FONT>
126   <BR><BR>
127 <% } %>
128
129 <% if ( $cust_main ) { %>
130   <%= include( '/elements/small_custview.html', $cust_main, '', 1 ) %>
131   <BR>
132 <% } %>
133
134 <FORM NAME="OneTrueForm" ACTION="<%= $p1 %>process/svc_acct.cgi" METHOD=POST>
135 <INPUT TYPE="hidden" NAME="svcnum" VALUE="<%= $svcnum %>">
136 <INPUT TYPE="hidden" NAME="pkgnum" VALUE="<%= $pkgnum %>">
137 <INPUT TYPE="hidden" NAME="svcpart" VALUE="<%= $svcpart %>">
138
139 Service # <%= $svcnum ? "<B>$svcnum</B>" : " (NEW)" %><BR>
140
141 <%= ntable("#cccccc",2) %>
142
143 <TR>
144   <TD ALIGN="right">Service</TD>
145   <TD BGCOLOR="#eeeeee"><%= $part_svc->svc %></TD>
146 </TR>
147
148 <TR>
149   <TD ALIGN="right">Username</TD>
150   <TD>
151     <INPUT TYPE="text" NAME="username" VALUE="<%= $username %>" SIZE=<%= $ulen2 %> MAXLENGTH=<%= $ulen %>>
152   </TD>
153 </TR>
154
155 <TR>
156   <TD ALIGN="right">Password</TD>
157   <TD>
158     <INPUT TYPE="text" NAME="_password" VALUE="<%= $password %>" SIZE=<%= $pmax2 %> MAXLENGTH=<%= $pmax %>>
159     (blank to generate)
160   </TD>
161 </TR>
162
163
164 <%
165 my $sec_phrase = $svc_acct->sec_phrase;
166 if ( $conf->exists('security_phrase') ) {
167 %>
168
169   <TR>
170     <TD ALIGN="right">Security phrase</TD>
171     <TD>
172       <INPUT TYPE="text" NAME="sec_phrase" VALUE="<%= $sec_phrase %>" SIZE=32>
173       (for forgotten passwords)
174     </TD>
175   </TD>
176
177 <% } else { %>
178
179   <INPUT TYPE="hidden" NAME="sec_phrase" VALUE="<%= $sec_phrase %>">
180
181 <% } %>
182
183
184 <%
185 #domain
186 my $domsvc = $svc_acct->domsvc || 0;
187 if ( $part_svc->part_svc_column('domsvc')->columnflag eq 'F' ) {
188 %>
189
190   <INPUT TYPE="hidden" NAME="domsvc" VALUE="<%= $domsvc %>">
191
192 <% } else { 
193
194   my %svc_domain = ();
195
196   if ( $domsvc ) {
197     my $svc_domain = qsearchs('svc_domain', { 'svcnum' => $domsvc, } );
198     if ( $svc_domain ) {
199       $svc_domain{$svc_domain->svcnum} = $svc_domain;
200     } else {
201       warn "unknown svc_domain.svcnum for svc_acct.domsvc: $domsvc";
202     }
203   }
204
205   if ( $part_svc->part_svc_column('domsvc')->columnflag eq 'D' ) {
206     my $svc_domain = qsearchs('svc_domain', {
207       'svcnum' => $part_svc->part_svc_column('domsvc')->columnvalue,
208     } );
209     if ( $svc_domain ) {
210       $svc_domain{$svc_domain->svcnum} = $svc_domain;
211     } else {
212       warn "unknown svc_domain.svcnum for part_svc_column domsvc: ".
213            $part_svc->part_svc_column('domsvc')->columnvalue;
214     }
215   }
216
217   if ($cust_pkg && !$conf->exists('svc_acct-alldomains') ) {
218     my @cust_svc =
219       map { qsearch('cust_svc', { 'pkgnum' => $_->pkgnum } ) }
220           qsearch('cust_pkg', { 'custnum' => $cust_pkg->custnum } );
221     foreach my $cust_svc ( @cust_svc ) {
222       my $svc_domain =
223         qsearchs('svc_domain', { 'svcnum' => $cust_svc->svcnum } );
224      $svc_domain{$svc_domain->svcnum} = $svc_domain if $svc_domain;
225     }
226   } else {
227     %svc_domain = map { $_->svcnum => $_ } qsearch('svc_domain', {} );
228   }
229
230 %>
231
232   <TR>
233     <TD ALIGN="right">Domain</TD>
234     <TD>
235       <SELECT NAME="domsvc" SIZE=1>
236
237         <% foreach my $svcnum (
238              sort { $svc_domain{$a}->domain cmp $svc_domain{$b}->domain }
239                   keys %svc_domain
240            ) {
241              my $svc_domain = $svc_domain{$svcnum};
242         %>
243
244              <OPTION VALUE="<%= $svc_domain->svcnum %>" <%= $svc_domain->svcnum == $domsvc ? ' SELECTED' : '' %>><%= $svc_domain->domain %>
245
246        <% } %>
247       </SELECT>
248     </TD>
249   </TR>
250
251 <% } %>
252
253
254 <%
255 #pop
256 my $popnum = $svc_acct->popnum || 0;
257 if ( $part_svc->part_svc_column('popnum')->columnflag eq 'F' ) {
258 %>
259
260   <INPUT TYPE="hidden" NAME="popnum" VALUE="<%= $popnum %>">
261
262
263 <% } else { %>
264
265   <TR>
266     <TD ALIGN="right">Access number</TD>
267     <TD><%= FS::svc_acct_pop::popselector($popnum) %></TD>
268   </TR>
269
270 <% } %>
271
272
273 <% #uid/gid %>
274 <% foreach my $xid (qw( uid gid )) { %>
275
276   <%
277   if ( $part_svc->part_svc_column($xid)->columnflag eq 'F'
278        || ! $conf->exists("svc_acct-edit_$xid")
279      ) {
280   %>
281   
282     <% if ( length($svc_acct->$xid()) ) { %>
283   
284       <TR>
285         <TD ALIGN="right"><%= uc($xid) %></TD>
286           <TD BGCOLOR="#eeeeee"><%= $svc_acct->$xid() %></TD>
287         <TD>
288         </TD>
289       </TR>
290   
291     <% } %>
292   
293     <INPUT TYPE="hidden" NAME="<%= $xid %>" VALUE="<%= $svc_acct->$xid() %>">
294   
295   <% } else { %>
296   
297     <TR>
298       <TD ALIGN="right"><%= uc($xid) %></TD>
299       <TD>
300         <INPUT TYPE="text" NAME="<%= $xid %>" SIZE=8 MAXLENGTH=6 VALUE="<%= $svc_acct->$xid() %>">
301       </TD>
302     </TR>
303   
304   <% } %>
305
306 <% } %>
307
308
309 <%
310 #finger
311 if ( $part_svc->part_svc_column('uid')->columnflag eq 'F'
312      && ! $svc_acct->finger ) { 
313 %>
314
315   <INPUT TYPE="hidden" NAME="finger" VALUE="">
316
317 <% } else { %>
318
319   <TR>
320     <TD ALIGN="right">GECOS</TD>
321     <TD>
322       <INPUT TYPE="text" NAME="finger" VALUE="<%= $svc_acct->finger %>">
323     </TD>
324   </TR>
325
326 <% } %>
327
328
329 <INPUT TYPE="hidden" NAME="dir" VALUE="<%= $svc_acct->dir %>">
330
331
332 <%
333 #shell
334 my $shell = $svc_acct->shell;
335 if ( $part_svc->part_svc_column('shell')->columnflag eq 'F'
336      || ( !$shell && $part_svc->part_svc_column('uid')->columnflag eq 'F' )
337    ) {
338 %>
339
340   <INPUT TYPE="hidden" NAME="shell" VALUE="<%= $shell %>">
341
342 <% } else { %>
343
344   <TR>
345     <TD ALIGN="right">Shell</TD>
346     <TD>
347       <SELECT NAME="shell" SIZE=1>
348
349         <%
350            my($etc_shell);
351            foreach $etc_shell (@shells) {
352         %>
353
354           <OPTION<%= $etc_shell eq $shell ? ' SELECTED' : '' %>><%= $etc_shell %>
355
356         <% } %>
357
358       </SELECT>
359     </TD>
360   </TR>
361
362 <% } %>
363
364
365 <% if ( $part_svc->part_svc_column('quota')->columnflag eq 'F' ) { %>
366
367   <INPUT TYPE="hidden" NAME="quota" VALUE="<%= $svc_acct->quota %>">
368
369 <% } else { %>
370
371   <TR>
372     <TD ALIGN="right">Quota:</TD>
373     <TD><INPUT TYPE="text" NAME="quota" VALUE="<%= $svc_acct->quota %>"></TD>
374   </TR>
375   
376 <% } %>
377
378
379 <% if ( $part_svc->part_svc_column('slipip')->columnflag eq 'F' ) { %>
380
381   <INPUT TYPE="hidden" NAME="slipip" VALUE="<%= $svc_acct->slipip %>">
382
383 <% } else { %>
384
385   <TR>
386     <TD ALIGN="right">IP</TD>
387     <TD><INPUT TYPE="text" NAME="slipip" VALUE="<%= $svc_acct->slipip %>"></TD>
388   </TR>
389
390 <% } %>
391
392
393 <%
394 foreach my $r ( grep { /^r(adius|[cr])_/ } fields('svc_acct') ) {
395   $r =~ /^^r(adius|[cr])_(.+)$/ or next; #?
396   my $a = $2;
397 %>
398
399   <% if ( $part_svc->part_svc_column($r)->columnflag eq 'F' ) { %>
400
401     <INPUT TYPE="hidden" NAME="<%= $r %>" VALUE="<%= $svc_acct->getfield($r) %>">
402
403   <% } else { %>
404
405     <TR>
406       <TD ALIGN="right"><%= $FS::raddb::attrib{$a} %></TD>
407       <TD><INPUT TYPE="text" NAME="<%= $r %>" VALUE="<%= $svc_acct->getfield($r) %>"></TD>
408     </TR>
409
410   <% } %>
411
412 <% } %>
413
414
415 <TR>
416   <TD ALIGN="right">RADIUS groups</TD>
417
418   <% if ( $part_svc->part_svc_column('usergroup')->columnflag eq 'F' ) { %>
419
420     <TD BGCOLOR="#eeeeee"><%= join('<BR>', @groups) %></TD>
421
422   <% } else { %>
423
424     <TD><%= FS::svc_acct::radius_usergroup_selector( \@groups ) %></TD>
425
426   <% } %>
427
428 </TR>
429
430 <% foreach my $field ($svc_acct->virtual_fields) { %>
431
432   <% # If the flag is X, it won't even show up in $svc_acct->virtual_fields. %>
433   <% if ( $part_svc->part_svc_column($field)->columnflag ne 'F' ) { %>
434
435     <%= $svc_acct->pvf($field)->widget('HTML', 'edit', $svc_acct->getfield($field)) %>
436
437   <% } %>
438
439 <% } %>
440   
441 </TABLE>
442 <BR>
443
444 <INPUT TYPE="submit" VALUE="Submit">
445
446 </FORM></BODY></HTML>