diff plugins/zephyr/ZMkAuth.c @ 1700:1e0fa7e130d0

[gaim-migrate @ 1710] Zephyr. committer: Tailor Script <tailor@pidgin.im>
author Eric Warmenhoven <eric@warmenhoven.org>
date Thu, 12 Apr 2001 09:21:16 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/zephyr/ZMkAuth.c	Thu Apr 12 09:21:16 2001 +0000
@@ -0,0 +1,103 @@
+/* This file is part of the Project Athena Zephyr Notification System.
+ * It contains source for the ZMakeAuthentication function.
+ *
+ *	Created by:	Robert French
+ *
+ *	$Source$
+ *	$Author: warmenhoven $
+ *
+ *	Copyright (c) 1987 by the Massachusetts Institute of Technology.
+ *	For copying and distribution information, see the file
+ *	"mit-copyright.h". 
+ */
+/* $Id: ZMkAuth.c 1710 2001-04-12 09:21:16Z warmenhoven $ */
+
+#include <internal.h>
+
+#ifndef lint
+static const char rcsid_ZMakeAuthentication_c[] = "$Id: ZMkAuth.c 1710 2001-04-12 09:21:16Z warmenhoven $";
+#endif
+
+#ifdef ZEPHYR_USES_KERBEROS
+#include <krb_err.h>
+static long last_authent_time = 0L;
+static KTEXT_ST last_authent;
+#endif
+
+Code_t ZResetAuthentication () {
+#ifdef ZEPHYR_USES_KERBEROS
+    last_authent_time = 0L;
+#endif
+    return ZERR_NONE;
+}
+
+Code_t ZMakeAuthentication(notice, buffer, buffer_len, len)
+    register ZNotice_t *notice;
+    char *buffer;
+    int buffer_len;
+    int *len;
+{
+#ifdef ZEPHYR_USES_KERBEROS
+    int result;
+    time_t now;
+    KTEXT_ST authent;
+    char *cstart, *cend;
+    ZChecksum_t checksum;
+    CREDENTIALS cred;
+    extern unsigned long des_quad_cksum();
+
+    now = time(0);
+    if (last_authent_time == 0 || (now - last_authent_time > 120)) {
+	result = krb_mk_req(&authent, SERVER_SERVICE, 
+			    SERVER_INSTANCE, __Zephyr_realm, 0);
+	if (result != MK_AP_OK) {
+	    last_authent_time = 0;
+	    return (result+krb_err_base);
+        }
+	last_authent_time = now;
+	last_authent = authent;
+    }
+    else {
+	authent = last_authent;
+    }
+    notice->z_auth = 1;
+    notice->z_authent_len = authent.length;
+    notice->z_ascii_authent = (char *)malloc((unsigned)authent.length*3);
+    /* zero length authent is an error, so malloc(0) is not a problem */
+    if (!notice->z_ascii_authent)
+	return (ENOMEM);
+    if ((result = ZMakeAscii(notice->z_ascii_authent, 
+			     authent.length*3, 
+			     authent.dat, 
+			     authent.length)) != ZERR_NONE) {
+	free(notice->z_ascii_authent);
+	return (result);
+    }
+    result = Z_FormatRawHeader(notice, buffer, buffer_len, len, &cstart,
+			       &cend);
+    free(notice->z_ascii_authent);
+    notice->z_authent_len = 0;
+    if (result)
+	return(result);
+
+    /* Compute a checksum over the header and message. */
+    if ((result = krb_get_cred(SERVER_SERVICE, SERVER_INSTANCE, 
+			      __Zephyr_realm, &cred)) != 0)
+	return result;
+    checksum = des_quad_cksum(buffer, NULL, cstart - buffer, 0, cred.session);
+    checksum ^= des_quad_cksum(cend, NULL, buffer + *len - cend, 0,
+			       cred.session);
+    checksum ^= des_quad_cksum(notice->z_message, NULL, notice->z_message_len,
+			       0, cred.session);
+    notice->z_checksum = checksum;
+    ZMakeAscii32(cstart, buffer + buffer_len - cstart, checksum);
+
+    return (ZERR_NONE);
+#else
+    notice->z_checksum = 0;
+    notice->z_auth = 1;
+    notice->z_authent_len = 0;
+    notice->z_ascii_authent = "";
+    return (Z_FormatRawHeader(notice, buffer, buffer_len, len, NULL, NULL));
+#endif
+}