r8257: add a samr rpc test page in the web server. It lists all level3
authorAndrew Tridgell <tridge@samba.org>
Sat, 9 Jul 2005 05:31:38 +0000 (05:31 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:19:26 +0000 (13:19 -0500)
information from QueryUserInfo for all users in the domain.

If you want to see why I am putting the effort into ejs, then please
read swat/scripting/samr.js, and compare it to other methods of rpc
access for our web management interface. Using ejs like this will make
building a rich interface _much_ easier.
(This used to be commit eb354f6da7ed79eb080f2ba47df2ea655e1891db)

swat/esptest/menu.js
swat/esptest/samr.esp [new file with mode: 0644]
swat/scripting/common.js
swat/scripting/samr.js [new file with mode: 0644]
testprogs/ejs/samr.js

index b78ca68ee8415d4b3813280e48b7929edc825a31..d46561f311dad6b152b02bd54edb4adefc555d77 100644 (file)
@@ -2,6 +2,7 @@
 simple_menu(
        "ESP Tests",
        "ldb database",       session_uri("/esptest/ldb.esp"),
+       "samr calls",         session_uri("/esptest/samr.esp"),
        "html forms",         session_uri("/esptest/formtest.esp"),
        "esp includes",       session_uri("/esptest/include.esp"),
        "session variables",  session_uri("/esptest/session.esp"),
diff --git a/swat/esptest/samr.esp b/swat/esptest/samr.esp
new file mode 100644 (file)
index 0000000..f0159fc
--- /dev/null
@@ -0,0 +1,35 @@
+<% page_header("columns", "ESP samr test"); 
+
+  include("/scripting/samr.js");
+%>
+
+<h1>Samba4 samr rpc test</h1>
+
+<%
+var conn    = new Object();
+var binding = "ncalrpc:";
+status = rpc_connect(conn, binding, "samr");
+check_status_ok(status);
+
+handle = samrConnect(conn);
+
+domains = samrEnumDomains(conn, handle);
+
+for (i=0;i<domains.length;i++) {
+    write("<h2>Domain " + domains[i].name + "</h2>\n");
+    sid = samrLookupDomain(conn, handle, domains[i].name);
+    dom_handle = samrOpenDomain(conn, handle, sid);
+    users = samrEnumDomainUsers(conn, dom_handle);
+    samrFillUserInfo(conn, dom_handle, users, 3);
+    if (users.length == 0) {
+           write("no users in domain<br>\n");
+    } else {
+           multi_table(users, "name");
+    }
+    samrClose(dom_handle);
+}
+
+%>
+
+
+<% page_footer(); %>
index 4fc3884db6fd6b524cd5be7dee17a25b6d6c3c2d..3321cfb77229375c74f8a6a338e6a1f0916f7865 100644 (file)
@@ -115,7 +115,7 @@ function simple_menu() {
 function table_element(i, o) {
        write("<tr><td>" + i + "</td><td>");
        if (typeof(o[i]) == "object") {
-               var first;
+               var j, first;
                first = true;
                for (j in o[i]) {
                        if (first == false) {
@@ -130,25 +130,15 @@ function table_element(i, o) {
        write("</td></tr>\n");
 }
 
-/*
-  return the number of elements in an object
-*/
-function elcount(o) {
-       var count = 0;
-       for (i in o) {
-               count++;
-       }
-       return count;
-}
-
 /*
   display a ejs object as a table. The header is optional
 */
 function simple_table(v) {
-       if (elcount(v) == 0) {
+       if (v.length == 0) {
                return;
        }
        write("<table class=\"data\">\n");
+       var r;
        for (r in v) {
                table_element(r, v);
        }
@@ -160,12 +150,10 @@ function simple_table(v) {
   attribute
 */
 function multi_table(array, header) {
-       if (elcount(array) == 0) {
-               return;
-       }
+       var i, n;
        write("<table class=\"data\">\n");
-       for (i in array) {
-               var v = array[i];
+       for (i=0;i<array.length;i++) {
+               var r, v = array[i];
                write('<tr><th colspan="2">' + v[header] + "</th></tr>\n");
                for (r in v) {
                        if (r != header) {
diff --git a/swat/scripting/samr.js b/swat/scripting/samr.js
new file mode 100644 (file)
index 0000000..474e704
--- /dev/null
@@ -0,0 +1,167 @@
+/*
+       samr rpc utility functions 
+*/     
+
+/*
+  helper function to setup a rpc io object, ready for input
+*/
+function irpcObj()
+{
+       var o = new Object();
+       o.input = new Object();
+       return o;
+}
+
+/*
+  check that a status result is OK
+*/
+function check_status_ok(status)
+{
+       if (status.is_ok != true) {
+               printVars(status);
+       }
+       assert(status.is_ok == true);
+}
+
+/*
+  return a list of names and indexes from a samArray
+*/
+function samArray(output)
+{
+       var list = new Array(output.num_entries);
+       if (output.sam == NULL) {
+               return list;
+       }
+       var entries = output.sam.entries;
+       for (i=0;i<output.num_entries;i++) {
+               list[i] = new Object();
+                list[i].name = entries[i].name;
+                list[i].idx  = entries[i].idx;
+       }
+       return list;
+}
+
+/*
+       connect to the sam database
+*/
+function samrConnect(conn)
+{
+       var io = irpcObj();
+       io.input.system_name = NULL;
+       io.input.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
+       status = dcerpc_samr_Connect(conn, io);
+       check_status_ok(status);
+       return io.output.connect_handle;
+}
+
+/*
+       close a handle
+*/
+function samrClose(conn, handle)
+{
+       var io = irpcObj();
+       io.input.handle = handle;
+       status = dcerpc_samr_Close(conn, io);
+       check_status_ok(status);
+}
+
+/*
+   get the sid for a domain
+*/
+function samrLookupDomain(conn, handle, domain)
+{
+       var io = irpcObj();
+       io.input.connect_handle = handle;
+       io.input.domain_name = domain;
+       status = dcerpc_samr_LookupDomain(conn, io);
+       check_status_ok(status);
+       return io.output.sid;
+}
+
+/*
+  open a domain by sid
+*/
+function samrOpenDomain(conn, handle, sid)
+{
+       var io = irpcObj();
+       io.input.connect_handle = handle;
+       io.input.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
+       io.input.sid = sid;
+       status = dcerpc_samr_OpenDomain(conn, io);
+       check_status_ok(status);
+       return io.output.domain_handle;
+}
+
+/*
+  open a user by rid
+*/
+function samrOpenUser(conn, handle, rid)
+{
+       var io = irpcObj();
+       io.input.domain_handle = handle;
+       io.input.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
+       io.input.rid = rid;
+       status = dcerpc_samr_OpenUser(conn, io);
+       check_status_ok(status);
+       return io.output.user_handle;
+}
+
+/*
+  return a list of all users
+*/
+function samrEnumDomainUsers(conn, dom_handle)
+{
+       var io = irpcObj();
+       io.input.domain_handle = dom_handle;
+       io.input.resume_handle = 0;
+       io.input.acct_flags = 0;
+       io.input.max_size = -1;
+       status = dcerpc_samr_EnumDomainUsers(conn, io);
+       check_status_ok(status);
+       return samArray(io.output);
+}
+
+/*
+  return a list of domains
+*/
+function samrEnumDomains(conn, handle)
+{
+       var io = irpcObj();
+       io.input.connect_handle = handle;
+       io.input.resume_handle = 0;
+       io.input.buf_size = -1;
+       status = dcerpc_samr_EnumDomains(conn, io);
+       check_status_ok(status);
+       return samArray(io.output);
+}
+
+/*
+  return information about a user
+*/
+function samrQueryUserInfo(conn, user_handle, level)
+{
+       var r, io = irpcObj();
+       io.input.user_handle = user_handle;
+       io.input.level = level;
+       status = dcerpc_samr_QueryUserInfo(conn, io);
+       check_status_ok(status);
+       return io.output.info.info3;
+}
+
+
+/*
+  fill a user array with user information from samrQueryUserInfo
+*/
+function samrFillUserInfo(conn, dom_handle, users, level)
+{
+       var i;
+       for (i=0;i<users.length;i++) {
+               var r, user_handle, info;
+               user_handle = samrOpenUser(conn, dom_handle, users[i].idx);
+               info = samrQueryUserInfo(conn, user_handle, level);
+               info.name = users[i].name;
+               info.idx  = users[i].idx;
+               users[i] = info;
+               samrClose(conn, user_handle);
+       }
+}
index 4cbe7b9bc8ba10cbbf7bf454149420eeaf5259e3..df54ca60623eb7e5ad6f863200b1c252c9628ad5 100644 (file)
@@ -24,16 +24,6 @@ function check_status_ok(status)
        assert(status.is_ok == true);
 }
 
-/*
-  form a lsa_String
-*/
-function lsaString(s)
-{
-       var o = new Object();
-       o.string = s;
-       return o;
-}
-
 /*
   test the samr_Connect interface
 */
@@ -67,7 +57,7 @@ function test_LookupDomain(conn, handle, domain)
        var io = irpcObj();
        print("Testing samr_LookupDomain\n");
        io.input.connect_handle = handle;
-       io.input.domain_name = lsaString(domain);
+       io.input.domain_name = domain;
        status = dcerpc_samr_LookupDomain(conn, io);
        check_status_ok(status);
        return io.output.sid;
@@ -107,7 +97,7 @@ function test_EnumDomainUsers(conn, dom_handle)
        }
        var entries = io.output.sam.entries;
        for (i=0;i<io.output.num_entries;i++) {
-               print("\t" + entries[i].name.string + "\n");
+               print("\t" + entries[i].name + "\n");
        }
 }
 
@@ -130,7 +120,7 @@ function test_EnumDomainGroups(conn, dom_handle)
        }
        var entries = io.output.sam.entries;
        for (i=0;i<io.output.num_entries;i++) {
-               print("\t" + entries[i].name.string + "\n");
+               print("\t" + entries[i].name + "\n");
        }
 }
 
@@ -163,10 +153,10 @@ function test_EnumDomains(conn, handle)
        }
        var entries = io.output.sam.entries;
        for (i=0;i<io.output.num_entries;i++) {
-               print("\t" + entries[i].name.string + "\n");
+               print("\t" + entries[i].name + "\n");
        }
        for (i=0;i<io.output.num_entries;i++) {
-               domain = entries[i].name.string;
+               domain = entries[i].name;
                print("Testing domain " + domain + "\n");
                sid = test_LookupDomain(conn, handle, domain);
                dom_handle = test_OpenDomain(conn, handle, sid);