Handle hostnames with upper-case letters
[webmin.git] / mysql / save_user.cgi
1 #!/usr/local/bin/perl
2 # save_user.cgi
3 # Save, create or delete a user
4
5 require './mysql-lib.pl';
6 &ReadParse();
7 $access{'perms'} == 1 || &error($text{'perms_ecannot'});
8
9 if ($in{'delete'}) {
10         # Delete some user
11         &execute_sql_logged($master_db,
12                      "delete from user where user = '$in{'olduser'}' ".
13                      "and host = '$in{'oldhost'}'");
14         }
15 else {
16         # Validate inputs
17         &error_setup($text{'user_err'});
18         $in{'mysqluser_def'} || $in{'mysqluser'} =~ /^\S+$/ ||
19                 &error($text{'user_euser'});
20         $in{'host_def'} || $in{'host'} =~ /^\S+$/ ||
21                 &error($text{'user_ehost'});
22
23         map { $perms[$_]++ } split(/\0/, $in{'perms'});
24         @desc = &table_structure($master_db, 'user');
25         $host = $in{'host_def'} ? '%' : $in{'host'};
26         $user = $in{'mysqluser_def'} ? '' : $in{'mysqluser'};
27         if ($in{'new'}) {
28                 # Create a new user
29                 for($i=3; $i<=&user_priv_cols()+3-1; $i++) {
30                         push(@yesno, $perms[$i] ? "'Y'" : "'N'");
31                         }
32                 $sql = sprintf "insert into user (%s) values ('%s', '%s', '', %s)",
33                         join(",", map { $desc[$_]->{'field'} } (0 .. &user_priv_cols()+3-1)),
34                         $host, $user,
35                         join(",", @yesno);
36                 }
37         else {
38                 # Update existing user
39                 for($i=3; $i<=&user_priv_cols()+3-1; $i++) {
40                         push(@yesno, $desc[$i]->{'field'}."=".
41                                      ($perms[$i] ? "'Y'" : "'N'"));
42                         }
43                 $sql = sprintf "update user set host = '%s', user = '%s', ".
44                                "%s where user = '%s' and host = '%s'",
45                     $host, $user,
46                     join(" , ", @yesno), $in{'olduser'}, $in{'oldhost'};
47                 }
48         &execute_sql_logged($master_db, $sql);
49         if ($in{'mysqlpass_mode'} == 0) {
50                 $esc = &escapestr($in{'mysqlpass'});
51                 &execute_sql_logged($master_db,
52                         "update user set password = $password_func('$esc') ".
53                         "where user = ? and host = ?",
54                         $user, $host);
55                 }
56         elsif ($in{'mysqlpass_mode'} == 2) {
57                 &execute_sql_logged($master_db,
58                         "update user set password = NULL ".
59                         "where user = ? and host = ?",
60                         $user, $host);
61                 }
62
63         # Save various limits
64         foreach $f ('max_user_connections', 'max_connections',
65                     'max_questions', 'max_updates') {
66                 next if ($mysql_version < 5 || !defined($in{$f.'_def'}));
67                 $in{$f.'_def'} || $in{$f} =~ /^\d+$/ ||
68                        &error($text{'user_e'.$f});
69                 &execute_sql_logged($master_db,
70                         "update user set $f = ? ".
71                         "where user = ? and host = ?",
72                         $in{$f.'_def'} ? 0 : $in{$f}, $user, $host);
73                 }
74
75         # Set SSL fields
76         if ($mysql_version >= 5 && defined($in{'ssl_type'})) {
77                 &execute_sql_logged($master_db,
78                         "update user set ssl_type = ? ".
79                         "where user = ? and host = ?",
80                         $in{'ssl_type'}, $user, $host);
81                 }
82         }
83 &execute_sql_logged($master_db, 'flush privileges');
84 if (!$in{'delete'} && !$in{'new'} &&
85     $in{'olduser'} eq $config{'login'} && !$access{'user'}) {
86         # Renamed or changed the password for the Webmin login .. update
87         # it too!
88         $config{'login'} = $in{'mysqluser'};
89         if ($in{'mysqlpass_mode'} == 0) {
90                 $config{'pass'} = $in{'mysqlpass'};
91                 }
92         elsif ($in{'mysqlpass_mode'} == 2) {
93                 $config{'pass'} = undef;
94                 }
95         &lock_file($module_config_file);
96         &save_module_config();
97         &unlock_file($module_config_file);
98         }
99 if ($in{'delete'}) {
100         &webmin_log("delete", "user", $in{'olduser'},
101                     { 'user' => $in{'olduser'},
102                       'host' => $in{'oldhost'} } );
103         }
104 elsif ($in{'new'}) {
105         &webmin_log("create", "user",
106                     $in{'mysqluser_def'} ? '' : $in{'mysqluser'},
107                     { 'user' => $in{'mysqluser_def'} ? '' : $in{'mysqluser'},
108                       'host' => $in{'host_def'} ? '' : $in{'host'} } );
109         }
110 else {
111         &webmin_log("modify", "user",
112                     $in{'mysqluser_def'} ? '' : $in{'mysqluser'},
113                     { 'user' => $in{'mysqluser_def'} ? '' : $in{'mysqluser'},
114                       'host' => $in{'host_def'} ? '' : $in{'host'} } );
115         }
116 &redirect("list_users.cgi");
117