]> git.sur5r.net Git - openldap/blob - contrib/slapd-modules/nssov/netgroup.c
nss overlay
[openldap] / contrib / slapd-modules / nssov / netgroup.c
1 /* netgroup.c - netgroup lookup routines */
2 /* $OpenLDAP$ */
3 /*
4  * Copyright 2008 by Howard Chu, Symas Corp.
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted only as authorized by the OpenLDAP
9  * Public License.
10  *
11  * A copy of this license is available in the file LICENSE in the
12  * top-level directory of the distribution or, alternatively, at
13  * <http://www.OpenLDAP.org/license.html>.
14  */
15 /*
16  * This code references portions of the nss-ldapd package
17  * written by Arthur de Jong. The nss-ldapd code was forked
18  * from the nss-ldap library written by Luke Howard.
19  */
20
21 #include "nssov.h"
22 #include <ac/ctype.h>
23
24 /* ( nisSchema.2.8 NAME 'nisNetgroup' SUP top STRUCTURAL
25  *   DESC 'Abstraction of a netgroup. May refer to other netgroups'
26  *   MUST cn
27  *   MAY ( nisNetgroupTriple $ memberNisNetgroup $ description ) )
28  */
29
30 /* the basic search filter for searches */
31 static struct berval netgroup_filter = BER_BVC("(objectClass=nisNetgroup)");
32
33 /* the attributes to request with searches */
34 static struct berval netgroup_keys[] = {
35         BER_BVC("cn"),
36         BER_BVC("nisNetgroupTriple"),
37         BER_BVC("memberNisNetgroup"),
38         BER_BVNULL
39 };
40
41 NSSOV_INIT(netgroup)
42
43 NSSOV_CBPRIV(netgroup,
44         char buf[256];
45         struct berval name;);
46
47 static int write_string_stripspace_len(TFILE *fp,const char *str,int len)
48 {
49         int32_t tmpint32;
50         int i,j;
51         DEBUG_PRINT("WRITE_STRING: var="__STRING(str)" string=\"%s\"",str);
52         if (str==NULL)
53         {
54                 WRITE_INT32(fp,0);
55         }
56         else
57         {
58                 /* skip leading spaces */
59                 for (i=0;(str[i]!='\0')&&(isspace(str[i]));i++)
60                         /* nothing else to do */ ;
61                 /* skip trailing spaces */
62                 for (j=len;(j>i)&&(isspace(str[j-1]));j--)
63                         /* nothing else to do */ ;
64                 /* write length of string */
65                 WRITE_INT32(fp,j-i);
66                 /* write string itself */
67                 if (j>i)
68                 {
69                         WRITE(fp,str+i,j-i);
70                 }
71         }
72         /* we're done */
73         return 0;
74 }
75
76 #define WRITE_STRING_STRIPSPACE_LEN(fp,str,len) \
77         if (write_string_stripspace_len(fp,str,len)) \
78                 return -1;
79
80 #define WRITE_STRING_STRIPSPACE(fp,str) \
81         WRITE_STRING_STRIPSPACE_LEN(fp,str,strlen(str))
82
83 static int write_netgroup_triple(TFILE *fp,const char *triple)
84 {
85         int32_t tmpint32;
86         int i;
87         int hostb,hoste,userb,usere,domainb,domaine;
88         /* skip leading spaces */
89         for (i=0;(triple[i]!='\0')&&(isspace(triple[i]));i++)
90                 /* nothing else to do */ ;
91         /* we should have a bracket now */
92         if (triple[i]!='(')
93         {
94                 Debug(LDAP_DEBUG_ANY,"write_netgroup_triple(): entry does not begin with '(' (entry skipped)",0,0,0);
95                 return 0;
96         }
97         i++;
98         hostb=i;
99         /* find comma (end of host string) */
100         for (;(triple[i]!='\0')&&(triple[i]!=',');i++)
101                 /* nothing else to do */ ;
102         if (triple[i]!=',')
103         {
104                 Debug(LDAP_DEBUG_ANY,"write_netgroup_triple(): missing ',' (entry skipped)",0,0,0);
105                 return 0;
106         }
107         hoste=i;
108         i++;
109         userb=i;
110         /* find comma (end of user string) */
111         for (;(triple[i]!='\0')&&(triple[i]!=',');i++)
112                 /* nothing else to do */ ;
113         if (triple[i]!=',')
114         {
115                 Debug(LDAP_DEBUG_ANY,"write_netgroup_triple(): missing ',' (entry skipped)",0,0,0);
116                 return 0;
117         }
118         usere=i;
119         i++;
120         domainb=i;
121         /* find closing bracket (end of domain string) */
122         for (;(triple[i]!='\0')&&(triple[i]!=')');i++)
123                 /* nothing else to do */ ;
124         if (triple[i]!=')')
125         {
126                 Debug(LDAP_DEBUG_ANY,"write_netgroup_triple(): missing ')' (entry skipped)",0,0,0);
127                 return 0;
128         }
129         domaine=i;
130         i++;
131         /* skip trailing spaces */
132         for (;(triple[i]!='\0')&&(isspace(triple[i]));i++)
133                 /* nothing else to do */ ;
134         /* if anything is left in the string we have a problem */
135         if (triple[i]!='\0')
136         {
137                 Debug(LDAP_DEBUG_ANY,"write_netgroup_triple(): string contains trailing data (entry skipped)",0,0,0);
138                 return 0;
139         }
140         /* write strings */
141         WRITE_INT32(fp,NSLCD_RESULT_SUCCESS);
142         WRITE_INT32(fp,NETGROUP_TYPE_TRIPLE);
143         WRITE_STRING_STRIPSPACE_LEN(fp,triple+hostb,hoste-hostb)
144         WRITE_STRING_STRIPSPACE_LEN(fp,triple+userb,usere-userb)
145         WRITE_STRING_STRIPSPACE_LEN(fp,triple+domainb,domaine-domainb)
146         /* we're done */
147         return 0;
148 }
149
150 static int write_netgroup(nssov_netgroup_cbp *cbp,Entry *entry)
151 {
152         int32_t tmpint32;
153         int i;
154         Attribute *a;
155
156         /* get the netgroup triples and member */
157         a = attr_find(entry->e_attrs,cbp->mi->mi_attrs[1].an_desc);
158         if ( a ) {
159         /* write the netgroup triples */
160                 for (i=0;i<a->a_numvals;i++)
161                 {
162                         if (write_netgroup_triple(cbp->fp, a->a_vals[i].bv_val))
163                                 return -1;
164                 }
165         }
166         a = attr_find(entry->e_attrs,cbp->mi->mi_attrs[2].an_desc);
167         if ( a ) {
168         /* write netgroup members */
169                 for (i=0;i<a->a_numvals;i++)
170                 {
171                         /* write the result code */
172                         WRITE_INT32(cbp->fp,NSLCD_RESULT_SUCCESS);
173                         /* write triple indicator */
174                         WRITE_INT32(cbp->fp,NETGROUP_TYPE_NETGROUP);
175                         /* write netgroup name */
176                         if (write_string_stripspace_len(cbp->fp,a->a_vals[i].bv_val,a->a_vals[i].bv_len))
177                                 return -1;
178                 }
179         }
180         /* we're done */
181         return 0;
182 }
183
184 NSSOV_CB(netgroup)
185
186 NSSOV_HANDLE(
187         netgroup,byname,
188         char fbuf[1024];
189         struct berval filter = {sizeof(fbuf)};
190         filter.bv_val = fbuf;
191         READ_STRING_BUF2(fp,cbp.buf,sizeof(cbp.buf));,
192         cbp.name.bv_len = tmpint32;
193         cbp.name.bv_val = cbp.buf;
194         Debug(LDAP_DEBUG_TRACE,"nssov_netgroup_byname(%s)",cbp.name.bv_val,0,0);,
195         NSLCD_ACTION_NETGROUP_BYNAME,
196         nssov_filter_byname(cbp.mi,0,&cbp.name,&filter)
197 )