[Cvs-nserver-commits] CVS: cvs-nserver/src add.c,1.1.1.5,1.1.1.5.4.1 annotate.c,1.1.1.1.4.1,1.1.1.1.
Brought to you by:
tyranny
Update of /cvsroot/cvs-nserver/cvs-nserver/src In directory usw-pr-cvs1:/tmp/cvs-serv16092 Modified Files: Tag: NCLI-1-11-1 add.c annotate.c checkout.c client.c diff.c import.c log.c patch.c recurse.c recurse.h remove.c status.c tag.c update.c watch.c Log Message: Preliminary ACL support Index: add.c =================================================================== RCS file: /cvsroot/cvs-nserver/cvs-nserver/src/add.c,v retrieving revision 1.1.1.5 retrieving revision 1.1.1.5.4.1 diff -u -d -r1.1.1.5 -r1.1.1.5.4.1 --- add.c 2001/05/19 12:05:02 1.1.1.5 +++ add.c 2001/09/24 22:26:25 1.1.1.5.4.1 @@ -25,6 +25,9 @@ */ #include "cvs.h" + +#include "acl.h" +#include "repos.h" #include "savecwd.h" #include "fileattr.h" @@ -334,6 +337,11 @@ CVSNULLREPOS) == 0) error (1, 0, "cannot add to %s", repository); +#ifdef SERVER_SUPPORT + if (!grant_dir_permission(repository, finfo.file, dir_perm_modify, "add")) + return 1; +#endif + entries = Entries_Open (0, NULL); finfo.repository = repository; @@ -413,11 +421,17 @@ else if (!isdir (finfo.file) || wrap_name_has (finfo.file, WRAP_TOCVS)) { + char *dname; +#ifdef SERVER_SUPPORT + if (!grant_dir_permission(repository, finfo.file, + dir_perm_modify, "add")) + return 1; +#endif /* * See if a directory exists in the repository with * the same name. If so, blow this request off. */ - char *dname = xmalloc (strlen (repository) + dname = xmalloc (strlen (repository) + strlen (finfo.file) + 10); (void) sprintf (dname, "%s/%s", repository, finfo.file); Index: annotate.c =================================================================== RCS file: /cvsroot/cvs-nserver/cvs-nserver/src/annotate.c,v retrieving revision 1.1.1.1.4.1 retrieving revision 1.1.1.1.4.2 diff -u -d -r1.1.1.1.4.1 -r1.1.1.1.4.2 --- annotate.c 2001/09/18 19:43:20 1.1.1.1.4.1 +++ annotate.c 2001/09/24 22:26:25 1.1.1.1.4.2 @@ -13,6 +13,7 @@ */ #include "cvs.h" +#include "acl.h" #include "recurse.h" /* Options from the command line. */ Index: checkout.c =================================================================== RCS file: /cvsroot/cvs-nserver/cvs-nserver/src/checkout.c,v retrieving revision 1.1.1.5 retrieving revision 1.1.1.5.4.1 diff -u -d -r1.1.1.5 -r1.1.1.5.4.1 --- checkout.c 2001/05/19 12:05:02 1.1.1.5 +++ checkout.c 2001/09/24 22:26:25 1.1.1.5.4.1 @@ -34,8 +34,12 @@ */ #include <assert.h> + #include "cvs.h" +#include "acl.h" +#include "repos.h" + static char *findslash PROTO((char *start, char *p)); static int checkout_proc PROTO((int argc, char **argv, char *where, char *mwhere, char *mfile, int shorten, @@ -536,6 +540,13 @@ (void) sprintf (repository, "%s/%s", current_parsed_root->directory, argv[0]); Sanitize_Repository_Name (repository); +#ifdef SERVER_SUPPORT +/* if (! verify_read(repository)) + { + error (0, 0, "User %s cannot access %s", CVS_Username, argv[0]); + return (1); + }*/ +#endif /* save the original value of preload_update_dir */ if (preload_update_dir != NULL) Index: client.c =================================================================== RCS file: /cvsroot/cvs-nserver/cvs-nserver/src/client.c,v retrieving revision 1.1.1.7.2.6.2.7 retrieving revision 1.1.1.7.2.6.2.8 diff -u -d -r1.1.1.7.2.6.2.7 -r1.1.1.7.2.6.2.8 --- client.c 2001/09/23 11:51:11 1.1.1.7.2.6.2.7 +++ client.c 2001/09/24 22:26:25 1.1.1.7.2.6.2.8 @@ -4969,7 +4969,7 @@ err = start_recursion (send_fileproc, send_filesdoneproc, send_dirent_proc, send_dirleave_proc, (void *) &args, - argc, argv, local, W_LOCAL, aflag, 0, (char *)NULL, 0, NULL); + argc, argv, local, W_LOCAL, aflag, 0, (char *)NULL, 0); if (err) error_exit (); if (toplevel_repos == NULL) Index: diff.c =================================================================== RCS file: /cvsroot/cvs-nserver/cvs-nserver/src/diff.c,v retrieving revision 1.1.1.3 retrieving revision 1.1.1.3.4.1 diff -u -d -r1.1.1.3 -r1.1.1.3.4.1 --- diff.c 2001/05/19 12:05:04 1.1.1.3 +++ diff.c 2001/09/24 22:26:25 1.1.1.3.4.1 @@ -16,6 +16,9 @@ #include "cvs.h" +#include "acl.h" +#include "recurse.h" + enum diff_file { DIFF_ERROR, Index: import.c =================================================================== RCS file: /cvsroot/cvs-nserver/cvs-nserver/src/import.c,v retrieving revision 1.1.1.6.4.1 retrieving revision 1.1.1.6.4.2 diff -u -d -r1.1.1.6.4.1 -r1.1.1.6.4.2 --- import.c 2001/09/18 19:59:12 1.1.1.6.4.1 +++ import.c 2001/09/24 22:26:25 1.1.1.6.4.2 @@ -1574,6 +1574,13 @@ repository = new; } +#ifdef SERVER_SUPPORT + /* Verify we have create access in this directory. */ +/* if (! verify_mkdir (repository)) + error (1, 0, "User %s cannot create files in %s", + CVS_Username, repository); */ +#endif + #ifdef CLIENT_SUPPORT if (!quiet && !current_parsed_root->isremote) #else Index: log.c =================================================================== RCS file: /cvsroot/cvs-nserver/cvs-nserver/src/log.c,v retrieving revision 1.1.1.6.4.1 retrieving revision 1.1.1.6.4.2 diff -u -d -r1.1.1.6.4.1 -r1.1.1.6.4.2 --- log.c 2001/09/18 19:43:20 1.1.1.6.4.1 +++ log.c 2001/09/24 22:26:25 1.1.1.6.4.2 @@ -13,6 +13,8 @@ */ #include "cvs.h" + +#include "acl.h" #include "recurse.h" /* This structure holds information parsed from the -r option. */ Index: patch.c =================================================================== RCS file: /cvsroot/cvs-nserver/cvs-nserver/src/patch.c,v retrieving revision 1.1.1.3.4.1 retrieving revision 1.1.1.3.4.2 diff -u -d -r1.1.1.3.4.1 -r1.1.1.3.4.2 --- patch.c 2001/09/18 19:43:20 1.1.1.3.4.1 +++ patch.c 2001/09/24 22:26:25 1.1.1.3.4.2 @@ -13,7 +13,10 @@ */ #include <assert.h> + #include "cvs.h" + +#include "acl.h" #include "getline.h" #include "recurse.h" @@ -327,6 +330,14 @@ } free (path); } + +#ifdef SERVER_SUPPORT +/* if (! verify_read(repository)) + { + error (0, 0, "User %s cannot access %s", CVS_Username, repository); + return (1); + }*/ +#endif /* cd to the starting repository */ if ( CVS_CHDIR (repository) < 0) Index: recurse.c =================================================================== RCS file: /cvsroot/cvs-nserver/cvs-nserver/src/recurse.c,v retrieving revision 1.1.1.7.4.1 retrieving revision 1.1.1.7.4.2 diff -u -d -r1.1.1.7.4.1 -r1.1.1.7.4.2 --- recurse.c 2001/09/18 19:43:20 1.1.1.7.4.1 +++ recurse.c 2001/09/24 22:26:25 1.1.1.7.4.2 @@ -13,6 +13,7 @@ #include "savecwd.h" #include "fileattr.h" #include "edit.h" +#include "repos.h" static int do_dir_proc PROTO((Node * p, void *closure)); static int do_file_proc PROTO((Node * p, void *closure)); @@ -60,6 +61,58 @@ }; +static int +verify_access (permproc, dir, update_dir) + PERMPROC permproc; + char *dir; + char *update_dir; +{ + char *hostdir; + int retval; + + if (permproc == NULL) + { + return 1; + } + + if (repository == NULL) + { + /* If the repository is not already calculated, we have to figure + it our ourselves. */ + + if ((update_dir != NULL) && (update_dir[0] == '\0')) { + /* No update directory was given, so we have to get it + from the CVS/Repository file. */ + hostdir = Name_Repository(dir, update_dir); + } else { + /* We got an update directory, so we can use that to get + the current directory. */ + if ((dir == NULL) || (strcmp(dir, ".") == 0)) + dir = ""; + + if (update_dir == NULL) + update_dir = ""; + + hostdir = xmalloc(strlen(current_parsed_root->directory) + + strlen(update_dir) + strlen(dir) + 3); + strcpy(hostdir, current_parsed_root->directory); + strcat(hostdir, "/"); + strcat(hostdir, update_dir); + if (strlen(dir) > 0) { + strcat(hostdir, "/"); + strcat(hostdir, dir); + } + } + retval = permproc (hostdir); + free(hostdir); + } + else + { + retval = permproc (repository); + } + return retval; +} + /* Start a recursive command. Command line arguments (ARGC, ARGV) dictate the directories and @@ -286,7 +339,9 @@ file_to_try = xstrdup (argv[i]); if (isfile (file_to_try)) - addfile (&files_by_dir, dir, comp); + { + addfile (&files_by_dir, dir, comp); + } else if (isdir (dir)) { if ((which & W_LOCAL) && isdir (CVSADM) @@ -1057,7 +1112,7 @@ free (newrepos); - /* only process the dir if the return code was 0 */ + /* only process the dir if the return code was R_PROCESS */ if (dir_return != R_SKIP_ALL) { /* save our current directory and static vars */ Index: recurse.h =================================================================== RCS file: /cvsroot/cvs-nserver/cvs-nserver/src/Attic/recurse.h,v retrieving revision 1.1.2.1 retrieving revision 1.1.2.2 diff -u -d -r1.1.2.1 -r1.1.2.2 --- recurse.h 2001/09/18 19:43:20 1.1.2.1 +++ recurse.h 2001/09/24 22:26:25 1.1.2.2 @@ -11,6 +11,7 @@ #ifndef RECURSE_H #define RECURSE_H 1 + typedef int (*FILEPROC) (void *callerdat, struct file_info *finfo); typedef int (*FILESDONEPROC) (void *callerdat, int err, @@ -23,6 +24,9 @@ typedef int (*DIRLEAVEPROC) (void *callerdat, char *dir, int err, char *update_dir, List *entries); + +typedef int (*PERMPROC) (const char *dir); + int start_recursion (FILEPROC fileproc, FILESDONEPROC filesdoneproc, DIRENTPROC direntproc, DIRLEAVEPROC dirleaveproc, Index: remove.c =================================================================== RCS file: /cvsroot/cvs-nserver/cvs-nserver/src/remove.c,v retrieving revision 1.1.1.4.4.1 retrieving revision 1.1.1.4.4.2 diff -u -d -r1.1.1.4.4.1 -r1.1.1.4.4.2 --- remove.c 2001/09/18 19:43:20 1.1.1.4.4.1 +++ remove.c 2001/09/24 22:26:25 1.1.1.4.4.2 @@ -16,6 +16,8 @@ */ #include "cvs.h" + +#include "acl.h" #include "recurse.h" #ifdef CLIENT_SUPPORT @@ -160,6 +162,12 @@ struct file_info *finfo; { Vers_TS *vers; + +#ifdef SERVER_SUPPORT + if (!grant_dir_permission(finfo->repository, finfo->file, + dir_perm_modify, "remove")) + return 1; +#endif if (force) { Index: status.c =================================================================== RCS file: /cvsroot/cvs-nserver/cvs-nserver/src/status.c,v retrieving revision 1.1.1.4.4.1 retrieving revision 1.1.1.4.4.2 diff -u -d -r1.1.1.4.4.1 -r1.1.1.4.4.2 --- status.c 2001/09/18 19:43:20 1.1.1.4.4.1 +++ status.c 2001/09/24 22:26:25 1.1.1.4.4.2 @@ -9,6 +9,8 @@ */ #include "cvs.h" + +#include "acl.h" #include "recurse.h" static Dtype status_dirproc PROTO ((void *callerdat, char *dir, Index: tag.c =================================================================== RCS file: /cvsroot/cvs-nserver/cvs-nserver/src/tag.c,v retrieving revision 1.1.1.5.4.1 retrieving revision 1.1.1.5.4.2 diff -u -d -r1.1.1.5.4.1 -r1.1.1.5.4.2 --- tag.c 2001/09/18 19:43:20 1.1.1.5.4.1 +++ tag.c 2001/09/24 22:26:25 1.1.1.5.4.2 @@ -13,6 +13,8 @@ */ #include "cvs.h" + +#include "acl.h" #include "recurse.h" #include "savecwd.h" Index: update.c =================================================================== RCS file: /cvsroot/cvs-nserver/cvs-nserver/src/update.c,v retrieving revision 1.1.1.6 retrieving revision 1.1.1.6.4.1 diff -u -d -r1.1.1.6 -r1.1.1.6.4.1 --- update.c 2001/05/19 12:05:06 1.1.1.6 +++ update.c 2001/09/24 22:26:25 1.1.1.6.4.1 @@ -38,12 +38,15 @@ #ifdef SERVER_SUPPORT #include "md5.h" #endif +#include "acl.h" #include "watch.h" #include "fileattr.h" #include "edit.h" #include "getline.h" #include "buffer.h" #include "hardlink.h" +#include "recurse.h" +#include "repos.h" static int checkout_file PROTO ((struct file_info *finfo, Vers_TS *vers_ts, int adding, int merging, int update_server)); @@ -584,6 +587,11 @@ Ctype status; Vers_TS *vers; +#ifdef SERVER_SUPPORT + if (!grant_file_permission(finfo->repository, finfo->file, branch_perm_checkout)) + return 0; +#endif + status = Classify_File (finfo, tag, date, options, force_tag_match, aflag, &vers, pipeout); @@ -977,6 +985,16 @@ { char *cvsadmdir; +#ifdef SERVER_SUPPORT + if (server_active) { + if (!grant_dir_permission(Name_Repository(dir, NULL), update_dir, + dir_perm_access, "update")) + { + return R_SKIP_ALL; + } + } +#endif + /* The directory exists. Check to see if it has a CVS subdirectory. */ @@ -1397,7 +1415,8 @@ if (cvswrite && !file_is_dead - && !fileattr_get (finfo->file, "_watched")) + && !fileattr_get (finfo->file, "_watched") + /*&& verify_write (finfo->repository)*/) { if (revbuf == NULL) xchmod (finfo->file, 1); @@ -1793,7 +1812,8 @@ < 0) error (0, errno, "cannot change mode of file %s", finfo->file); if (cvswrite - && !fileattr_get (finfo->file, "_watched")) + && !fileattr_get (finfo->file, "_watched") + /*&& verify_write (finfo->repository)*/) xchmod (finfo->file, 1); /* Check the diff output to make sure patch will be handle it. */ Index: watch.c =================================================================== RCS file: /cvsroot/cvs-nserver/cvs-nserver/src/watch.c,v retrieving revision 1.1.1.3.4.1 retrieving revision 1.1.1.3.4.2 diff -u -d -r1.1.1.3.4.1 -r1.1.1.3.4.2 --- watch.c 2001/09/18 19:43:20 1.1.1.3.4.1 +++ watch.c 2001/09/24 22:26:25 1.1.1.3.4.2 @@ -11,6 +11,8 @@ GNU General Public License for more details. */ #include "cvs.h" + +#include "acl.h" #include "edit.h" #include "fileattr.h" #include "recurse.h" |