Handle hostnames with upper-case letters
[webmin.git] / nis / save_passwd_shadow.cgi
1 #!/usr/local/bin/perl
2 # save_passwd_shadow.cgi
3 # Create, update or delete a password/shadow files entry
4
5 require './nis-lib.pl';
6 require 'timelocal.pl';
7 &ReadParse();
8
9 ($t, $lnums, $passwd, $shadow) =
10         &table_edit_setup($in{'table'}, $in{'line'}, ':');
11 if ($in{'delete'}) {
12         # Just delete the user
13         &table_delete($t, $lnums);
14         }
15 else {
16         # Validate inputs and save the user
17         &error_setup($text{'passwd_err'});
18         $in{'name'} =~ /^[^: \t]+$/ || &error($text{'passwd_ename'});
19         $in{'uid'} =~ /^\d+$/ || &error($text{'passwd_euid'});
20         $in{'gid'} =~ /^\d+$/ || &error($text{'passwd_egid'});
21         $in{'real'} =~ /^[^:]*$/ || &error($text{'passwd_ereal'});
22         $in{'home'} =~ /^[^:]+$/ || &error($text{'passwd_ehome'});
23         $in{'shell'} ne '' || $in{'other'} =~ /^[^:]+$/ ||
24                 &error($text{'passwd_eshell'});
25         $in{'passmode'} != 2 || $in{'encpass'} =~ /^[^:]*$/ ||
26                 &error($text{'passwd_epass'});
27         %uconfig = &foreign_config("useradmin");
28         $salt = chr(int(rand(26))+65) . chr(int(rand(26))+65);
29         @passwd = ( $in{'name'}, 'x',
30                     $in{'uid'}, $in{'gid'}, $in{'real'},
31                     $in{'home'}, $in{'shell'} ? $in{'shell'} : $in{'other'} );
32         $pass = $in{'passmode'} == 0 ? "" :
33                 $in{'passmode'} == 1 ? $uconfig{'lock_string'} :
34                 $in{'passmode'} == 2 ? $in{'encpass'} :
35                                        &unix_crypt($in{'pass'}, $salt);
36         if ($in{'mode'} == 2) {
37                 # Parse extra shadow inputs
38                 if ($in{'expired'} ne "" && $in{'expirem'} ne "" &&
39                     $in{'expirey'} ne "") {
40                         eval { $expire = timelocal(0, 0, 12, $in{'expired'},
41                                                    $in{'expirem'}-1,
42                                                    $in{'expirey'}-1900) };
43                         &error($text{'passwd_eexpire'}) if ($@);
44                         $expire = int($expire / (60*60*24));
45                         }
46                 $in{'min'} =~ /^[0-9]*$/ || &error($text{'passwd_emin'});
47                 $in{'max'} =~ /^[0-9]*$/ || &error($text{'passwd_emax'});
48                 $in{'warn'} =~ /^[0-9]*$/ || &error($text{'passwd_ewarn'});
49                 $in{'inactive'} =~ /^[0-9]*$/ || &error($text{'passwd_einactive'});
50                 @shadow = ( $in{'name'}, $pass,
51                             undef, $in{'min'}, $in{'max'}, $in{'warn'},
52                             $in{'inactive'}, $expire, $shadow->[8] );
53                 $shadow[2] = int(time() / (60*60*24))
54                         if ($shadow[1] ne $shadow->[1]);
55                 }
56         elsif ($in{'mode'} == 1) {
57                 @shadow = ( $in{'name'}, $pass,
58                             @$shadow[2..8] );
59                 }
60         else {
61                 $passwd[1] = $pass;
62                 }
63
64         if ($in{'line'} eq '') {
65                 &table_add($t, ":", \@passwd, \@shadow);
66                 }
67         else {
68                 &table_update($t, $lnums, ":", \@passwd, \@shadow);
69                 }
70         }
71 &apply_table_changes() if (!$config{'manual_build'});
72 &redirect("edit_tables.cgi?table=$in{'table'}");
73