]> andersk Git - moira.git/blobdiff - gen/genacl.pc
Build without krb4 if it's unavailable.
[moira.git] / gen / genacl.pc
index ad5bb038ec0a95462b00d84221559d531796de8c..c4dd1d7af0c04513c929838628d893623405b344 100644 (file)
 #include <stdlib.h>
 #include <string.h>
 
+#ifdef HAVE_KRB4
 #include <krb.h>
+#else
+#include <mr_krb.h>
+#endif
+#include <krb5.h>
 
 EXEC SQL INCLUDE sqlca;
 
 RCSID("$Header$");
 
-static char defaultrealm[REALM_SZ];
+static char *defaultrealm = NULL;
 
 static struct hash *users, *strings;
 
@@ -33,9 +38,23 @@ static struct save_queue *merge_imembers(struct save_queue *sq,
 
 void init_acls(void)
 {
+  krb5_context context = NULL;
+  int code;
+
   users = create_hash(2000);
   strings = create_hash(2000);
-  krb_get_lrealm(defaultrealm, 1);
+
+  code = krb5_init_context(&context);
+  if (code)
+    goto out;
+
+  code = krb5_get_default_realm(context, &defaultrealm);
+  if (code)
+    goto out;
+
+ out:
+  if (context)
+    krb5_free_context(context);
 }
 
 void dump_krb_acl(FILE *out, char *type, int id, int vers)
@@ -65,6 +84,7 @@ void dump_krb_acl(FILE *out, char *type, int id, int vers)
 void canon_krb(struct imember *m, int vers, char *buf, int len)
 {
   char *at;
+  char kbuf[MAX_K_NAME_SZ];
 
   switch (m->type)
     {
@@ -73,29 +93,58 @@ void canon_krb(struct imember *m, int vers, char *buf, int len)
       break;
 
     case 'K':
+      /* We assume we have a krb4-style namespace.  If we want a krb5 acl, we need to
+       * krb5_425_conv_principal() on it. For krb4, do nothing special.
+       */ 
       at = strchr(m->name, '@');
       if (!at)
        at = strchr(m->name, '\0');
-      if (vers == 5)
+      snprintf(kbuf, len, "%s", m->name);
+
+      if (!*at)
        {
-         char *dot = strchr(m->name, '.');
-         if (dot && dot < at)
-           snprintf(buf, len, "%.*s/%s", dot - m->name, m->name, dot + 1);
-         else
-           snprintf(buf, len, "%s", m->name);
+         int plen = strlen(kbuf);
+         snprintf(kbuf + plen, len - plen, "@%s", defaultrealm);
        }
-      else
+
+      if (vers == 5)
        {
-         char *slash = strchr(m->name, '/');
-         if (slash && slash < at)
-           snprintf(buf, len, "%.*s.%s", slash - m->name, m->name, slash + 1);
-         else
-           snprintf(buf, len, "%s", m->name);
+         char name[ANAME_SZ] = "\0", inst[INST_SZ] = "\0", realm[REALM_SZ] = "\0";
+         char *kuser = NULL;
+         krb5_context context = NULL;
+         krb5_principal client = NULL;
+         int status = 0;
+
+         if (mr_kname_parse(name, inst, realm, kbuf) != 0)
+           goto out;
+
+         status = krb5_init_context(&context);
+         if (status)
+           goto out;
+
+         status = krb5_425_conv_principal(context, name, inst, realm, &client);
+         if (status)
+           goto out;
+
+         status = krb5_unparse_name(context, client, &kuser);
+         if (status)
+           goto out;
+
+         strncpy(buf, kuser, MAX_K_NAME_SZ);
+         buf[MAX_K_NAME_SZ - 1] = '\0';
+
+       out:
+         if (kuser)
+           krb5_free_unparsed_name(context, kuser);
+         if (client)
+           krb5_free_principal(context, client);
+         if (context)
+           krb5_free_context(context);
        }
-      if (!*at)
+      else
        {
-         int plen = strlen(buf);
-         snprintf(buf + plen, len - plen, "@%s", defaultrealm);
+         /* v4 output, and we should already have added a realm. */
+         snprintf(buf, len, "%s", kbuf);
        }
       break;
     }
This page took 0.039392 seconds and 4 git commands to generate.