r7072: moved the esp hooks calls to the ejs level, so we can call them from
[samba.git] / source / scripting / ejs / mprutil.c
1 /* 
2    Unix SMB/CIFS implementation.
3
4    utility functions for manipulating mpr variables in ejs calls
5
6    Copyright (C) Andrew Tridgell 2005
7    
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 2 of the License, or
11    (at your option) any later version.
12    
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17    
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 */
22
23 #include "includes.h"
24 #include "lib/ejs/ejs.h"
25 #include "lib/ldb/include/ldb.h"
26
27 /*
28   add an indexed array element to a property
29 */
30 static void mprAddArray(struct MprVar *var, int i, struct MprVar v)
31 {
32         char idx[16];
33         mprItoa(i, idx, sizeof(idx));
34         mprCreateProperty(var, idx, &v);
35 }
36
37 /*
38   construct a MprVar from a list
39 */
40 struct MprVar mprList(const char *name, const char **list)
41 {
42         struct MprVar var;
43         int i;
44
45         var = mprCreateObjVar(name, MPR_DEFAULT_HASH_SIZE);
46         for (i=0;list && list[i];i++) {
47                 mprAddArray(&var, i, mprCreateStringVar(list[i], 1));
48         }
49         return var;
50 }
51
52 /*
53   construct a string MprVar from a lump of data
54 */
55 struct MprVar mprData(const uint8_t *p, size_t length)
56 {
57         struct MprVar var;
58         char *s = talloc_strndup(mprMemCtx(), p, length);
59         if (s == NULL) {
60                 return mprCreateUndefinedVar();
61         }
62         var = mprCreateStringVar(s, 1);
63         talloc_free(s);
64         return var;
65 }
66
67 /*
68   turn a ldb_message into a ejs object variable
69 */
70 struct MprVar mprLdbMessage(struct ldb_message *msg)
71 {
72         struct MprVar var;
73         int i;
74         /* we force some attributes to always be an array in the
75            returned structure. This makes the scripting easier, as you don't 
76            need a special case for the single value case */
77         const char *multivalued[] = { "objectClass", "memberOf", "privilege", 
78                                             "member", NULL };
79         struct MprVar val;
80
81         var = mprCreateObjVar(msg->dn, MPR_DEFAULT_HASH_SIZE);
82
83         for (i=0;i<msg->num_elements;i++) {
84                 struct ldb_message_element *el = &msg->elements[i];
85                 if (el->num_values == 1 &&
86                     !str_list_check_ci(multivalued, el->name)) {
87                         val = mprData(el->values[0].data, el->values[0].length);
88                 } else {
89                         int j;
90                         val = mprCreateObjVar(el->name, MPR_DEFAULT_HASH_SIZE);
91                         for (j=0;j<el->num_values;j++) {
92                                 mprAddArray(&val, j, 
93                                             mprData(el->values[j].data, 
94                                                     el->values[j].length));
95                         }
96                 }
97                 mprCreateProperty(&var, el->name, &val);
98         }
99
100         /* add the dn if it is not already specified */
101         if (mprGetProperty(&var, "dn", 0) == 0) {
102                 val = mprCreateStringVar(msg->dn, 1);
103                 mprCreateProperty(&var, "dn", &val);
104         }
105         
106         return var;             
107 }
108
109
110 /*
111   turn an array of ldb_messages into a ejs object variable
112 */
113 struct MprVar mprLdbArray(struct ldb_message **msg, int count, const char *name)
114 {
115         struct MprVar res;
116         int i;
117
118         res = mprCreateObjVar(name?name:"(NULL)", MPR_DEFAULT_HASH_SIZE);
119         for (i=0;i<count;i++) {
120                 mprAddArray(&res, i, mprLdbMessage(msg[i]));
121         }
122         return res;     
123 }
124
125
126 /*
127   turn a MprVar string variable into a const char *
128  */
129 const char *mprToString(const struct MprVar *v)
130 {
131         if (v->type != MPR_TYPE_STRING) return NULL;
132         return v->string;
133 }
134
135 /*
136   turn a MprVar object variable into a string list
137   this assumes the object variable consists only of strings
138 */
139 const char **mprToList(TALLOC_CTX *mem_ctx, struct MprVar *v)
140 {
141         const char **list = NULL;
142         struct MprVar *el;
143
144         if (v->type != MPR_TYPE_OBJECT ||
145             v->properties == NULL) {
146                 return NULL;
147         }
148         for (el=mprGetFirstProperty(v, MPR_ENUM_DATA);
149              el;
150              el=mprGetNextProperty(v, el, MPR_ENUM_DATA)) {
151                 const char *s = mprToString(el);
152                 if (s) {
153                         list = str_list_add(list, s);
154                 }
155         }
156         talloc_steal(mem_ctx, list);
157         return list;
158 }
159