Handle hostnames with upper-case letters
[webmin.git] / rbac / save_project.cgi
1 #!/usr/local/bin/perl
2 # Create, update or delete one project
3
4 require './rbac-lib.pl';
5 $access{'projects'} || &error($text{'projects_ecannot'});
6 &ReadParse();
7 &error_setup($text{'project_err'});
8
9 &lock_rbac_files();
10 $projects = &list_projects();
11 if (!$in{'new'}) {
12         $project = $projects->[$in{'idx'}];
13         $logname = $project->{'name'};
14         }
15 else {
16         $project = { 'attr' => { } };
17         $logname = $in{'name'};
18         }
19
20 if ($in{'delete'}) {
21         # Just delete this project
22         &delete_project($project);
23         }
24 else {
25         # Check for clash
26         if ($in{'new'} || $logname ne $in{'name'}) {
27                 ($clash) = grep { $_->{'name'} eq $in{'name'} } @$projects;
28                 $clash && &error($text{'project_eclash'});
29                 }
30
31         # Validate and store inputs
32         $in{'name'} =~ /^[^: ]+$/ || &error($text{'project_ename'});
33         $project->{'name'} = $in{'name'};
34         $in{'id'} =~ /^\d+$/ || &error($text{'project_eid'});
35         if ($in{'new'} || $in{'id'} != $project->{'id'}) {
36                 ($clash) = grep { $_->{'id'} == $in{'id'} } @$projects;
37                 $clash && &error($text{'project_eidclash'});
38                 }
39         $project->{'id'} = $in{'id'};
40         $in{'desc'} =~ /^[^:]*$/ || &error($text{'project_edesc'});
41         $project->{'desc'} = $in{'desc'};
42         $project->{'users'} = &parse_project_members("users");
43         $project->{'groups'} = &parse_project_members("groups");
44
45         # Validate resources, and build list of selected rctls
46         for($i=0; defined($rctl = $in{"rctl_$i"}); $i++) {
47                 next if (!$rctl);
48                 $priv = $in{"priv_$i"};
49                 $limit = $in{"limit_$i"};
50                 $action = $in{"action_$i"};
51                 if ($rctls{$rctl}) {
52                         $rctls{$rctl} .= ",";
53                         }
54                 if ($priv) {
55                         $limit =~ /^\d+/ ||
56                                 &error(&text('project_elimit', $i+1));
57                         $rctls{$rctl} .= "($priv,$limit,$action)";
58                         }
59                 else {
60                         $rctls{$rctl} = undef;
61                         }
62                 }
63         foreach $k (keys %{$project->{'attr'}}) {
64                 delete($project->{'attr'}->{$k}) if ($k =~ /\./);
65                 }
66         foreach $rctl (keys %rctls) {
67                 $project->{'attr'}->{$rctl} = $rctls{$rctl};
68                 }
69
70         # Save pool and max-rss attributes
71         delete($project->{'attr'}->{'project.pool'});
72         if (!$in{'pool_def'}) {
73                 $in{'pool'} =~ /^[a-z0-9\.\-]+$/i ||
74                         &error($text{'project_epool'});
75                 $project->{'attr'}->{'project.pool'} = $in{'pool'};
76                 }
77         delete($project->{'attr'}->{'rcap.max-rss'});
78         if (!$in{'maxrss_def'}) {
79                 $in{'maxrss'} =~ /^\d+$/ ||
80                         &error($text{'project_emaxrss'});
81                 $project->{'attr'}->{'rcap.max-rss'} =
82                         $in{'maxrss'}*$in{'maxrss_units'};
83                 }
84
85         # Save or update project
86         if ($in{'new'}) {
87                 &create_project($project);
88                 }
89         else {
90                 &modify_project($project);
91                 }
92         }
93
94 &unlock_rbac_files();
95 &webmin_log($in{'delete'} ? "delete" : $in{'new'} ? "create" : "modify",
96             "project", $logname, $project);
97 &redirect("list_projects.cgi");
98