]> andersk Git - moira.git/blobdiff - reg_svr/reg_svr.pc
Command line printer manipulation client, and build goo.
[moira.git] / reg_svr / reg_svr.pc
index 4a592f80cfeebb7243ccd9a6d0f2502a2f8f3c45..947a42975f6b8efc344f282de4682456dd36c5fb 100644 (file)
@@ -33,7 +33,9 @@
 #include <unistd.h>
 
 #include <com_err.h>
+#ifdef HAVE_KRB4
 #include <krb.h>
+#endif
 
 EXEC SQL INCLUDE sqlca;
 
@@ -45,6 +47,7 @@ char *find_usernames(char *first, char *middle, char *last);
 int check_username_available(char *username);
 void fixname(char *name);
 int register_user(int uid, char *username);
+int update_user_status(char *username, int account_status);
 void mr_com_err(const char *whoami, long code, const char *fmt, va_list pvar);
 void sigshut(int);
 
@@ -714,6 +717,7 @@ void PSWD(reg_client *rc, int argc, char **argv)
   char *password = argv[0], *p;
   EXEC SQL BEGIN DECLARE SECTION;
   char *login = rc->username;
+  char potype[USERS_POTYPE_SIZE];
   EXEC SQL END DECLARE SECTION;
 
   if (!rc->username || rc->id || argc != 1)
@@ -773,21 +777,68 @@ void PSWD(reg_client *rc, int argc, char **argv)
     }
   
   if (rc->user_status == US_NO_LOGIN_YET_KERBEROS_ONLY)
-    EXEC SQL UPDATE users SET status = 9 WHERE login = :login;
+    status = update_user_status(rc->username, US_REGISTERED_KERBEROS_ONLY);
   else
-    EXEC SQL UPDATE users SET status = 1 WHERE login = :login;
-  EXEC SQL COMMIT;
+    status = update_user_status(rc->username, US_REGISTERED);
 
-  reply(rc, DONE, "INIT", "c", NULL, rc->username);
+  if (status)
+    {
+      reply(rc, INTERNAL_ERROR, "INIT", "c", NULL,
+           error_message(status));
+      return;
+    }
+
+  EXEC SQL SELECT potype INTO :potype FROM users WHERE login = :login;
+  if (!strcmp(potype, "EXCHANGE"))
+    reply(rc, DONE, "INIT", "c", NULL, rc->username, "http://owa.mit.edu");
+  else
+    reply(rc, DONE, "INIT", "c", NULL, rc->username, "http://webmail.mit.edu");
 }
 
 void QUIT(reg_client *rc, int argc, char **argv)
 {
 }
 
+/* Update a user's status in Moira */
+int update_user_status(char *username, int account_status)
+{
+  char statusbuf[2], *qargv[2], *motd = NULL;
+  long status;
+
+  status = mr_connect(hostname);
+  if (status)
+    return status;
+
+  status = mr_motd(&motd);
+  if (status || motd)
+    {
+      mr_disconnect();
+      return MR_DOWN;
+    }
+
+  status = mr_krb5_auth("reg_svr");
+  if (status)
+    {
+      com_err(whoami, status, "authenticating to moira");
+      mr_disconnect();
+      return MR_INTERNAL;
+    }
+
+  sprintf(statusbuf, "%d", account_status);
+  qargv[0] = username;
+  qargv[1] = statusbuf;
+
+  status = mr_query("update_user_status", 2, qargv, NULL, NULL);
+  mr_disconnect();
+  return status;
+}
+
 /* Register a user in Moira */
 int register_user(int uid, char *username)
 {
+  EXEC SQL BEGIN DECLARE SECTION;
+  char class[USERS_TYPE_SIZE];
+  EXEC SQL END DECLARE SECTION;
   char uidbuf[10], *qargv[3], *motd = NULL;
   long status;
 
@@ -802,13 +853,7 @@ int register_user(int uid, char *username)
       return MR_DOWN;
     }
 
-  status = krb_get_svc_in_tkt(REG_SVR_PRINCIPAL, REG_SVR_INSTANCE,
-                             krb_realmofhost(hostname), MOIRA_SNAME,
-                             shorthostname, 1, KEYFILE);
-  if (status)
-    status += ERROR_TABLE_BASE_krb;
-  else
-    status = mr_auth("reg_svr");
+  status = mr_krb5_auth("reg_svr");
   if (status)
     {
       com_err(whoami, status, "authenticating to moira");
@@ -816,10 +861,28 @@ int register_user(int uid, char *username)
       return MR_INTERNAL;
     }
 
+  EXEC SQL SELECT type INTO :class FROM users WHERE unix_uid = :uid;
+
   sprintf(uidbuf, "%d", uid);
   qargv[0] = uidbuf;
   qargv[1] = username;
-  qargv[2] = "IMAP";
+
+  /* Incoming students should be given Exchange poboxes.
+   * Doesn't work for undergrads in the class of 2100 or higher.
+   */ 
+  if (!strcmp(strtrim(class), "G") || !strncmp(class, "FALL", 4) ||
+      !strncmp(class, "SPRING", 5) || !strncmp(class, "SUMMER", 6) ||
+      !strncmp(class, "20", 2))
+    {
+      com_err(whoami, 0, "assigning EXCHANGE pobox to user %s, class %s", username, class);
+      qargv[2] = "EXCHANGE";
+    }
+  else 
+    {
+      com_err(whoami, 0, "assigning IMAP pobox to user %s, class %s", username, class);
+      qargv[2] = "IMAP";
+    }
+
   status = mr_query("register_user", 3, qargv, NULL, NULL);
   mr_disconnect();
   return status;
@@ -985,6 +1048,13 @@ int check_username_available(char *username)
   if (count != 0)
     return MR_IN_USE;
 
+  EXEC SQL SELECT COUNT(login) INTO :count FROM userhistory
+    WHERE login = :username;
+  if (sqlca.sqlcode)
+    return MR_DBMS_ERR;
+  if (count != 0)
+    return MR_IN_USE;
+
   return MR_SUCCESS;
 }
 
This page took 0.032277 seconds and 4 git commands to generate.