r9391: Convert all the code to use struct ldb_dn to ohandle ldap like distinguished...
[kamenim/samba.git] / source4 / scripting / ejs / mprutil.c
index 14d120c45aa1c4c986a23a731564e26cfaa58411..8f1e5f71c8738d9226ed6cc848d1fbee27cb701f 100644 (file)
@@ -29,7 +29,7 @@
 */
 struct MprVar mprObject(const char *name)
 {
-       return ejsCreateObj(name?name:"(NULL)", MPR_DEFAULT_HASH_SIZE);
+       return ejsCreateObj(name && *name?name:"(NULL)", MPR_DEFAULT_HASH_SIZE);
 }
 
 /*
@@ -151,7 +151,7 @@ struct MprVar mprData(const uint8_t *p, size_t length)
 /*
   turn a ldb_message into a ejs object variable
 */
-struct MprVar mprLdbMessage(struct ldb_message *msg)
+static struct MprVar mprLdbMessage(struct ldb_context *ldb, struct ldb_message *msg)
 {
        struct MprVar var;
        int i;
@@ -161,21 +161,34 @@ struct MprVar mprLdbMessage(struct ldb_message *msg)
        const char *multivalued[] = { "objectClass", "memberOf", "privilege", 
                                            "member", NULL };
 
-       var = mprObject(msg->dn);
+       var = mprObject(ldb_dn_linearize(msg, msg->dn));
 
        for (i=0;i<msg->num_elements;i++) {
                struct ldb_message_element *el = &msg->elements[i];
                struct MprVar val;
+               const struct ldb_attrib_handler *attr;
+               struct ldb_val v;
+
+               attr = ldb_attrib_handler(ldb, el->name);
+               if (attr == NULL) {
+                       goto failed;
+               }
+
                if (el->num_values == 1 &&
                    !str_list_check_ci(multivalued, el->name)) {
-                       val = mprData(el->values[0].data, el->values[0].length);
+                       if (attr->ldif_write_fn(ldb, msg, &el->values[0], &v) != 0) {
+                               goto failed;
+                       }
+                       val = mprData(v.data, v.length);
                } else {
                        int j;
                        val = mprObject(el->name);
                        for (j=0;j<el->num_values;j++) {
-                               mprAddArray(&val, j, 
-                                           mprData(el->values[j].data, 
-                                                   el->values[j].length));
+                               if (attr->ldif_write_fn(ldb, msg, 
+                                                       &el->values[j], &v) != 0) {
+                                       goto failed;
+                               }
+                               mprAddArray(&val, j, mprData(v.data, v.length));
                        }
                }
                mprSetVar(&var, el->name, val);
@@ -183,24 +196,27 @@ struct MprVar mprLdbMessage(struct ldb_message *msg)
 
        /* add the dn if it is not already specified */
        if (mprGetProperty(&var, "dn", 0) == 0) {
-               mprSetVar(&var, "dn", mprString(msg->dn));
+               mprSetVar(&var, "dn", mprString(ldb_dn_linearize(msg, msg->dn)));
        }
        
        return var;             
+failed:
+       return mprCreateUndefinedVar();
 }
 
 
 /*
   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 mprLdbArray(struct ldb_context *ldb, 
+                         struct ldb_message **msg, int count, const char *name)
 {
        struct MprVar res;
        int i;
 
        res = mprObject(name);
        for (i=0;i<count;i++) {
-               mprAddArray(&res, i, mprLdbMessage(msg[i]));
+               mprAddArray(&res, i, mprLdbMessage(ldb, msg[i]));
        }
        if (i==0) {
                mprSetVar(&res, "length", mprCreateIntegerVar(0));
@@ -301,6 +317,31 @@ struct MprVar mprNTSTATUS(NTSTATUS status)
        return res;
 }
 
+/*
+  create a data-blob in a mpr variable
+*/
+struct MprVar mprDataBlob(DATA_BLOB blob)
+{
+       struct MprVar res;
+       struct data_blob *pblob = talloc(mprMemCtx(), struct data_blob);
+       *pblob = data_blob_talloc(pblob, blob.data, blob.length);
+
+       res = mprObject("DATA_BLOB");
+
+       mprSetVar(&res, "size", mprCreateIntegerVar(blob.length));
+       mprSetPtrChild(&res, "blob", pblob);
+
+       return res;
+}
+
+/*
+  return a data blob from a mpr var created using mprDataBlob
+*/
+struct data_blob *mprToDataBlob(struct MprVar *v)
+{
+       return talloc_get_type(mprGetPtr(v, "blob"), struct data_blob);
+}
+
 /*
   turn a WERROR into a MprVar object with lots of funky properties
 */
@@ -387,7 +428,7 @@ void mpr_ReturnString(int eid, const char *s)
 }
 
 /*
-  get a poiner in the current object
+  get a pointer in the current object
 */
 void *mprGetThisPtr(int eid, const char *name)
 {