]> andersk Git - moira.git/commitdiff
generic acl support
authordanw <danw>
Fri, 6 Aug 1999 18:46:09 +0000 (18:46 +0000)
committerdanw <danw>
Fri, 6 Aug 1999 18:46:09 +0000 (18:46 +0000)
(as well as some tweaks for the "zephyr" table)

server/mr_server.h
server/qsupport.pc
server/queries2.c
server/qvalidate.pc

index b812b08089969de08088e12fb735d7dcda1c5a4c..cb542c81180ffb1e61c2ef11d764879f4bb394b3 100644 (file)
@@ -239,9 +239,6 @@ int qualified_get_lists(struct query *q, char **argv, client *cl,
                        int (*action)(int, char *[], void *), void *actarg);
 int get_members_of_list(struct query *q, char **argv, client *cl,
                        int (*action)(int, char *[], void *), void *actarg);
-int get_end_members_of_list(struct query *q, char **argv, client *cl,
-                           int (*action)(int, char *[], void *),
-                           void *actarg);
 int qualified_get_server(struct query *q, char **argv, client *cl,
                         int (*action)(int, char *[], void *), void *actarg);
 int qualified_get_serverhost(struct query *q, char **argv, client *cl,
index f5957a880185d39d66ea69e4e05e360b4e201699..8064ae9e57066521bfa869acc51d0bd8dae67d80 100644 (file)
@@ -31,9 +31,6 @@ EXEC SQL WHENEVER SQLERROR DO dbmserr();
 
 int get_ace_internal(char *atypex, int aid,
                     int (*action)(int, char *[], void *), void *actarg);
-int gmol_internal(struct query *q, char *argv[], client *cl,
-                 int (*action)(int, char *[], void *), void *actarg,
-                 int flag);
 int qualified_get(struct query *q, char *argv[],
                  int (*action)(int, char *[], void *), void *actarg,
                  char *start, char *range, char *field, char *flags[]);
@@ -111,7 +108,7 @@ int set_pobox(struct query *q, char **argv, client *cl)
 int add_member_to_list(struct query *q, char **argv, client *cl)
 {
   EXEC SQL BEGIN DECLARE SECTION;
-  int id, lid, mid, error, who, ref, rowcnt;
+  int id, lid, mid, tag, error, who, ref, rowcnt;
   char *mtype, dtype[IMEMBERS_MEMBER_TYPE_SIZE], *entity;
   EXEC SQL END DECLARE SECTION;
   int ancestors[MAXLISTDEPTH], aref[MAXLISTDEPTH], acount, a;
@@ -123,6 +120,7 @@ int add_member_to_list(struct query *q, char **argv, client *cl)
   lid = *(int *)argv[0];
   mtype = argv[1];
   mid = *(int *)argv[2];
+  tag = !strcmp(q->shortname, "atml") ? *(int *)argv[3] : 0;
 
   if (acl_access_check(lid, cl))
     return MR_PERM;
@@ -245,7 +243,7 @@ int add_member_to_list(struct query *q, char **argv, client *cl)
              if (a == 0 && d == 0)
                {
                  EXEC SQL UPDATE imembers
-                   SET ref_count = ref_count + :ref, direct = 1
+                   SET ref_count = ref_count + :ref, direct = 1, tag = :tag
                    WHERE list_id = :lid AND member_id = :mid
                    AND member_type = :mtype;
                }
@@ -263,14 +261,14 @@ int add_member_to_list(struct query *q, char **argv, client *cl)
              if (a == 0 && d == 0)
                {
                  EXEC SQL INSERT INTO imembers
-                   (list_id, member_id, direct, member_type, ref_count)
-                   VALUES (:lid, :mid, 1, :mtype, 1);
+                   (list_id, member_type, member_id, tag, direct, ref_count)
+                   VALUES (:lid, :mtype, :mid, :tag, 1, 1);
                }
              else
                {
                  EXEC SQL INSERT INTO imembers
-                   (list_id, member_id, direct, member_type, ref_count)
-                   VALUES (:lid, :mid, 0, :mtype, 1);
+                   (list_id, member_type, member_id, tag, direct, ref_count)
+                   VALUES (:lid, :mtype, :mid, :tag, 0, 1);
                }
              iargv[0] = (char *)lid;
              iargv[1] = mtype;
@@ -881,56 +879,39 @@ int qualified_get_lists(struct query *q, char *argv[], client *cl,
 }
 
 
-/* get_members_of_list - this gets only direct members */
-
 int get_members_of_list(struct query *q, char *argv[], client *cl,
                        int (*action)(int, char *[], void *), void *actarg)
-{
-  return gmol_internal(q, argv, cl, action, actarg, 1);
-}
-
-/* get_end_members_of_list - this gets direct or indirect members */
-
-int get_end_members_of_list(struct query *q, char *argv[], client *cl,
-                           int (*action)(int, char *[], void *), void *actarg)
-{
-  return gmol_internal(q, argv, cl, action, actarg, 0);
-}
-
-/** gmol_internal - optimized query for retrieval of list members
- **   used by both get_members_of_list and get_end_members_of_list
- **
- ** Inputs:
- **   argv[0] - list_id
- **
- ** Description:
- **   - retrieve USER members, then LIST members, then STRING members
- **/
-
-int gmol_internal(struct query *q, char *argv[], client *cl,
-                 int (*action)(int, char *[], void *), void *actarg, int flag)
 {
   EXEC SQL BEGIN DECLARE SECTION;
   int list_id, direct;
-  char member_name[MAX_FIELD_WIDTH];
+  char member_name[MAX_FIELD_WIDTH], tag[STRINGS_STRING_SIZE];
   EXEC SQL END DECLARE SECTION;
-  char *targv[2];
+  char *targv[3];
+  int targc;
 
-  /* true/false flag indicates whether to display only direct members. */
-  if (flag)
+  /* For gmol or gtml, only get direct members. For geml, get all. */
+  if (!strcmp(q->shortname, "geml"))
+    direct = -1;
+  else
     direct = 0;
+
+  /* For gmol or geml, only return type and name. For gtml, return tag too. */
+  if (!strcmp(q->shortname, "gtml"))
+    targc = 3;
   else
-    direct = -1;
+    targc = 2;
 
   list_id = *(int *)argv[0];
 
   targv[1] = member_name;
+  targv[2] = tag;
+
   targv[0] = "USER";
   EXEC SQL DECLARE csr119 CURSOR FOR
-    SELECT u.login FROM users u, imembers im
+    SELECT u.login, s.string FROM users u, imembers im, strings s
     WHERE im.list_id = :list_id AND im.member_type = 'USER'
     AND im.member_id = u.users_id AND im.direct > :direct
-    ORDER BY 1;
+    AND s.string_id = im.tag ORDER BY 1;
   if (dbms_errno)
     return mr_errcode;
   EXEC SQL OPEN csr119;
@@ -938,10 +919,10 @@ int gmol_internal(struct query *q, char *argv[], client *cl,
     return mr_errcode;
   while (1)
     {
-      EXEC SQL FETCH csr119 INTO :member_name;
+      EXEC SQL FETCH csr119 INTO :member_name, :tag;
       if (sqlca.sqlcode)
        break;
-      (*action)(2, targv, actarg);
+      (*action)(targc, targv, actarg);
     }
   EXEC SQL CLOSE csr119;
   if (dbms_errno)
@@ -949,10 +930,10 @@ int gmol_internal(struct query *q, char *argv[], client *cl,
 
   targv[0] = "LIST";
   EXEC SQL DECLARE csr120 CURSOR FOR
-    SELECT l.name FROM list l, imembers im
+    SELECT l.name, s.string FROM list l, imembers im, strings s
     WHERE im.list_id = :list_id AND im.member_type = 'LIST'
     AND im.member_id = l.list_id AND im.direct > :direct
-    ORDER BY 1;
+    AND s.string_id = im.tag ORDER BY 1;
   if (dbms_errno)
     return mr_errcode;
   EXEC SQL OPEN csr120;
@@ -960,10 +941,10 @@ int gmol_internal(struct query *q, char *argv[], client *cl,
     return mr_errcode;
   while (1)
     {
-      EXEC SQL FETCH csr120 INTO :member_name;
+      EXEC SQL FETCH csr120 INTO :member_name, :tag;
       if (sqlca.sqlcode)
        break;
-      (*action)(2, targv, actarg);
+      (*action)(targc, targv, actarg);
     }
   EXEC SQL CLOSE csr120;
   if (dbms_errno)
@@ -971,10 +952,10 @@ int gmol_internal(struct query *q, char *argv[], client *cl,
 
   targv[0] = "STRING";
   EXEC SQL DECLARE csr121 CURSOR FOR
-    SELECT str.string FROM strings str, imembers im
+    SELECT str.string, s.string FROM strings str, imembers im, strings s
     WHERE im.list_id = :list_id AND im.member_type = 'STRING'
     AND im.member_id = str.string_id AND im.direct > :direct
-    ORDER BY 1;
+    AND s.string_id = im.tag ORDER BY 1;
   if (dbms_errno)
     return mr_errcode;
   EXEC SQL OPEN csr121;
@@ -982,10 +963,10 @@ int gmol_internal(struct query *q, char *argv[], client *cl,
     return mr_errcode;
   while (1)
     {
-      EXEC SQL FETCH csr121 INTO :member_name;
+      EXEC SQL FETCH csr121 INTO :member_name, :tag;
       if (sqlca.sqlcode)
        break;
-      (*action)(2, targv, actarg);
+      (*action)(targc, targv, actarg);
     }
   EXEC SQL CLOSE csr121;
   if (dbms_errno)
@@ -993,11 +974,10 @@ int gmol_internal(struct query *q, char *argv[], client *cl,
 
   targv[0] = "KERBEROS";
   EXEC SQL DECLARE csr122 CURSOR FOR
-    SELECT str.string FROM strings str, imembers im
+    SELECT str.string, s.string FROM strings str, imembers im, strings s
     WHERE im.list_id = :list_id AND im.member_type = 'KERBEROS'
-    AND im.member_id = str.string_id
-    AND im.direct > :direct
-    ORDER BY 1;
+    AND im.member_id = str.string_id AND im.direct > :direct
+    AND s.string_id = im.tag ORDER BY 1;
   if (dbms_errno)
     return mr_errcode;
   EXEC SQL OPEN csr122;
@@ -1005,10 +985,10 @@ int gmol_internal(struct query *q, char *argv[], client *cl,
     return mr_errcode;
   while (1)
     {
-      EXEC SQL FETCH csr122 INTO :member_name;
+      EXEC SQL FETCH csr122 INTO :member_name, :tag;
       if (sqlca.sqlcode)
        break;
-      (*action)(2, targv, actarg);
+      (*action)(targc, targv, actarg);
     }
   EXEC SQL CLOSE csr122;
   if (dbms_errno)
index 19861306baf6a1a8a9fcc42a938b0535141b2f3a..fb7d7b30c51f40b7fe41021e0ba7a4000e7994ba 100644 (file)
@@ -1051,10 +1051,15 @@ static char *amtl_fields[] = {
   "list_name", "member_type", "member_name",
 };
 
+static char *atml_fields[] = {
+  "list_name", "member_type", "member_name", "tag",
+};
+
 static struct valobj amtl_valobj[] = {
   {V_ID, 0, LIST_TABLE, "name", "list_id", MR_LIST},
   {V_TYPE, 1, 0, "member", 0, MR_TYPE},
   {V_TYPEDATA, 2, 0, 0, 0, MR_NO_MATCH},
+  {V_ID, 3, STRINGS_TABLE, "string", "string_id", MR_NO_MATCH},
 };
 
 static struct validate amtl_validate =
@@ -1070,6 +1075,32 @@ static struct validate amtl_validate =
   add_member_to_list,
 };
 
+static struct validate atml_validate =
+{
+  amtl_valobj,
+  4,
+  0,
+  0,
+  0,
+  0,
+  access_list,
+  0,
+  add_member_to_list,
+};
+
+static struct validate tmol_validate =
+{
+  amtl_valobj,
+  4,
+  "tag",
+  "list_id = %d AND member_type = '%s' AND member_id = %d",
+  3,
+  0,
+  access_list,
+  0,
+  0,
+};
+
 static struct validate dmfl_validate =
 {
   amtl_valobj,
@@ -1135,19 +1166,12 @@ static char *gmol_fields[] = {
   "member_type", "member_name",
 };
 
-static struct validate gmol_validate = {
-  VOlist0,
-  1,
-  0,
-  0,
-  0,
-  0,
-  access_visible_list,
-  0,
-  get_members_of_list,
+static char *gtml_fields[] = {
+  "list_name",
+  "member_type", "member_name", "tag",
 };
 
-static struct validate geml_validate = {
+static struct validate gmol_validate = {
   VOlist0,
   1,
   0,
@@ -1156,7 +1180,7 @@ static struct validate geml_validate = {
   0,
   access_visible_list,
   0,
-  get_end_members_of_list,
+  get_members_of_list,
 };
 
 static char *glom_fields[] = {
@@ -1927,13 +1951,13 @@ static char *azcl_fields[] = {
 
 static struct valobj azcl_valobj[] = {
   {V_CHAR, 0, ZEPHYR_TABLE, "class"},
-  {V_TYPE, 1, 0, "ace_type", 0, MR_ACE},
+  {V_TYPE, 1, 0, "zace_type", 0, MR_ACE},
   {V_TYPEDATA, 2, 0, 0, "list_id", MR_ACE},
-  {V_TYPE, 3, 0, "ace_type", 0, MR_ACE},
+  {V_TYPE, 3, 0, "zace_type", 0, MR_ACE},
   {V_TYPEDATA, 4, 0, 0, "list_id", MR_ACE},
-  {V_TYPE, 5, 0, "ace_type", 0, MR_ACE},
+  {V_TYPE, 5, 0, "zace_type", 0, MR_ACE},
   {V_TYPEDATA, 6, 0, 0, "list_id", MR_ACE},
-  {V_TYPE, 7, 0, "ace_type", 0, MR_ACE},
+  {V_TYPE, 7, 0, "zace_type", 0, MR_ACE},
   {V_TYPEDATA, 8, 0, 0, "list_id", MR_ACE},
 };
 
@@ -1957,13 +1981,13 @@ static char *uzcl_fields[] = {
 static struct valobj uzcl_valobj[] = {
   {V_NAME, 0, ZEPHYR_TABLE, "class", 0, MR_BAD_CLASS},
   {V_RENAME, 1, ZEPHYR_TABLE, "class", 0, MR_NOT_UNIQUE},
-  {V_TYPE, 2, 0, "ace_type", 0, MR_ACE},
+  {V_TYPE, 2, 0, "zace_type", 0, MR_ACE},
   {V_TYPEDATA, 3, 0, 0, "list_id", MR_ACE},
-  {V_TYPE, 4, 0, "ace_type", 0, MR_ACE},
+  {V_TYPE, 4, 0, "zace_type", 0, MR_ACE},
   {V_TYPEDATA, 5, 0, 0, "list_id", MR_ACE},
-  {V_TYPE, 6, 0, "ace_type", 0, MR_ACE},
+  {V_TYPE, 6, 0, "zace_type", 0, MR_ACE},
   {V_TYPEDATA, 7, 0, 0, "list_id", MR_ACE},
-  {V_TYPE, 8, 0, "ace_type", 0, MR_ACE},
+  {V_TYPE, 8, 0, "zace_type", 0, MR_ACE},
   {V_TYPEDATA, 9, 0, 0, "list_id", MR_ACE},
 };
 
@@ -2032,6 +2056,52 @@ static struct validate asha_validate =
   set_modtime_by_id,
 };
 
+static char *gacl_fields[] = {
+  "machine", "target",
+  "machine", "target", "kind", "list",
+};
+
+static char *aacl_fields[] = {
+  "machine", "target", "kind", "list",
+};
+
+static char *dacl_fields[] = {
+  "machine", "target",
+};
+
+static struct valobj aacl_valobj[] = {
+  {V_ID, 0, MACHINE_TABLE, "name", "mach_id", MR_MACHINE},
+  {V_CHAR, 1, ACL_TABLE, "target"},
+  {V_TYPE, 2, 0, "acl_kind", 0, MR_TYPE},
+  {V_ID, 3, LIST_TABLE, "name", "list_id", MR_LIST},
+};
+
+static struct validate gacl_validate =
+{
+  aacl_valobj,
+  1,
+  NULL,
+  NULL,
+  0,
+  "mach_id",
+  /* access_acl */ 0,
+  0,
+  0,
+};
+
+static struct validate aacl_validate =
+{
+  aacl_valobj,
+  4,
+  "mach_id",
+  "mach_id = %d AND target = '%s'",
+  2,
+  "mach_id",
+  /* access_acl */ 0,
+  0,
+  0,
+};
+
 static char *gsvc_fields[] = {
   "service",
   "service", "protocol", "port", "description", "modtime", "modby", "modwith",
@@ -3401,6 +3471,38 @@ struct query Queries2[] = {
     &amtl_validate,
   },
 
+  {
+    /* Q_ATML - ADD_TAGGED_MEMBER_TO_LIST */
+    "add_tagged_member_to_list",
+    "atml",
+    APPEND,
+    0,
+    IMEMBERS_TABLE,
+    0,
+    atml_fields,
+    4,
+    NULL,
+    0,
+    NULL,
+    &atml_validate,
+  },
+
+  {
+    /* Q_TMOL - TAG_MEMBER_OF_LIST */
+    "tag_member_of_list",
+    "tmol",
+    UPDATE,
+    "im",
+    IMEMBERS_TABLE,
+    "imembers SET tag = %d",
+    atml_fields,
+    1,
+    "list_id = %d AND member_type = '%s' and member_id = %d",
+    3,
+    NULL,
+    &tmol_validate,
+  },
+
   {
     /* Q_DMFL - DELETE_MEMBER_FROM_LIST */
     "delete_member_from_list",
@@ -3478,7 +3580,23 @@ struct query Queries2[] = {
     NULL,
     1,
     NULL,
-    &geml_validate,
+    &gmol_validate,
+  },
+
+  {
+    /* Q_GTML - GET_TAGGED_MEMBERS_OF_LIST */
+    "get_tagged_members_of_list",
+    "gtml",
+    RETRIEVE,
+    NULL,
+    IMEMBERS_TABLE,
+    NULL,
+    gtml_fields,
+    3,
+    NULL,
+    1,
+    NULL,
+    &gmol_validate,
   },
 
   {
@@ -4329,6 +4447,54 @@ struct query Queries2[] = {
     &VDmach,
   },
 
+  {
+    /* Q_GACL - GET_ACL */
+    "get_acl",
+    "gacl",
+    RETRIEVE,
+    "ac",
+    ACL_TABLE,
+    "m.name, ac.target, ac.kind, l.name FROM acl ac, machine m, list l",
+    gacl_fields,
+    4,
+    "m.mach_id = %d AND m.mach_id = ac.mach_id AND ac.target LIKE '%s' AND l.list_id = ac.list_id",
+    2,
+    "m.name, ac.target, ac.kind",
+    &gacl_validate,
+  },
+
+  {
+    /* Q_AACL - ADD_ACL */
+    "add_acl",
+    "aacl",
+    APPEND,
+    "ac",
+    ACL_TABLE,
+    "INTO acl (mach_id, target, kind, list_id) VALUES (%d, '%s', '%s', %d)",
+    aacl_fields,
+    4,
+    0,
+    0,
+    NULL,
+    &aacl_validate,
+  },
+
+  {
+    /* Q_DACL - DELETE_ACL */
+    "delete_acl",
+    "dacl",
+    DELETE,
+    "ac",
+    ACL_TABLE,
+    0,
+    dacl_fields,
+    0,
+    "mach_id = %d AND target = '%s'",
+    2,
+    NULL,
+    &gacl_validate,
+  },
+
   {
     /* Q_GSVC - GET_SERVICE */
     "get_service",
index 205646ec332224942d887143b686542fec57a1f7..29a66897cb603466732fb971f8a869205e830cb8 100644 (file)
@@ -422,7 +422,7 @@ int validate_typedata(struct query *q, char *argv[], struct valobj *vo)
       else if (status)
        return status;
     }
-  else if (!strcmp(data_type, "none"))
+  else if (!strcmp(data_type, "none") || !strcmp(data_type, "all"))
     id = 0;
   else
     return MR_TYPE;
This page took 0.126265 seconds and 5 git commands to generate.