~ubuntu-branches/ubuntu/feisty/dovecot/feisty-security

« back to all changes in this revision

Viewing changes to src/plugins/acl/acl-api.c

  • Committer: Bazaar Package Importer
  • Author(s): Michael Vogt
  • Date: 2006-11-27 20:47:11 UTC
  • mfrom: (1.10.5 upstream)
  • Revision ID: james.westby@ubuntu.com-20061127204711-z7alg32xp4tnftjs
Tags: 1.0.rc15-1ubuntu1
* Merge from debian unstable. Remaining changes:
  - snakeoil ssl
  - Remove stop script symlinks from rc0 and rc6

Show diffs side-by-side

added added

removed removed

Lines of Context:
31
31
        aclobj->backend->v.object_deinit(aclobj);
32
32
}
33
33
 
 
34
static int acl_backend_get_default_rights(struct acl_backend *backend,
 
35
                                          const struct acl_mask **mask_r)
 
36
{
 
37
        if (backend->v.object_refresh_cache(backend->default_aclobj) < 0)
 
38
                return -1;
 
39
 
 
40
        *mask_r = acl_cache_get_my_rights(backend->cache, "");
 
41
        if (*mask_r == NULL)
 
42
                *mask_r = backend->default_aclmask;
 
43
        return 0;
 
44
}
 
45
 
34
46
int acl_object_have_right(struct acl_object *aclobj, unsigned int right_idx)
35
47
{
 
48
        struct acl_backend *backend = aclobj->backend;
36
49
        const struct acl_mask *have_mask;
37
50
        unsigned int mask_idx;
38
51
 
39
52
        if (*aclobj->name == '\0') {
40
53
                /* we want to look up default rights */
41
 
                have_mask = aclobj->backend->default_rights;
 
54
                if (acl_backend_get_default_rights(backend, &have_mask) < 0)
 
55
                        return -1;
42
56
        } else {
43
 
                if (aclobj->backend->v.object_refresh_cache(aclobj) < 0)
 
57
                if (backend->v.object_refresh_cache(aclobj) < 0)
44
58
                        return -1;
45
59
 
46
 
                have_mask = acl_cache_get_my_rights(aclobj->backend->cache,
 
60
                have_mask = acl_cache_get_my_rights(backend->cache,
47
61
                                                    aclobj->name);
48
 
                if (have_mask == NULL)
49
 
                        have_mask = aclobj->backend->default_rights;
 
62
                if (have_mask == NULL) {
 
63
                        if (acl_backend_get_default_rights(backend,
 
64
                                                           &have_mask) < 0)
 
65
                                return -1;
 
66
                }
50
67
        }
51
68
 
52
69
        mask_idx = right_idx / CHAR_BIT;
58
75
int acl_object_get_my_rights(struct acl_object *aclobj, pool_t pool,
59
76
                             const char *const **rights_r)
60
77
{
 
78
        struct acl_backend *backend = aclobj->backend;
61
79
        const struct acl_mask *mask;
62
80
        const char *const *names;
63
81
        const char **buf, **rights;
65
83
 
66
84
        if (*aclobj->name == '\0') {
67
85
                /* we want to look up default rights */
68
 
                mask = aclobj->backend->default_rights;
 
86
                if (acl_backend_get_default_rights(backend, &mask) < 0)
 
87
                        return -1;
69
88
        } else {
70
 
                if (aclobj->backend->v.object_refresh_cache(aclobj) < 0)
 
89
                if (backend->v.object_refresh_cache(aclobj) < 0)
71
90
                        return -1;
72
91
 
73
 
                mask = acl_cache_get_my_rights(aclobj->backend->cache,
 
92
                mask = acl_cache_get_my_rights(backend->cache,
74
93
                                               aclobj->name);
75
 
                if (mask == NULL)
76
 
                        mask = aclobj->backend->default_rights;
 
94
                if (mask == NULL) {
 
95
                        if (acl_backend_get_default_rights(backend, &mask) < 0)
 
96
                                return -1;
 
97
                }
77
98
        }
78
99
 
79
100
        if (!pool->datastack_pool)
80
101
                t_push();
81
102
 
82
 
        names = acl_cache_get_names(aclobj->backend->cache, &names_count);
 
103
        names = acl_cache_get_names(backend->cache, &names_count);
83
104
        buf = t_new(const char *, (mask->size * CHAR_BIT) + 1);
84
105
        count = 0;
85
106
        for (i = 0, name_idx = 0; i < mask->size; i++) {