diff options
Diffstat (limited to 'kasetkey')
-rw-r--r-- | kasetkey/kasetkey.c | 66 |
1 files changed, 64 insertions, 2 deletions
diff --git a/kasetkey/kasetkey.c b/kasetkey/kasetkey.c index f225e27..0e5878f 100644 --- a/kasetkey/kasetkey.c +++ b/kasetkey/kasetkey.c @@ -50,7 +50,8 @@ char *o_admin = NULL; /* name of ADMIN user to use */ char *o_pass = NULL; /* password to use (else random or prompted) */ char *o_srvtab = NULL; /* srvtab file to generate */ char *o_service = NULL; /* service to create */ -char *o_k5srvtab = NULL; /* converted keytab from K5*/ +char *o_delete = NULL; /* service to delete */ +char *o_k5srvtab = NULL; /* converted keytab from K5 */ int main(int argc, char *argv[]) @@ -67,7 +68,7 @@ main(int argc, char *argv[]) if (!local_cell || code) crash_and_burn("can't initialize"); /* for production, remove the -d debugging option*/ - while ((c = getopt(argc, argv, "a:hk:is:p:f:rdvc:")) != EOF) { + while ((c = getopt(argc, argv, "a:hk:is:p:f:rdD:vc:")) != EOF) { switch(c) { case 'k': o_keyfile = optarg; break; case 'i': o_init = 1; break; @@ -78,6 +79,7 @@ main(int argc, char *argv[]) case 's': o_service = optarg; break; case 'd': o_debug = 1; break; case 'c': o_k5srvtab = optarg; break; + case 'D': o_delete = optarg; break; case 'v': fprintf(stderr,"%s: version %s\n",prog,VERSION); exit(0); case 'h': default: usage(); /* usage doesn't return */ @@ -89,6 +91,7 @@ main(int argc, char *argv[]) if (o_init) do_init_key_file(); else if (o_service) do_service(); + else if (o_delete) do_delete(); else usage(); return 0; @@ -136,6 +139,65 @@ do_init_key_file(void) } void +do_delete(void) +{ + struct ktc_encryptionKey key; + struct ktc_token token; + struct ubik_client *conn; + long code; + char name[MAXKTCNAMELEN]; + char inst[MAXKTCNAMELEN]; + char cell[MAXKTCNAMELEN]; + + if (!o_admin) o_admin = (char*)getlogin(); + + code = ka_ParseLoginName(o_admin, name, inst, cell); + if (o_debug) printf("ka_ParseLoginName %ld\n",code); + if (code) crash_and_burn("can't parse admin name"); + if (cell[0]=='\0') strcpy(cell, local_cell); + + if (o_keyfile) { + int kfd; + kfd = open(o_keyfile, O_RDONLY, 0); + if (kfd == -1) errno_crash_and_burn("can't open keyfile"); + if (read(kfd, &key, sizeof(key)) != sizeof(key)) { + errno_crash_and_burn("can't read keyfile"); + } + close(kfd); + } else { + char buffer[MAXKTCNAMELEN*3+40]; + sprintf(buffer,"password for %s: ",o_admin); + code = ka_ReadPassword(buffer, 0, cell, &key); + if (code) crash_and_burn("can't read password"); + } + + code = ka_GetAdminToken(name, inst, cell, &key, 300, &token, 1); + memset((char*)&key, 0, sizeof(key)); + if (o_debug) printf("ka_GetAdminToken %ld\n",code); + if (code) crash_and_burn("can't get admin token"); + + /* make connection to AuthServer */ + code = ka_AuthServerConn(cell, KA_MAINTENANCE_SERVICE, &token, &conn); + if (o_debug) printf("ka_AuthServerConn %ld\n",code); + if (code) crash_and_burn("can't make connection to auth server"); + + /* do a similar dance on the service principal and key */ + code = ka_ParseLoginName(o_service, name, inst, cell); + if (o_debug) printf("ka_ParseLoginName %ld\n",code); + if (code) crash_and_burn("can't parse service name"); + if (cell[0]=='\0') strcpy(cell, local_cell); + + /* delete the user */ + code = ubik_Call (KAM_DeleteUser, conn, 0, name, inst); + if (o_debug) printf("ubik_Call KAM_DeleteUser %ld\n",code); + if (code && code != KANOENT) + crash_and_burn("can't delete existing instance"); + + code = ubik_ClientDestroy (conn); + exit(0); +} + +void do_service(void) { struct ktc_encryptionKey key; |