about summary refs log tree commit diff stats
path: root/WWW/Library/Implementation/HTACL.c
diff options
context:
space:
mode:
Diffstat (limited to 'WWW/Library/Implementation/HTACL.c')
-rw-r--r--WWW/Library/Implementation/HTACL.c221
1 files changed, 221 insertions, 0 deletions
diff --git a/WWW/Library/Implementation/HTACL.c b/WWW/Library/Implementation/HTACL.c
new file mode 100644
index 00000000..aeafcafd
--- /dev/null
+++ b/WWW/Library/Implementation/HTACL.c
@@ -0,0 +1,221 @@
+
+/* MODULE							HTACL.c
+**		ACCESS CONTROL LIST ROUTINES
+**
+** AUTHORS:
+**	AL	Ari Luotonen	luotonen@dxcern.cern.ch
+**	MD 	Mark Donszelmann    duns@vxdeop.cern.ch
+**
+** HISTORY:
+**	 8 Nov 93  MD	(VMS only) case insensitive compare reading acl entry, filename
+**
+**
+** BUGS:
+**
+**
+*/
+
+
+#include "HTUtils.h"
+
+/*#include <stdio.h> included by HTUtils.h -- FM *//* FILE */
+#include <string.h>
+
+#include "HTAAFile.h"	/* File routines	*/
+#include "HTGroup.h"	/* GroupDef		*/
+#include "HTACL.h"	/* Implemented here	*/
+
+#include "LYLeaks.h"
+
+/* PUBLIC						HTAA_getAclFilename()
+**	    RESOLVE THE FULL PATHNAME OF ACL FILE FOR A GIVEN FILE
+** ON ENTRY:
+**	path	is the pathname of the file for which to
+**		ACL file should be found.
+**
+**		ACL filename is computed by replacing
+**		the filename by .www_acl in the pathname
+**		(this is done to a local copy, of course).
+**
+** ON EXIT:
+**	returns	the absolute pathname of ACL file
+**		(which is automatically freed next time
+**		this fuction is called).
+*/
+PUBLIC char *HTAA_getAclFilename ARGS1(CONST char *, pathname)
+{
+    static char * local_copy = NULL;
+    static char * acl_path = NULL;
+    char * directory = NULL;
+    char * filename = NULL;
+
+    StrAllocCopy(local_copy, pathname);	/* Also frees local_copy */
+                                        /* from previous call.   */
+
+    directory = local_copy;
+    filename = strrchr(directory, '/');
+    if (!filename) {		/* No path in front of filename */
+	directory = ".";	/* So use current directory */
+	filename = local_copy;	/* and the pathname itself is the filename */
+    }
+    else {
+	*filename = '\0'; /* Truncate filename off from directory path */
+	filename++;	  /* and the filename begins from the next character */
+    }
+    
+    StrAllocCopy(acl_path, directory);	/* Also frees acl_path */
+                                        /* from previous call. */
+    StrAllocCat(acl_path, "/");
+    StrAllocCat(acl_path, ACL_FILE_NAME);
+
+    return acl_path;
+}
+
+
+/* PUBLIC						HTAA_openAcl()
+**		OPEN THE ACL FILE FOR THE GIVEN DOCUMENT
+** ON ENTRY:
+**	pathname	is the absolute pathname of
+**			the file to be accessed.
+**
+** ON EXIT:
+**	returns		the FILE* to open ACL.
+**			NULL, if ACL not found.
+*/
+PUBLIC FILE *HTAA_openAcl ARGS1(CONST char *, pathname)
+{
+    return fopen(HTAA_getAclFilename(pathname), "r");
+}
+
+
+/* PUBLIC						HTAA_closeAcl()
+**			CLOSE ACL FILE
+** ON ENTRY:
+**	acl_file is Access Control List file to close.
+**
+** ON EXIT:
+**	returns	nothing.
+*/
+PUBLIC void HTAA_closeAcl ARGS1(FILE *, acl_file)
+{
+    if (acl_file)  fclose(acl_file);
+}
+
+
+/* PUBLIC						HTAA_getAclEntry()
+**			CONSULT THE ACCESS CONTROL LIST AND
+**			GIVE A LIST OF GROUPS (AND USERS)
+**			AUTHORIZED TO ACCESS A GIVEN FILE
+** ON ENTRY:
+**	acl_file	is an open ACL file.
+**	pathname	is the absolute pathname of
+**			the file to be accessed.
+**	method		is the method for which access is wanted.
+**
+** ALC FILE FORMAT:
+**
+**	template : method, method, ... : group@addr, user, group, ...
+**
+**	The last item is in fact in exactly the same format as
+**	group definition in group file, i.e. everything that
+**	follows the 'groupname:' part,
+**	e.g.
+**		user, group, user@address, group@address,
+**		(user,group,...)@(address, address, ...)
+**
+** ON EXIT:
+**	returns		NULL, if there is no entry for the file in the ACL,
+**			or ACL doesn't exist.
+**			If there is, a GroupDef object containing the
+**			group and user names allowed to access the file
+**			is returned (this is automatically freed
+**			next time this function is called).
+** IMPORTANT:
+**	Returns the first entry with matching template and
+**	method. This function should be called multiple times
+**	to process all the valid entries (until it returns NULL).
+**	This is because there can be multiple entries like:
+**
+**		*.html : get,put : ari,timbl,robert
+**		*.html : get	 : jim,james,jonathan,jojo
+**
+** NOTE:
+**	The returned group definition may well contain references
+**	to groups defined in group file. Therefore these references
+**	must be resolved according to that rule file by function
+**	HTAA_resolveGroupReferences() (group file is read in by
+**	HTAA_readGroupFile()) and after that access authorization
+**	can be checked with function HTAA_userAndInetGroup().
+*/
+PUBLIC GroupDef *HTAA_getAclEntry ARGS3(FILE *,		acl_file,
+					CONST char *,	pathname,
+					HTAAMethod,	method)
+{
+    static GroupDef * group_def = NULL;
+    CONST char * filename;
+    int len;
+    char *buf;
+
+    if (!acl_file) return NULL;		/* ACL doesn't exist */
+    
+    if (group_def) {
+	GroupDef_delete(group_def);	/* From previous call */
+	group_def = NULL;
+    }
+
+    if (!(filename = strrchr(pathname, '/')))
+	filename = pathname;
+    else filename++;	/* Skip slash */
+
+    len = strlen(filename);
+
+    if (!(buf = (char*)malloc((strlen(filename)+2)*sizeof(char))))
+	outofmem(__FILE__, "HTAA_getAuthorizedGroups");
+    
+    while (EOF != HTAAFile_readField(acl_file, buf, len+1)) {
+#ifdef VMS
+	if (HTAA_templateCaseMatch(buf, filename)) {
+#else /* not VMS */
+	if (HTAA_templateMatch(buf, filename)) {
+#endif /* not VMS */
+	    HTList *methods = HTList_new();
+	    HTAAFile_readList(acl_file, methods, MAX_METHODNAME_LEN);
+	    if (TRACE) {
+		fprintf(stderr,
+			"Filename '%s' matched template '%s', allowed methods:",
+			filename, buf);
+	    }	
+	    if (HTAAMethod_inList(method, methods)) {	/* right method? */
+		if (TRACE)
+		    fprintf(stderr, " METHOD OK\n");
+		HTList_delete(methods);
+		methods = NULL;
+		FREE(buf);
+		group_def = HTAA_parseGroupDef(acl_file);
+		/*
+		** HTAA_parseGroupDef() already reads the record
+		** separator so we don't call HTAAFile_nextRec().
+		*/
+		return group_def;
+	    } else if (TRACE) {
+	        fprintf(stderr, " METHOD NOT FOUND\n");
+	    }
+	    HTList_delete(methods);
+	    methods = NULL;
+	}	/* if template match */
+	else {
+	    if (TRACE) {
+		fprintf(stderr,
+			"Filename '%s' didn't match template '%s'\n",
+			filename, buf);
+	    }
+	}
+
+	HTAAFile_nextRec(acl_file);
+    }	/* while not eof */
+    FREE(buf);
+
+    return NULL;	/* No entry for requested file */
+                        /* (or an empty entry).        */
+}
+