summaryrefslogtreecommitdiff
path: root/lib/ZCkAuth.c
diff options
context:
space:
mode:
authorGravatar Robert S. French <rfrench@mit.edu>1987-07-05 22:08:41 +0000
committerGravatar Robert S. French <rfrench@mit.edu>1987-07-05 22:08:41 +0000
commit63e063c0681783c90e604aa788dc4e9e52f0719b (patch)
tree3f4fa9a8bc21248e33f6664e6d4ea4e1df568553 /lib/ZCkAuth.c
parentcae682f6e19600f9032e3e0c3bebe378a10007e3 (diff)
Initial revision
Diffstat (limited to 'lib/ZCkAuth.c')
-rw-r--r--lib/ZCkAuth.c64
1 files changed, 64 insertions, 0 deletions
diff --git a/lib/ZCkAuth.c b/lib/ZCkAuth.c
new file mode 100644
index 0000000..bb7108c
--- /dev/null
+++ b/lib/ZCkAuth.c
@@ -0,0 +1,64 @@
+/* This file is part of the Project Athena Zephyr Notification System.
+ * It contains source for the ZCheckAuthentication function.
+ *
+ * Created by: Robert French
+ *
+ * $Source$
+ * $Author$
+ *
+ * Copyright (c) 1987 by the Massachusetts Institute of Technology.
+ * For copying and distribution information, see the file
+ * "mit-copyright.h".
+ */
+/* $Header$ */
+
+#include <zephyr/mit-copyright.h>
+
+#include <zephyr/zephyr_internal.h>
+
+int ZCheckAuthentication(notice,buffer,from)
+ ZNotice_t *notice;
+ ZPacket_t buffer;
+ struct sockaddr_in *from;
+{
+ int result;
+ char srcprincipal[ANAME_SZ+INST_SZ+REALM_SZ+4];
+ KTEXT_ST authent;
+ AUTH_DAT dat;
+ ZChecksum_t our_checksum;
+ CREDENTIALS cred;
+
+ if (!notice->z_auth)
+ return (0);
+
+ if (__Zephyr_server) {
+ if (ZReadAscii(notice->z_ascii_authent,
+ strlen(notice->z_ascii_authent)+1,
+ (char *)authent.dat,
+ notice->z_authent_len) == ZERR_BADFIELD) {
+ return (0);
+ }
+ authent.length = notice->z_authent_len;
+ result = rd_ap_req(&authent,SERVER_SERVICE,
+ SERVER_INSTANCE,from->sin_addr.s_addr,
+ &dat,SERVER_SRVTAB);
+ bcopy((char *)dat.session,(char *)__Zephyr_session,
+ sizeof(C_Block));
+ (void) sprintf(srcprincipal,"%s%s%s@%s",dat.pname,
+ dat.pinst[0]?".":"",dat.pinst,dat.prealm);
+ if (strcmp(srcprincipal,notice->z_sender))
+ return (0);
+ return (result == RD_AP_OK);
+ }
+
+ if (result = get_credentials(SERVER_SERVICE,SERVER_INSTANCE,
+ __Zephyr_realm,&cred))
+ return (result+krb_err_base);
+
+ our_checksum = (ZChecksum_t)quad_cksum(buffer,NULL,
+ notice->z_recipient+
+ strlen(notice->z_recipient)+1-
+ buffer,0,cred.session);
+
+ return (our_checksum == notice->z_checksum);
+}