6 #include <moira_site.h>
9 #include <sys/socket.h>
10 #include <netinet/in.h>
20 /* Called with moira data that is to be modified. */
22 int ModifyCallback(argc, argv, form)
33 switch (form->menu->operation) {
36 f = GetAndClearForm("mod_user");
38 display_error("Unknown form in ModifyCallback!\n");
41 f->extrastuff = form->extrastuff;
43 for (i = 0; i < U_SIGNATURE; i++)
44 if (f->inputlines[i]->type == FT_BOOLEAN)
45 f->inputlines[i]->returnvalue.booleanvalue =
46 strcmp(argv[i + offset], "0") ? 1 : 0;
48 StoreField(f, i, argv[i + offset]);
49 f->inputlines[U_SIGNATURE]->keyword_name = strsave(argv[U_SIGNATURE]);
50 f->inputlines[U_SIGNATURE]->returnvalue.booleanvalue =
51 strcmp(argv[U_SECURE], "0") ? 1 : 0;
52 f->inputlines[U_COMMENT]->keyword_name = strsave(argv[U_SECURE]);
56 count = F_MODTIME - 1;
61 form->extrastuff = NULL;
63 form->extrastuff = strsave(argv[U_UID]);
75 f = GetAndClearForm("mod_nfs");
77 display_error("Unknown form in ModifyCallback of mod_nfs\n");
80 f->extrastuff = form->extrastuff;
82 StoreField(f, 0, argv[0]);
83 StoreField(f, 1, argv[1]);
84 StoreField(f, 2, argv[2]);
85 f->inputlines[3]->keywords = nfs_states;
86 for (i = 0; nfs_states[i]; i++)
87 if ((atoi(nfs_states[i]) & ~MR_FS_GROUPQUOTA) == atoi(argv[3]))
88 StoreField(f, 3, nfs_states[i]);
89 StoreField(f, 3, argv[3]);
90 if (atoi(argv[3]) && MR_FS_GROUPQUOTA)
91 f->inputlines[4]->returnvalue.booleanvalue = 1;
92 StoreField(f, 5, argv[4]);
93 StoreField(f, 6, argv[5]);
106 f = GetAndClearForm(fn);
108 display_error("Unknown form in ModifyCallback!\n");
111 f->extrastuff = form->extrastuff;
112 f->menu = form->menu;
113 for (i = 0; i < count; i++)
114 if (f->inputlines[i]->type == FT_BOOLEAN)
115 f->inputlines[i]->returnvalue.booleanvalue =
116 strcmp(argv[i + offset], "0") ? 1 : 0;
118 StoreField(f, i, argv[i + offset]);
120 display_error("Unknown function in ModifyCallback!\n");
126 /* Generate a new cryptographic signature for the user record */
127 SignUser(argv, offset)
136 if (strcmp(argv[U_NAME + offset], UNIQUE_LOGIN)) {
137 sprintf(buf, "%s:%s", argv[U_NAME + offset], argv[U_MITID + offset]);
139 i = GDSS_Verify(buf, strlen(buf), argv[U_SIGNATURE + offset], &si);
140 /* If it's already signed OK, don't resign it. */
141 if (i != GDSS_SUCCESS) {
142 free(argv[U_SIGNATURE + offset]);
143 argv[U_SIGNATURE + offset] = (char *) malloc(GDSS_Sig_Size() * 2);
145 i = GDSS_Sign(buf, strlen(buf), argv[U_SIGNATURE + offset]);
146 if (i != GDSS_SUCCESS)
147 com_err(program_name, gdss2et(i),
148 "Failed to create signature");
150 unsigned char newbuf[256];
152 i = GDSS_Verify(buf, strlen(buf),
153 argv[U_SIGNATURE + offset], &si);
154 if (strlen(newbuf) > 68) {
156 AppendLog("Signature too long, trying again\n");
162 AppendLog("Made signature:");hex_dump(argv[U_SIGNATURE + offset]);
164 AppendLog("Don't need to remake signature\n");
169 argv[U_SIGNATURE + offset] = strsave("");
174 /* when OK pressed */
176 MoiraFormComplete(dummy1, form)
180 process_form(form, TRUE);
184 /* when APPLY pressed */
186 MoiraFormApply(dummy1, form)
193 /* undocumented Motif internal routine to advance in tab group.
194 * In this case we're going backwards because for some reason
195 * the form advances whenever this button is pressed.
196 * However, it doesn't seem to go backwards even though source
197 * implies that it should. So we go forward until we wrap.
200 for (p = form->inputlines; *p; p++)
203 _XmMgrTraversal(form->formpointer, XmTRAVERSE_PREV_TAB_GROUP);
204 process_form(form, FALSE);
208 int CollectData(argc, argv, form)
213 struct save_queue *sq;
215 sq = (struct save_queue *) form->extrastuff;
216 sq_save_data(sq, strsave(argv[0]));
221 /* callback when form is complete to process the data */
223 process_form(form, remove)
227 char *qy, *argv[32], buf[256], *s, **aargv;
228 int (*retfunc)(), argc, i;
231 retfunc = DisplayCallback;
234 for (i = 0; form->inputlines[i]; i++)
235 argv[i] = StringValue(form, i);
236 qy = form->menu->query;
237 argc = form->menu->argc;
239 switch (form->menu->operation) {
241 if (*stringval(form, 0)) {
242 qy = "get_user_account_by_login";
243 argv[0] = stringval(form, 0);
245 } else if (*stringval(form, 3)) {
246 qy = "get_user_account_by_uid";
247 argv[0] = stringval(form, 3);
249 } else if (*stringval(form, 4)) {
250 qy = "get_user_account_by_class";
251 argv[0] = stringval(form, 4);
253 } else if (*stringval(form, 1) == 0 &&
254 *stringval(form, 2) == 0) {
255 display_error("Must fill in at least one blank.");
258 if (*stringval(form, 1) == 0)
259 StoreField(form, 1, "*");
260 if (*stringval(form, 2) == 0)
261 StoreField(form, 2, "*");
262 qy = "get_user_account_by_name";
263 argv[0] = stringval(form, 1);
264 argv[1] = stringval(form, 2);
269 argv[U_STATE][1] = 0;
270 argv[U_SECURE] = argv[U_SIGNATURE];
275 if (!strcmp(form->formname, "mod_user")) {
276 qy = "update_user_account";
277 for (i = 0; i < U_SIGNATURE; i++)
278 argv[i + 1] = StringValue(form, i);
279 argv[0] = form->extrastuff;
280 argv[U_STATE + 1][1] = 0;
281 argv[U_SIGNATURE + 1] = form->inputlines[U_SIGNATURE]->keyword_name;
282 argv[U_SECURE + 1] = StringValue(form, U_SIGNATURE);
283 if (*argv[U_SECURE + 1] == '1')
284 if (atoi(form->inputlines[U_COMMENT]->keyword_name))
285 argv[U_SECURE + 1] = form->inputlines[U_COMMENT]->keyword_name;
289 gettimeofday(&tv, NULL);
290 printf("Got %ld, %ld\n", tv.tv_sec, tv.tv_usec);
291 sprintf(buf, "%ld", tv.tv_sec);
292 argv[U_SECURE + 1] = strsave(buf);
295 argc = U_MODTIME + 1;
298 form->extrastuff = (caddr_t) "mod_user";
299 retfunc = ModifyCallback;
302 if (*stringval(form, 2)) {
303 argv[0] = stringval(form, 2);
305 argv[0] = stringval(form, 0);
306 argv[1] = stringval(form, 1);
307 form->extrastuff = NULL;
308 i = MoiraQuery("get_user_account_by_name", 2, argv,
309 ModifyCallback, (char *)form);
311 com_err(program_name, i, " looking up user by name");
314 if (form->extrastuff == NULL) {
315 display_error("Ambiguous user specification");
318 argv[0] = (char *)form->extrastuff;
320 qy = "register_user";
321 argv[1] = stringval(form, 3);
329 display_error("Expunge is not yet implemented");
333 if (!strcmp(form->formname, "mod_finger")) {
334 qy = "update_finger_by_login";
335 for (i = 0; i < F_MODTIME - 1; i++)
336 argv[i + 1] = StringValue(form, i);
337 argv[0] = form->extrastuff;
341 form->extrastuff = (caddr_t) "mod_finger";
342 retfunc = ModifyCallback;
345 if (!*stringval(form, 0))
347 if (!*stringval(form, 1))
351 if (!strcmp(argv[1], "POP"))
352 argv[2] = stringval(form, 3);
354 case MM_SHOW_ACE_USE:
355 if (boolval(form, 2)) {
356 sprintf(buf, "R%s", stringval(form, 0));
361 if (!strcmp(form->formname, "mod_list")) {
363 for (i = 0; i < L_MODTIME; i++)
364 argv[i + 1] = StringValue(form, i);
365 argv[0] = form->extrastuff;
366 argc = L_MODTIME + 1;
369 form->extrastuff = (caddr_t) "mod_list";
370 retfunc = ModifyCallback;
372 case MM_SHOW_MEMBERS:
373 if (!*stringval(form, 0)) {
374 qy = "get_lists_of_member";
375 argv[0] = stringval(form, 1);
376 sprintf(buf, "Lists of %s %s:\n", stringval(form, 1), argv[2]);
378 if (boolval(form, 3)) {
379 sprintf(buf, "R%s", stringval(form, 1));
382 argv[1] = stringval(form, 2);
385 sprintf(buf, "Members of list: %s\n", argv[0]);
389 case MM_DEL_ALL_MEMBER:
390 form->extrastuff = (caddr_t) sq_create();
391 retfunc = CollectData;
394 if (*stringval(form, 0)) {
395 qy = "get_filesys_by_label";
396 argv[0] = stringval(form, 0);
398 } else if (*stringval(form, 1)) {
399 StoreHost(form, 1, &argv[0]);
400 if (*stringval(form, 2)) {
401 qy = "get_filesys_by_nfsphys";
402 argv[1] = stringval(form, 2);
405 qy = "get_filesys_by_machine";
408 } else if (*stringval(form, 3)) {
409 qy = "get_filesys_by_group";
410 argv[0] = stringval(form, 3);
413 /* fall through to */
414 case MM_SHOW_FSGROUP:
415 form->extrastuff = (caddr_t) sq_create();
418 StoreHost(form, FS_MACHINE, &argv[FS_MACHINE]);
419 if (!strcmp(stringval(form, FS_TYPE), "AFS") ||
420 !strcmp(stringval(form, FS_TYPE), "FSGROUP") ||
421 !strcmp(stringval(form, FS_TYPE), "MUL"))
422 argv[FS_MACHINE] = "\\[NONE\\]";
425 if (!strcmp(form->formname, "mod_filsys")) {
426 qy = "update_filesys";
427 for (i = 0; i < FS_MODTIME; i++)
428 argv[i + 1] = StringValue(form, i);
429 StoreHost(form, FS_MACHINE, &argv[FS_MACHINE + 1]);
430 argv[0] = form->extrastuff;
431 argc = FS_MODTIME + 1;
434 form->extrastuff = (caddr_t) "mod_filsys";
435 retfunc = ModifyCallback;
440 case MM_SHOW_FS_ALIAS:
441 case MM_ADD_FS_ALIAS:
442 case MM_DEL_FS_ALIAS:
444 argv[2] = stringval(form, 1);
447 StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
448 if (!*stringval(form, 1))
452 StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
453 sprintf(buf, "%d", atoi(stringval(form, NFS_STATUS)) +
454 (boolval(form, 4) ? MR_FS_GROUPQUOTA : 0));
455 argv[NFS_STATUS] = buf;
456 argv[NFS_ALLOC] = stringval(form, 5);
457 argv[NFS_SIZE] = stringval(form, 6);
460 StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
461 if (!strcmp(form->formname, "mod_nfs")) {
462 qy = "update_nfsphys";
466 form->extrastuff = (caddr_t) "mod_nfs";
467 retfunc = ModifyCallback;
470 StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
473 if (!*stringval(form, 0))
475 if (*stringval(form, 1)) {
477 argv[2] = stringval(form, 1);
478 } else if (*stringval(form, 2)) {
480 argv[2] = stringval(form, 2);
481 } else if (!*stringval(form, 0)) {
482 display_error("Must specify something.");
485 qy = "get_quota_by_filesys";
492 StoreHost(form, 0, &argv[0]);
495 if (!strcmp(form->formname, "mod_machine")) {
496 qy = "update_machine";
497 for (i = 0; i < M_MODTIME; i++)
498 argv[i + 1] = StringValue(form, i);
499 argv[0] = form->extrastuff;
500 argc = M_MODTIME + 1;
503 StoreHost(form, 0, &argv[0]);
504 form->extrastuff = (caddr_t) "mod_machine";
505 retfunc = ModifyCallback;
508 if (!strcmp(form->formname, "mod_cluster")) {
509 qy = "update_cluster";
510 for (i = 0; i < C_MODTIME; i++)
511 argv[i + 1] = StringValue(form, i);
512 argv[0] = form->extrastuff;
513 argc = C_MODTIME + 1;
516 form->extrastuff = (caddr_t) "mod_cluster";
517 retfunc = ModifyCallback;
520 if (!*stringval(form, 0))
523 StoreHost(form, 0, &argv[0]);
524 if (!*stringval(form, 1))
526 AppendToLog("Cluster mappings:\n");
530 StoreHost(form, 0, &argv[0]);
533 if (!*stringval(form, 1))
537 StoreHost(form, PCAP_SPOOL_HOST, &argv[PCAP_SPOOL_HOST]);
538 StoreHost(form, PCAP_QSERVER, &argv[PCAP_QSERVER]);
541 if (!write_log_to_file(stringval(form, 0)) && remove)
542 XtUnmanageChild(form->formpointer);
545 argv[0] = form->extrastuff;
547 argv[2] = StringValue(form, 0);
548 for (s = argv[2]; *s; s++)
549 if (islower(*s)) *s = toupper(*s);
554 display_error("Unknown function in form callback.\n");
557 i = MoiraQuery(qy, argc, argv, retfunc, (char *)form);
559 com_err(program_name, i, " executing database query");
564 if (form->extrastuff && (f = GetForm((char *)(form->extrastuff)))) {
565 if (form->formpointer)
566 XtUnmanageChild(form->formpointer);
567 f->extrastuff = (caddr_t) strsave(stringval(form, 0));
568 f->menu = form->menu;
571 switch (form->menu->operation) {
574 f->inputlines[U_STATE]->keywords = user_states;
575 StoreField(f, U_STATE, user_states[atoi(stringval(f, U_STATE))]);
576 GetKeywords(f, U_CLASS, "class");
578 AppendToLog("Done.\n");
583 AppendToLog("Done.\n");
587 GetKeywords(f, L_ACE_TYPE, "ace_type");
588 f->inputlines[L_GROUP]->valuechanged = MoiraValueChanged;
589 f->inputlines[L_ACE_TYPE]->valuechanged = MoiraValueChanged;
591 AppendToLog("Done.\n");
595 GetKeywords(f, FS_TYPE, "filesys");
596 sprintf(buf, "fs_access_%s", stringval(f, FS_TYPE));
597 GetKeywords(f, FS_ACCESS, buf);
598 GetKeywords(f, FS_L_TYPE, "lockertype");
599 if (!strcmp(stringval(f, FS_MACHINE), "[NONE]"))
600 StoreField(f, FS_MACHINE, "\\[NONE\\]");
601 f->inputlines[FS_TYPE]->valuechanged = MoiraValueChanged;
603 AppendToLog("Done.\n");
607 GetKeywords(f, 1, "mac_type");
609 AppendToLog("Done.\n");
613 f->inputlines[3]->keywords = nfs_states;
615 AppendToLog("Done.\n");
617 case MM_DEL_ALL_MEMBER:
618 argv[1] = StringValue(form, 0);
619 argv[2] = StringValue(form, 1);
620 while (sq_get_data(form->extrastuff, &(argv[0]))) {
621 sprintf(buf, "Delete %s %s from list %s?", StringValue(form, 0),
622 StringValue(form, 1), argv[0]);
623 if (!boolval(form, 2) ||
624 AskQuestion(buf, "If you answer yes, this member will be deleted from the named list.\n\
625 Answer no to avoid the deletion. In either case, you will continue to\n\
626 be prompted with the other lists the member belongs to.")) {
627 i = MoiraQuery("delete_member_from_list", 3, argv,
628 DisplayCallback, NULL);
630 com_err(program_name, i, " while removing member from list");
632 sprintf(buf, "Member %s %s removed from list %s.\n",
633 argv[1], argv[2], argv[0]);
639 AppendToLog("Done.\n");
642 case MM_SHOW_FSGROUP:
643 while (sq_get_data(form->extrastuff, &aargv)) {
646 sq_destroy(form->extrastuff);
654 case MM_CLEAR_SERVICE:
655 case MM_RESET_SERVICE:
679 case MM_ADD_FS_ALIAS:
680 case MM_DEL_FS_ALIAS:
695 AppendToLog("Done.\n");
698 CacheNewValue(GetForm(form->menu->form), (int) form->menu->accel,
699 form->extrastuff, StringValue(form, 0));
702 if (remove && form->formpointer)
703 XtUnmanageChild(form->formpointer);
716 int (*retfunc)(), argc, i;
719 retfunc = DisplayCallback;
725 switch (m->operation) {
726 case MM_SHOW_MAILLIST:
727 argv[0] = argv[1] = argv[3] = "TRUE";
729 argv[4] = "DONTCARE";
730 AppendToLog("Public Mailinglists:\n");
733 argv[0] = "def_quota";
736 AppendToLog("Services and Hosts with failed updates:\n");
737 argv[0] = argv[2] = "DONTCARE";
739 i = MoiraQuery("qualified_get_server", 3, argv, retfunc, NULL);
740 if (i && i != MR_NO_MATCH)
741 com_err(program_name, i, " executing database query");
743 argv[1] = argv[2] = argv[3] = argv[5] = "DONTCARE";
745 i = MoiraQuery("qualified_get_server_host", 6, argv, retfunc, NULL);
746 if (i && i != MR_NO_MATCH)
747 com_err(program_name, i, " executing database query");
751 case MM_HELP_WILDCARDS:
752 case MM_HELP_AUTHORS:
761 display_error("Unknown function in menu callback.\n");
764 i = MoiraQuery(qy, argc, argv, retfunc, (char *)&dummy);
766 com_err(program_name, i, " executing database query");