Handle hostnames with upper-case letters
[webmin.git] / mysql / save_db.cgi
1 #!/usr/local/bin/perl
2 # save_db.cgi
3 # Save, create or delete a db table record
4
5 require './mysql-lib.pl';
6 &ReadParse();
7 $access{'perms'} || &error($text{'perms_ecannot'});
8
9 if ($in{'delete'}) {
10         # Delete some database
11         $access{'perms'} == 1 || &can_edit_db($in{'olddb'}) ||
12                 &error($text{'perms_edb'});
13         &execute_sql_logged($master_db,
14                 "delete from db where user = '$in{'olduser'}' ".
15                 "and host = '$in{'oldhost'}' and db = '$in{'olddb'}'");
16         }
17 else {
18         # Validate inputs
19         &error_setup($text{'db_err'});
20         $in{'user_def'} || $in{'user'} =~ /^\S+$/ ||
21                 &error($text{'db_euser'});
22         $in{'host'} < 2 || $in{'host'} =~ /^\S+$/ ||
23                 &error($text{'db_ehost'});
24         if ($access{'perms'} == 2 && $access{'dbs'} ne '*') {
25                 $db = $in{'dbs'};
26                 }
27         else {
28                 $db = $in{'db_def'} == 1 ? "" :
29                       $in{'db_def'} == 2 ? $in{'dbs'} : $in{'db'};
30                 $db =~ /^\S*$/ || &error($text{'db_edb'});
31                 }
32         if ($access{'perms'} == 2) {
33                 $in{'new'} || &can_edit_db($in{'olddb'}) ||
34                         &error($text{'perms_edb'});
35                 &can_edit_db($db) || &error($text{'perms_edb'});
36                 }
37
38         map { $perms[$_]++ } split(/\0/, $in{'perms'});
39         @desc = &table_structure($master_db, 'db');
40         if ($in{'new'}) {
41                 # Create a new db
42                 for($i=3; $i<=&db_priv_cols()+3-1; $i++) {
43                         push(@yesno, $perms[$i] ? "'Y'" : "'N'");
44                         }
45                 $sql = sprintf "insert into db (%s) values ('%s', '%s', '%s', %s)",
46                         join(",", map { $desc[$_]->{'field'} } (0 .. &db_priv_cols()+3-1)),
47                         $in{'host_mode'} == 0 ? '' :
48                         $in{'host_mode'} == 1 ? '%' : $in{'host'},
49                         $db, $in{'user_def'} ? '' : $in{'user'},
50                         join(",", @yesno);
51                 }
52         else {
53                 # Update existing user
54                 for($i=3; $i<=&db_priv_cols()+3-1; $i++) {
55                         push(@yesno, $desc[$i]->{'field'}."=".
56                                      ($perms[$i] ? "'Y'" : "'N'"));
57                         }
58                 $sql = sprintf "update db set user = '%s', host = '%s', ".
59                                "db = '%s', %s where user = '%s' and ".
60                                "host = '%s' and db = '%s'",
61                         $in{'user_def'} ? '' : $in{'user'},
62                         $in{'host_mode'} == 0 ? '' :
63                         $in{'host_mode'} == 1 ? '%' : $in{'host'},
64                         $db, join(" , ", @yesno),
65                         $in{'olduser'}, $in{'oldhost'}, $in{'olddb'};
66                 }
67         &execute_sql_logged($master_db, $sql);
68         }
69 &execute_sql_logged($master_db, 'flush privileges');
70 if ($in{'delete'}) {
71         &webmin_log("delete", "perm", $in{'olddb'},
72                     { 'db' => $in{'olddb'},
73                       'host' => $in{'oldhost'},
74                       'user' => $in{'olduser'} } );
75         }
76 elsif ($in{'new'}) {
77         &webmin_log("create", "perm", $in{'db_def'} ? '' : $in{'db'},
78                     { 'db' => $db,
79                       'host' => $in{'host_mode'}<2 ? '' : $in{'host'},
80                       'user' => $in{'user_def'} ? '' : $in{'user'} } );
81         }
82 else {
83         &webmin_log("modify", "perm", $in{'db_def'} ? '' : $in{'db'},
84                     { 'db' => $db,
85                       'host' => $in{'host_mode'}<2 ? '' : $in{'host'},
86                       'user' => $in{'user_def'} ? '' : $in{'user'} } );
87         }
88 &redirect("list_dbs.cgi");
89