This modification causes ceod to add the Kerberos principal.
[mspang/pyceo.git] / src / kadm.c
1 #include <kadm5/admin.h>
2
3 #include "kadm.h"
4 #include "krb5.h"
5 #include "util.h"
6 #include "config.h"
7
8 extern char *prog;
9
10 static void *handle;
11
12 void ceo_kadm_init() {
13     krb5_error_code retval;
14     kadm5_config_params params;
15     memset((void *) &params, 0, sizeof(params));
16
17     debug("kadmin: initializing using keytab for %s", krb5_admin_principal);
18
19     retval = kadm5_init_with_skey(
20 #ifdef KADM5_API_VERSION_3
21         context,
22 #endif
23         krb5_admin_principal, NULL,
24         KADM5_ADMIN_SERVICE, &params, KADM5_STRUCT_VERSION,
25         KADM5_API_VERSION_2, NULL, &handle);
26     if (retval || !handle) {
27         com_err(prog, retval, "while initializing kadm5");
28         exit(1);
29     }
30 }
31
32 void ceo_kadm_cleanup() {
33     debug("kadmin: cleaning up");
34     kadm5_destroy(handle);
35 }
36
37 int ceo_add_princ(char *user, char *password) {
38     krb5_error_code retval;
39
40     debug("kadmin: adding principal %s", user);
41
42     // Added March 2012: Change behavior of ceod to add the kerberos principal.
43     kadm5_policy_ent_rec defpol;
44     kadm5_principal_ent_rec princ;
45
46     memset((void*) &princ, 0, sizeof(princ));
47
48     if ((retval = kadm5_get_policy(handle, "default", &defpol))) {
49         com_err(prog, retval, "while retrieving default policy");
50         return retval;
51     }
52     kadm5_free_policy_ent(handle, &defpol);
53
54     princ.policy = "default";
55
56     if ((retval = krb5_parse_name(context, user, &princ.principal))) {
57         com_err(prog, retval, "while parsing user name");
58         return retval;
59     }
60
61     long flags = KADM5_POLICY | KADM5_PRINCIPAL;
62     if ((retval = kadm5_create_principal(handle, &princ, flags, password))) {
63         if(retval == KADM5_DUP) {
64             if ((retval = kadm5_chpass_principal(handle, princ.principal, password))) {
65                 com_err(prog, retval, "while setting principal password");
66                 return retval;
67             }
68         } else {
69             com_err(prog, retval, "while creating principal");
70             return retval;
71         }
72     }
73
74     krb5_free_principal(context, princ.principal);
75     return 0;
76 }
77
78 int ceo_del_princ(char *user) {
79     krb5_error_code retval;
80     krb5_principal princ;
81
82     debug("kadmin: deleting principal %s", user);
83
84     if ((retval = krb5_parse_name(context, user, &princ))) {
85         com_err(prog, retval, "while parsing principal name");
86         return retval;
87     }
88
89     retval = kadm5_delete_principal(handle, princ);
90     if (retval && retval != KADM5_UNK_PRINC) {
91         com_err(prog, retval, "while deleting principal");
92         return retval;
93     }
94
95     krb5_free_principal(context, princ);
96     return 0;
97 }