#include <unistd.h>
#include <com_err.h>
+#ifdef HAVE_KRB4
#include <krb.h>
+#endif
EXEC SQL INCLUDE sqlca;
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);
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)
}
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;
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");
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;
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;
}