Squid Web Cache v8/master
Loading...
Searching...
No Matches
support_member.cc
Go to the documentation of this file.
1/*
2 * Copyright (C) 1996-2026 The Squid Software Foundation and contributors
3 *
4 * Squid software is distributed under GPLv2+ license and includes
5 * contributions from numerous individuals and organizations.
6 * Please see the COPYING and CONTRIBUTORS files for details.
7 */
8
9/*
10 * -----------------------------------------------------------------------------
11 *
12 * Author: Markus Moeller (markus_moeller at compuserve.com)
13 *
14 * Copyright (C) 2007 Markus Moeller. All rights reserved.
15 *
16 * This program is free software; you can redistribute it and/or modify
17 * it under the terms of the GNU General Public License as published by
18 * the Free Software Foundation; either version 2 of the License, or
19 * (at your option) any later version.
20 *
21 * This program is distributed in the hope that it will be useful,
22 * but WITHOUT ANY WARRANTY; without even the implied warranty of
23 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24 * GNU General Public License for more details.
25 *
26 * You should have received a copy of the GNU General Public License along
27 * with this program; if not, see <https://www.gnu.org/licenses/>.
28 *
29 * -----------------------------------------------------------------------------
30 */
31
32#include "squid.h"
33#include "util.h"
34
35#if HAVE_LDAP
36
37#include "support.h"
38
39int
40check_memberof(struct main_args *margs, char *user, char *domain)
41{
42
43 /*
44 * Check order:
45 *
46 * 1. Check domain against list of groups per domain
47 * 1a. If domain does not exist in list try default domain
48 * 1b. If default domain does not exist use default group against ldap url with user/password
49 * 1c. If default group does not exist exit with error.
50 * 2. Query ldap membership
51 * 2a. Use GSSAPI/SASL with HTTP/fqdn@DOMAIN credentials from keytab
52 * 2b. Use username/password with TLS
53 *
54 */
55 struct gdstruct *gr;
56 int found = 0;
57
58 /* Check users domain */
59
60 gr = margs->groups;
61 while (gr && domain) {
62 debug((char *) "%s| %s: DEBUG: User domain loop: group@domain %s@%s\n", LogTime(), PROGRAM, gr->group, gr->domain ? gr->domain : "NULL");
63 if (gr->domain && !strcasecmp(gr->domain, domain)) {
64 debug((char *) "%s| %s: DEBUG: Found group@domain %s@%s\n", LogTime(), PROGRAM, gr->group, gr->domain);
65 /* query ldap */
66 if (get_memberof(margs, user, domain, gr->group)) {
67 if (debug_enabled)
68 debug((char *) "%s| %s: INFO: User %s is member of group@domain %s@%s\n", LogTime(), PROGRAM, user, gr->group, gr->domain);
69 else
70 log((char *) "%s| %s: INFO: User %s is member of group@domain %s@%s\n", LogTime(), PROGRAM, user, gr->group, gr->domain);
71 ++found;
72 break;
73 } else {
74 if (debug_enabled)
75 debug((char *) "%s| %s: INFO: User %s is not member of group@domain %s@%s\n", LogTime(), PROGRAM, user, gr->group, gr->domain);
76 else
77 log((char *) "%s| %s: INFO: User %s is not member of group@domain %s@%s\n", LogTime(), PROGRAM, user, gr->group, gr->domain);
78 }
79 }
80 gr = gr->next;
81 }
82
83 if (found)
84 return (1);
85
86 /* Check default domain */
87
88 gr = margs->groups;
89 while (gr && domain) {
90 debug((char *) "%s| %s: DEBUG: Default domain loop: group@domain %s@%s\n", LogTime(), PROGRAM, gr->group, gr->domain ? gr->domain : "NULL");
91 if (gr->domain && !strcasecmp(gr->domain, "")) {
92 debug((char *) "%s| %s: DEBUG: Found group@domain %s@%s\n", LogTime(), PROGRAM, gr->group, gr->domain);
93 /* query ldap */
94 if (get_memberof(margs, user, domain, gr->group)) {
95 if (debug_enabled)
96 debug((char *) "%s| %s: INFO: User %s is member of group@domain %s@%s\n", LogTime(), PROGRAM, user, gr->group, gr->domain);
97 else
98 log((char *) "%s| %s: INFO: User %s is member of group@domain %s@%s\n", LogTime(), PROGRAM, user, gr->group, gr->domain);
99 ++found;
100 break;
101 } else {
102 if (debug_enabled)
103 debug((char *) "%s| %s: INFO: User %s is not member of group@domain %s@%s\n", LogTime(), PROGRAM, user, gr->group, gr->domain);
104 else
105 log((char *) "%s| %s: INFO: User %s is not member of group@domain %s@%s\n", LogTime(), PROGRAM, user, gr->group, gr->domain);
106 }
107 }
108 gr = gr->next;
109 }
110
111 if (found)
112 return (1);
113
114 /* Check default group with ldap url */
115
116 gr = margs->groups;
117 while (gr) {
118 debug((char *) "%s| %s: DEBUG: Default group loop: group@domain %s@%s\n", LogTime(), PROGRAM, gr->group, gr->domain ? gr->domain : "NULL");
119 if (!gr->domain) {
120 debug((char *) "%s| %s: DEBUG: Found group@domain %s@%s\n", LogTime(), PROGRAM, gr->group, gr->domain ? gr->domain : "NULL");
121 /* query ldap */
122 if (get_memberof(margs, user, domain, gr->group)) {
123 if (debug_enabled)
124 debug((char *) "%s| %s: INFO: User %s is member of group@domain %s@%s\n", LogTime(), PROGRAM, user, gr->group, gr->domain ? gr->domain : "NULL");
125 else
126 log((char *) "%s| %s: INFO: User %s is member of group@domain %s@%s\n", LogTime(), PROGRAM, user, gr->group, gr->domain ? gr->domain : "NULL");
127 ++found;
128 break;
129 } else {
130 if (debug_enabled)
131 debug((char *) "%s| %s: INFO: User %s is not member of group@domain %s@%s\n", LogTime(), PROGRAM, user, gr->group, gr->domain ? gr->domain : "NULL");
132 else
133 log((char *) "%s| %s: INFO: User %s is not member of group@domain %s@%s\n", LogTime(), PROGRAM, user, gr->group, gr->domain ? gr->domain : "NULL");
134 }
135 }
136 gr = gr->next;
137 }
138
139 if (found)
140 return (1);
141
142 return (0);
143}
144#endif
145
void log(char *format,...)
#define PROGRAM
Definition support.h:168
int get_memberof(struct main_args *margs, char *user, char *domain, char *group)
const char * LogTime(void)
int check_memberof(struct main_args *margs, char *user, char *domain)
int debug_enabled
Definition debug.cc:13
void debug(const char *format,...)
Definition debug.cc:19
struct gdstruct * next
Definition support.h:60
char * group
Definition support.h:58
char * domain
Definition support.h:59
struct gdstruct * groups
Definition support.h:89