subversion need to specify group members in the 'groups'
section of
svnaccess.conf configuration file.
external access control system like LDAP, AD, &etc.
requires to syncronize group
members to svnaccess.conf (for example:
http://thoughtspark.org/node/26/).
subversion must query operating system for group members
directly.
for example: on posix systems from nss (ldap, nis,
/etc/group ...). on windows:
from AD or local groups.
authz_posixgroup_contains_user.patch is a prototype for
posix system (getgrnam).
svnaccess.conf may be like that:
[repos1:/]
%wheel = rw
%members.test.bla-bla-bla = r
'%'-prefix means system group
http://subversion.tigris.org/issues/show_bug.cgi?id=4489
--- ./subversion/libsvn_repos/authz.c.orig 2013-05-04 01:21:54.000000000 +0400
+++ ./subversion/libsvn_repos/authz.c 2014-04-06 17:18:40.000000000 +0400
@@ -25,6 +25,7 @@
#include <apr_pools.h>
#include <apr_file_io.h>
+#include <grp.h>
#include "svn_hash.h"
#include "svn_pools.h"
@@ -197,6 +198,25 @@
return FALSE;
}
+static svn_boolean_t
+authz_posixgroup_contains_user(svn_config_t *cfg,
+ const char *group,
+ const char *user,
+ apr_pool_t *pool)
+{
+ struct group *grp;
+ char **gmem;
+
+ if ((grp = getgrnam(group)) == NULL)
+ perror("getgrnam() error");
+ else
+ for (gmem=grp->gr_mem; *gmem != NULL; gmem++)
+ if (strcmp(*gmem, user) == 0)
+ return TRUE;
+
+ return FALSE;
+}
+
/* Determines whether an authz rule applies to the current
* user, given the name part of the rule's name-value pair
@@ -242,6 +262,9 @@
if (rule_match_string[0] == '@')
return authz_group_contains_user(
b->config, &rule_match_string[1], b->user, pool);
+ else if (rule_match_string[0] == '%')
+ return authz_posixgroup_contains_user(
+ b->config, &rule_match_string[1], b->user, pool);
else if (rule_match_string[0] == '&')
return authz_alias_is_user(
b->config, &rule_match_string[1], b->user, pool);