1
0
mirror of https://github.com/samba-team/samba.git synced 2025-10-31 12:23:52 +03:00
Files
samba-mirror/source/scripting/ejs/mprutil.c
Andrew Tridgell e59ae64f60 r7072: moved the esp hooks calls to the ejs level, so we can call them from
both esp scripts and ejs scripts. This allows the smbscript program to
call all the existing extension calls like lpGet() and ldbSearch()

Also fixed smbscript to load smb.conf, and setup logging for DEBUG()

I left the unixAuth() routine in web_server/calls.c at the moment, as
that is really only useful for esp scripts. I imagine that as we
extend esp/ejs, we will put some functions in scripting/ejs/ for use
in both ejs and esp, and some functions in web_server/ where they will
only be accessed by esp web scripts
2007-10-10 13:17:12 -05:00

160 lines
3.9 KiB
C

/*
Unix SMB/CIFS implementation.
utility functions for manipulating mpr variables in ejs calls
Copyright (C) Andrew Tridgell 2005
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include "includes.h"
#include "lib/ejs/ejs.h"
#include "lib/ldb/include/ldb.h"
/*
add an indexed array element to a property
*/
static void mprAddArray(struct MprVar *var, int i, struct MprVar v)
{
char idx[16];
mprItoa(i, idx, sizeof(idx));
mprCreateProperty(var, idx, &v);
}
/*
construct a MprVar from a list
*/
struct MprVar mprList(const char *name, const char **list)
{
struct MprVar var;
int i;
var = mprCreateObjVar(name, MPR_DEFAULT_HASH_SIZE);
for (i=0;list && list[i];i++) {
mprAddArray(&var, i, mprCreateStringVar(list[i], 1));
}
return var;
}
/*
construct a string MprVar from a lump of data
*/
struct MprVar mprData(const uint8_t *p, size_t length)
{
struct MprVar var;
char *s = talloc_strndup(mprMemCtx(), p, length);
if (s == NULL) {
return mprCreateUndefinedVar();
}
var = mprCreateStringVar(s, 1);
talloc_free(s);
return var;
}
/*
turn a ldb_message into a ejs object variable
*/
struct MprVar mprLdbMessage(struct ldb_message *msg)
{
struct MprVar var;
int i;
/* we force some attributes to always be an array in the
returned structure. This makes the scripting easier, as you don't
need a special case for the single value case */
const char *multivalued[] = { "objectClass", "memberOf", "privilege",
"member", NULL };
struct MprVar val;
var = mprCreateObjVar(msg->dn, MPR_DEFAULT_HASH_SIZE);
for (i=0;i<msg->num_elements;i++) {
struct ldb_message_element *el = &msg->elements[i];
if (el->num_values == 1 &&
!str_list_check_ci(multivalued, el->name)) {
val = mprData(el->values[0].data, el->values[0].length);
} else {
int j;
val = mprCreateObjVar(el->name, MPR_DEFAULT_HASH_SIZE);
for (j=0;j<el->num_values;j++) {
mprAddArray(&val, j,
mprData(el->values[j].data,
el->values[j].length));
}
}
mprCreateProperty(&var, el->name, &val);
}
/* add the dn if it is not already specified */
if (mprGetProperty(&var, "dn", 0) == 0) {
val = mprCreateStringVar(msg->dn, 1);
mprCreateProperty(&var, "dn", &val);
}
return var;
}
/*
turn an array of ldb_messages into a ejs object variable
*/
struct MprVar mprLdbArray(struct ldb_message **msg, int count, const char *name)
{
struct MprVar res;
int i;
res = mprCreateObjVar(name?name:"(NULL)", MPR_DEFAULT_HASH_SIZE);
for (i=0;i<count;i++) {
mprAddArray(&res, i, mprLdbMessage(msg[i]));
}
return res;
}
/*
turn a MprVar string variable into a const char *
*/
const char *mprToString(const struct MprVar *v)
{
if (v->type != MPR_TYPE_STRING) return NULL;
return v->string;
}
/*
turn a MprVar object variable into a string list
this assumes the object variable consists only of strings
*/
const char **mprToList(TALLOC_CTX *mem_ctx, struct MprVar *v)
{
const char **list = NULL;
struct MprVar *el;
if (v->type != MPR_TYPE_OBJECT ||
v->properties == NULL) {
return NULL;
}
for (el=mprGetFirstProperty(v, MPR_ENUM_DATA);
el;
el=mprGetNextProperty(v, el, MPR_ENUM_DATA)) {
const char *s = mprToString(el);
if (s) {
list = str_list_add(list, s);
}
}
talloc_steal(mem_ctx, list);
return list;
}