+
+/* ARGSUSED */
+int
+ShowUserById(argc, argv)
+int argc;
+char *argv[];
+{
+ struct qelem *top, *elem;
+
+ elem = top = GetUserInfo(ID, argv[1], (char *) NULL);
+ Loop(elem, PrintUserInfo);
+
+ FreeQueue(top);
+ return (DM_NORMAL);
+}
+
+
+/* Function Name: GetKrbmap
+ * Description: Shows user <-> Kerberos mappings
+ * Arguments: argc, argv - argv[1] contains the user login name,
+ * argv[2] contains the principal
+ * Returns: none.
+ */
+
+/* ARGSUSED */
+int
+GetKrbmap(argc, argv)
+int argc;
+char **argv;
+{
+ int stat;
+ struct qelem *elem = NULL, *top;
+ char buf[BUFSIZ];
+
+ if ((stat = do_mr_query("get_kerberos_user_map", 2, &argv[1],
+ StoreInfo, (char *)&elem)) != 0) {
+ com_err(program_name, stat, " in GetKrbMap.");
+ return(DM_NORMAL);
+ }
+
+ top = elem = QueueTop(elem);
+ Put_message("");
+ while (elem != NULL) {
+ char **info = (char **) elem->q_data;
+ sprintf(buf, "User: %-9s Principal: %s",
+ info[KMAP_USER], info[KMAP_PRINCIPAL]);
+ Put_message(buf);
+ elem = elem->q_forw;
+ }
+
+ FreeQueue(QueueTop(top));
+ return(DM_NORMAL);
+}
+
+
+/* Function Name: AddKrbmap
+ * Description: Add a new user <-> Kerberos mapping
+ * Arguments: argc, argv - argv[1] contains the user login name,
+ * argv[2] contains the principal
+ * Returns: none.
+ */
+
+/* ARGSUSED */
+int
+AddKrbmap(argc, argv)
+int argc;
+char **argv;
+{
+ int stat;
+
+ if (!strchr(argv[KMAP_PRINCIPAL + 1], '@')) {
+ Put_message("Please specify a realm for the kerberos principal.");
+ return(DM_NORMAL);
+ }
+ if ((stat = do_mr_query("add_kerberos_user_map", 2, &argv[1],
+ Scream, NULL)) != 0) {
+ com_err(program_name, stat, " in AddKrbMap.");
+ if (stat == MR_EXISTS)
+ Put_message("No user or principal may have more than one mapping.");
+ }
+ return(DM_NORMAL);
+}
+
+
+/* Function Name: DeleteKrbmap
+ * Description: Remove a user <-> Kerberos mapping
+ * Arguments: argc, argv - argv[1] contains the user login name,
+ * argv[2] contains the principal
+ * Returns: none.
+ */
+
+/* ARGSUSED */
+int
+DeleteKrbmap(argc, argv)
+int argc;
+char **argv;
+{
+ int stat;
+
+ if ((stat = do_mr_query("delete_kerberos_user_map", 2, &argv[1],
+ Scream, NULL)) != 0) {
+ com_err(program_name, stat, " in DeleteKrbMap.");
+ }
+ return(DM_NORMAL);
+}
+
+
+/* Function Name: GetDirFlags
+ * Description: Shows MITdir listing preferences
+ * Arguments: argc, argv - argv[1] contains the user login name
+ * Returns: none.
+ */
+
+/* ARGSUSED */
+int
+GetDirFlags(argc, argv)
+int argc;
+char **argv;
+{
+ int stat, flags;
+ struct qelem *elem = NULL;
+ char buf[BUFSIZ], **info;
+
+ if (!ValidName(argv[1]))
+ return(DM_NORMAL);
+
+ if ((stat = do_mr_query("get_user_directory_flags", 1, &argv[1],
+ StoreInfo, (char *)&elem)) != 0) {
+ com_err(program_name, stat, " in GetDirFlags.");
+ return(DM_NORMAL);
+ }
+
+ info = (char **) QueueTop(elem)->q_data;
+ flags = atoi(info[0]);
+ FreeQueue(QueueTop(elem));
+
+ Put_message("");
+ sprintf(buf, "User: %s", argv[1]);
+ Put_message(buf);
+ if (flags & DIRFLAGS_SUPPRESS) {
+ Put_message("Does NOT appear in the on-line directory.");
+ } else {
+ Put_message("Does appear in the on-line directory.");
+ if (flags & DIRFLAGS_NONLOCAL) {
+ Put_message("Is listed with non-MIT.EDU email address (if known)");
+ } else {
+ Put_message("Is listed with MIT.EDU email address.");
+ }
+ }
+
+ return(DM_NORMAL);
+}
+
+/* Function Name: SetDirFlags
+ * Description: Update online directory preferences
+ * Arguments: argc, argv - the login name of the user in argv[1].
+ * Returns: DM_NORMAL.
+ */
+
+int
+SetDirFlags(argc, argv)
+int argc;
+char **argv;
+{
+ int stat, flags;
+ char **info, buf[BUFSIZ], *args[2];
+ struct qelem *elem = NULL;
+
+ if (!ValidName(argv[1]))
+ return(DM_NORMAL);
+
+ /* Fetch current prefs */
+ if ((stat = do_mr_query("get_user_directory_flags", 1, &argv[1],
+ StoreInfo, (char *)&elem)) != 0) {
+ com_err(program_name, stat, " in GetDirFlags.");
+ return(DM_NORMAL);
+ }
+ info = (char **) QueueTop(elem)->q_data;
+ flags = atoi(info[0]);
+ FreeQueue(QueueTop(elem));
+
+ sprintf(buf, "List %s in the on-line directory (y/n)", argv[1]);
+ if (YesNoQuestion(buf, !(flags & DIRFLAGS_SUPPRESS)))
+ flags &= ~DIRFLAGS_SUPPRESS;
+ else
+ flags |= DIRFLAGS_SUPPRESS;
+
+ sprintf(buf, "List MIT.EDU email address even when mail is forwarded elsewhere? (y/n)");
+ if (YesNoQuestion(buf, !(flags & DIRFLAGS_NONLOCAL)))
+ flags &= ~DIRFLAGS_NONLOCAL;
+ else
+ flags |= DIRFLAGS_NONLOCAL;
+
+ args[0] = argv[1];
+ sprintf(buf, "%d", flags);
+ args[1] = buf;
+ if ( (stat = do_mr_query("update_user_directory_flags", 2,
+ args, Scream, NULL)) != MR_SUCCESS)
+ com_err(program_name, stat, " in SetDirFlags");
+ else
+ Put_message("Directory preferences set.");
+
+ return (DM_NORMAL);
+}
+
+#ifdef DEBUG
+hex_dump(p)
+unsigned char *p;
+{
+ char buf[BUFSIZ];
+ int i;
+
+ sprintf(buf, "Size: %d", strlen(p));
+ Put_message(buf);
+ while (strlen(p) >= 8) {
+ sprintf(buf, "%02x %02x %02x %02x %02x %02x %02x %02x",
+ p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]);
+ Put_message(buf);
+ p += 8;
+ }
+ switch (strlen(p)) {
+ case 7:
+ sprintf(buf, "%02x %02x %02x %02x %02x %02x %02x",
+ p[0], p[1], p[2], p[3], p[4], p[5], p[6]);
+ break;
+ case 6:
+ sprintf(buf, "%02x %02x %02x %02x %02x %02x",
+ p[0], p[1], p[2], p[3], p[4], p[5]);
+ break;
+ case 5:
+ sprintf(buf, "%02x %02x %02x %02x %02x",
+ p[0], p[1], p[2], p[3], p[4]);
+ break;
+ case 4:
+ sprintf(buf, "%02x %02x %02x %02x",
+ p[0], p[1], p[2], p[3]);
+ break;
+ case 3:
+ sprintf(buf, "%02x %02x %02x",
+ p[0], p[1], p[2]);
+ break;
+ case 2:
+ sprintf(buf, "%02x %02x",
+ p[0], p[1]);
+ break;
+ case 1:
+ sprintf(buf, "%02x",
+ p[0]);
+ break;
+ default:
+ return;
+ }
+ Put_message(buf);
+}
+#endif