]> git.sur5r.net Git - bacula/bacula/commitdiff
bvfs: support for bweb user acl
authorEric Bollengier <eric@eb.homelinux.org>
Mon, 15 Nov 2010 22:03:39 +0000 (23:03 +0100)
committerEric Bollengier <eric@eb.homelinux.org>
Thu, 18 Nov 2010 17:46:11 +0000 (18:46 +0100)
bacula/src/cats/bvfs.c
bacula/src/cats/bvfs.h

index 4a551fce1d5348d5e75ab673a7d0141536f7a46d..caeee64fa05be3d3216c47640caefe2b2f32ef39 100644 (file)
@@ -68,16 +68,59 @@ Bvfs::Bvfs(JCR *j, B_DB *mdb) {
    attr = new_attr(jcr);
    list_entries = result_handler;
    user_data = this;
+   username = NULL;
 }
 
 Bvfs::~Bvfs() {
    free_pool_memory(jobids);
    free_pool_memory(pattern);
    free_pool_memory(prev_dir);
+   if (username) {
+      free(username);
+   }
    free_attr(attr);
    jcr->dec_use_count();
 }
 
+void Bvfs::filter_jobid()
+{
+   if (!username) {
+      return;
+   }
+
+   /* Query used by Bweb to filter clients, activated when using
+    * set_username() 
+    */
+   POOL_MEM query;
+   Mmsg(query,
+      "SELECT DISTINCT JobId FROM Job JOIN Client USING (ClientId) "
+        "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 = '%s' "
+      ") AS filter USING (ClientId) "
+        " WHERE JobId IN (%s)", 
+        username, jobids);
+
+   db_list_ctx ctx;
+   Dmsg1(dbglevel_sql, "q=%s\n", query.c_str());
+   db_sql_query(db, query.c_str(), db_list_handler, &ctx);
+   pm_strcpy(jobids, ctx.list);
+}
+
+void Bvfs::set_jobid(JobId_t id)
+{
+   Mmsg(jobids, "%lld", (uint64_t)id);
+   filter_jobid();
+}
+
+void Bvfs::set_jobids(char *ids)
+{
+   pm_strcpy(jobids, ids);
+   filter_jobid();
+}
+
 /* 
  * TODO: Find a way to let the user choose how he wants to display
  * files and directories
index 5ed5ea58c5f74cf6ac4b80e8f6a9e70855862c4f..7156874f6a523aeac879a05fb9fb37b7e52b81c8 100644 (file)
@@ -72,13 +72,8 @@ public:
    Bvfs(JCR *j, B_DB *mdb);
    virtual ~Bvfs();
 
-   void set_jobid(JobId_t id) {
-      Mmsg(jobids, "%lld", (uint64_t)id);
-   }
-
-   void set_jobids(char *ids) {
-      pm_strcpy(jobids, ids);
-   }
+   void set_jobid(JobId_t id);
+   void set_jobids(char *ids);
 
    void set_limit(uint32_t max) {
       limit = max;
@@ -125,6 +120,14 @@ public:
       see_copies = val;
    }
 
+   void filter_jobid();         /* Call after set_username */
+
+   void set_username(char *user) {
+      if (user) {
+         username = bstrdup(user);
+      }
+   }
+
    void set_handler(DB_RESULT_HANDLER *h, void *ctx) {
       list_entries = h;
       user_data = ctx;
@@ -167,6 +170,7 @@ private:
    JCR *jcr;
    B_DB *db;
    POOLMEM *jobids;
+   char *username;              /* Used with Bweb */
    uint32_t limit;
    uint32_t offset;
    uint32_t nb_record;          /* number of records of the last query */