]> git.sur5r.net Git - bacula/bacula/blobdiff - gui/bweb/lib/Bweb.pm
ebl Add role checks for media
[bacula/bacula] / gui / bweb / lib / Bweb.pm
index aae48d00a3cef9baf3ca1ce5983fe2e417a0ddd0..24c2b60a88cc2ffbb5a9c90878c3faa7b332ee9d 100644 (file)
@@ -1083,6 +1083,12 @@ our %sql_func = (
          },
         );
 
+sub dbh_is_mysql
+{
+    my ($self) = @_;
+    return $self->{info}->{dbi} =~ /dbi:mysql/i;
+}
+
 sub dbh_disconnect
 {
     my ($self) = @_;
@@ -1147,7 +1153,7 @@ sub dbh_selectrow_hashref
 sub dbh_strcat
 {
     my ($self, @what) = @_;
-    if ($self->{conf}->{connection_string} =~ /dbi:mysql/i) {
+    if ($self->dbh_is_mysql()) {
        return 'CONCAT(' . join(',', @what) . ')' ;
     } else {
        return join(' || ', @what);
@@ -1258,6 +1264,7 @@ sub connect_db
     my ($self) = @_;
 
     unless ($self->{dbh}) {
+
        $self->{dbh} = DBI->connect($self->{info}->{dbi}, 
                                    $self->{info}->{user},
                                    $self->{info}->{password});
@@ -1267,10 +1274,10 @@ sub connect_db
 
        $self->{dbh}->{FetchHashKeyName} = 'NAME_lc';
 
-       if ($self->{info}->{dbi} =~ /^dbi:Pg/i) {
-           $self->{dbh}->do("SET datestyle TO 'ISO, YMD'");
-       } else {
+       if ($self->dbh_is_mysql()) {
            $self->{dbh}->do("SET group_concat_max_len=1000000");
+       } else {
+           $self->{dbh}->do("SET datestyle TO 'ISO, YMD'");
        }
     }
 }
@@ -2036,7 +2043,7 @@ sub get_param
 sub display_job
 {
     my ($self, %arg) = @_ ;
-    $self->can_do('r_view_job');
+    return if $self->cant_do('r_view_job');
 
     $arg{order} = ' Job.JobId DESC ';
 
@@ -2447,7 +2454,7 @@ WHERE Location = $arg->{qlocation}
     }
 
     $query = "
-DELETE FROM Location WHERE Location = $arg->{qlocation} LIMIT 1
+DELETE FROM Location WHERE Location = $arg->{qlocation}
 ";
 
     $self->dbh_do($query);
@@ -2533,7 +2540,11 @@ sub groups_edit
     my $grp = $self->get_form(qw/qclient_group db_clients/);
 
     unless ($grp->{qclient_group}) {
-       return $self->error("Can't get group");
+       $self->display({ ID => $cur_id++,
+                        client_group => "''",
+                        %$grp,
+                    }, "groups_edit.tpl");
+       return;
     }
 
     my $query = "
@@ -2558,10 +2569,20 @@ sub groups_save
     $self->can_do('r_group_mgnt');
 
     my $arg = $self->get_form(qw/qclient_group jclients qnewgroup/);
+
+    if (!$arg->{qclient_group} and $arg->{qnewgroup}) {
+       my $query = "
+INSERT INTO client_group (client_group_name) 
+VALUES ($arg->{qnewgroup})
+";
+       $self->dbh_do($query);
+       $arg->{qclient_group} = $arg->{qnewgroup};
+    }
+
     unless ($arg->{qclient_group}) {
        return $self->error("Can't get groups");
     }
-    
+
     $self->{dbh}->begin_work();
 
     my $query = "
@@ -2635,29 +2656,6 @@ DELETE FROM client_group
     $self->display_groups();
 }
 
-
-sub groups_add
-{
-    my ($self) = @_;
-    $self->can_do('r_group_mgnt');
-
-    my $arg = $self->get_form(qw/qclient_group/) ;
-
-    unless ($arg->{qclient_group}) {
-       $self->display({}, "groups_add.tpl");
-       return 1;
-    }
-
-    my $query = "
-INSERT INTO client_group (client_group_name) 
-VALUES ($arg->{qclient_group})
-";
-
-    $self->dbh_do($query);
-
-    $self->display_groups();
-}
-
 sub display_groups
 {
     my ($self) = @_;
@@ -2717,33 +2715,42 @@ sub get_roles
     return 1;
 }
 
-# TODO: avoir un mode qui coupe le programme avec une page d'erreur
-# we can also get all security and fill {security} hash
-sub can_do
+sub cant_do
 {
     my ($self, $action) = @_;
     # is security enabled in configuration ?
     if (not $self->{info}->{enable_security}) {
-        return 1;
+        return 0
     }
     # admin is a special user that can do everything
     if ($self->{loginname} eq 'admin') {
-        return 1;
+        return 0;
     }
     # must be logged
     if (!$self->{loginname}) {
-        $self->error("Can't do $action, your are not logged. " .
-                     "Check security with your administrator");
-        $self->display_end();
-        exit (0);
+       $self->{error} = "Can't do $action, your are not logged. " .
+           "Check security with your administrator";
+        return 1;
     }
     $self->get_roles();
     if (!$self->{security}->{$action}) {
-        $self->error("$self->{loginname} sorry, but this action ($action) " .
-                    "is not permited. " .
-                     "Check security with your administrator");
+        $self->{error} =
+           "$self->{loginname} sorry, but this action ($action) " .
+           "is not permited. " .
+           "Check security with your administrator";
+        return 1;
+    }
+    return 0;
+}
+
+# make like an assert (program die)
+sub can_do
+{
+    my ($self, $action) = @_;
+    if ($self->cant_do($action)) {
+        $self->error($self->{error});
         $self->display_end();
-        exit (0);
+        exit 0;
     }
     return 1;
 }
@@ -2768,36 +2775,42 @@ sub use_filter
 # JOIN Client USING (ClientId) " . $b->get_client_filter() . "
 sub get_client_filter
 {
-    my ($self) = @_;
-    if ($self->use_filter()) {
-       my $u = $self->dbh_quote($self->{loginname});
-       return "
+    my ($self, $login) = @_;
+    my $u;
+    if ($login) {
+       $u = $self->dbh_quote($login);
+    } elsif ($self->use_filter()) {
+       $u = $self->dbh_quote($self->{loginname});
+    } else {
+       return '';
+    }
+    return "
  JOIN (SELECT ClientId FROM client_group_member
    JOIN client_group USING (client_group_id) 
    JOIN bweb_client_group_acl USING (client_group_id) 
    JOIN bweb_user USING (userid)
    WHERE bweb_user.username = $u 
  ) AS filter USING (ClientId)";
-    } else {
-       return '';
-    }
 }
 
 #JOIN client_group USING (client_group_id)" . $b->get_client_group_filter()
 sub get_client_group_filter
 {
-    my ($self) = @_;
-    if ($self->use_filter()) {
-       my $u = $self->dbh_quote($self->{loginname});
-       return "
+    my ($self, $login) = @_;
+    my $u;
+    if ($login) {
+       $u = $self->dbh_quote($login);
+    } elsif ($self->use_filter()) {
+       $u = $self->dbh_quote($self->{loginname});
+    } else {
+       return '';
+    }
+    return "
  JOIN (SELECT client_group_id 
          FROM bweb_client_group_acl
          JOIN bweb_user USING (userid)
    WHERE bweb_user.username = $u 
  ) AS filter USING (client_group_id)";
-    } else {
-       return '';
-    }
 }
 
 # role and username have to be quoted before
@@ -2918,12 +2931,14 @@ sub users_add
     }
 
     # will fail if user already exists
-    $self->dbh_do("
+    # UPDATE with mysql dbi does not return if update is ok
+    ($self->dbh_do("
   UPDATE bweb_user 
      SET passwd=$arg->{qpasswd}, comment=$arg->{qcomment}, 
          use_acl=$arg->{use_acl}
-   WHERE username = $u")
-        or
+   WHERE username = $u") 
+#     and (! $self->dbh_is_mysql() )
+     ) and
     $self->dbh_do("
   INSERT INTO bweb_user (username, passwd, use_acl, comment) 
         VALUES ($u, $arg->{qpasswd}, $arg->{use_acl}, $arg->{qcomment})");
@@ -2938,14 +2953,15 @@ sub users_add
             $self->grant($arg->{jrolenames}, $u);
         }
 
-       $self->dbh_do("
+       if ($arg->{jclient_groups}) {
+           $self->dbh_do("
 INSERT INTO bweb_client_group_acl (client_group_id, userid)
  SELECT client_group_id, userid 
    FROM client_group, bweb_user
   WHERE client_group_name IN ($arg->{jclient_groups})
     AND username = $u
 ");
-
+       }
     }
     $self->{dbh}->commit();
 
@@ -2982,12 +2998,14 @@ sub display_user
      FROM bweb_user
     WHERE username = $user
 ");
-
     if (!$userp) {
         return $self->error("Can't find $user in catalog");
     }
-    $arg = $self->get_form(qw/db_usernames db_client_groups/);
-    my $arg2 = $self->get_form(qw/filter db_client_groups/);
+    my $filter = $self->get_client_group_filter($arg->{username});
+    my $scg = $self->dbh_selectall_hashref("
+ SELECT client_group_name AS name 
+   FROM client_group $filter
+", 'name');
 
 #  rolename  | userid
 #------------+--------
@@ -3004,6 +3022,8 @@ SELECT rolename, temp.userid
 ORDER BY rolename
 ", 'rolename');
 
+    $arg = $self->get_form(qw/db_usernames db_client_groups/);    
+
     $self->display({
         db_usernames => $arg->{db_usernames},
         username => $userp->{username},
@@ -3011,7 +3031,7 @@ ORDER BY rolename
         passwd => $userp->{passwd},
        use_acl => $userp->{use_acl},
        db_client_groups => $arg->{db_client_groups},
-       client_group => $arg2->{db_client_groups},
+       client_group => [ values %$scg ],
         db_roles => [ values %$role], 
     }, "display_user.tpl");
 }
@@ -3166,7 +3186,7 @@ INSERT LocationLog (Date, Comment, MediaId, LocationId, NewVolStatus)
 sub display_client_stats
 {
     my ($self, %arg) = @_ ;
-    $self->can_do('r_view_stats');
+    $self->can_do('r_view_stat');
 
     my $client = $self->dbh_quote($arg{clientname});
     # get security filter
@@ -3330,7 +3350,7 @@ GROUP BY VolStatus
 sub display_running_job
 {
     my ($self) = @_;
-    $self->can_do('r_view_running_job');
+    return if $self->cant_do('r_view_running_job');
 
     my $arg = $self->get_form('client', 'jobid');
 
@@ -3366,7 +3386,7 @@ WHERE Job.JobId = $arg->{jobid}
 sub display_running_jobs
 {
     my ($self, $display_action) = @_;
-    $self->can_do('r_view_running_job');
+    return if $self->cant_do('r_view_running_job');
 
     # get security filter
     my $filter = $self->get_client_filter();
@@ -3776,9 +3796,9 @@ SELECT Job.Name as name, Client.Name as clientname
 
     my $logtext;
     if (CGI::param('time') || $self->{info}->{display_log_time}) {
-       $logtext = 'LogText';
+       $logtext = $self->dbh_strcat('Time', " ' ' ", 'LogText');
     } else {
-       $logtext = $self->dbh_strcat('Time', ' ', 'LogText')
+       $logtext = 'LogText';
     }
 
     $query = "