const char *domain_name;
};
+/*
+ state associated with a open user handle
+*/
+struct samr_user_state {
+ TALLOC_CTX *mem_ctx;
+ uint32 access_mask;
+ const char *user_sid;
+ const char *user_name;
+};
+
/*
destroy an open connection. This closes the database connection
struct samr_OpenDomain *r)
{
struct dcesrv_handle *h_conn, *h_domain;
- const char *sidstr, *domain_name;
+ char *sidstr, *domain_name;
struct samr_domain_state *state;
TALLOC_CTX *mem_ctx2;
samr_EnumDomainGroups
*/
static NTSTATUS samr_EnumDomainGroups(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
- struct samr_EnumDomainGroups *r)
+ struct samr_EnumDomainGroups *r)
{
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
}
+/*
+ samr_CreateUser2
+*/
+static NTSTATUS samr_CreateUser2(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+ struct samr_CreateUser2 *r)
+{
+ struct samr_user_state *state;
+ struct dcesrv_handle *h = dcesrv_handle_fetch(dce_call->conn,
+ r->in.handle,
+ SAMR_HANDLE_DOMAIN);
+ DCESRV_CHECK_HANDLE(h);
+
+ /* check if the user already exists */
+ /* read the default user template */
+ /* allocate a rid */
+ /* create a ldb_message for the user */
+ /* create the user */
+ /* create user state and new policy handle */
+
+
+ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+}
+
+
/*
samr_CreateUser
*/
static NTSTATUS samr_CreateUser(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
- struct samr_CreateUser *r)
+ struct samr_CreateUser *r)
{
- DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+ struct samr_CreateUser2 r2;
+ uint32 access_granted, rid;
+
+
+ /* a simple wrapper around samr_CreateUser2 works nicely */
+ r2.in.handle = r->in.handle;
+ r2.in.username = r->in.username;
+ r2.in.acct_flags = 1234;
+ r2.in.access_mask = r->in.access_mask;
+ r2.out.acct_handle = r->out.acct_handle;
+ r2.out.access_granted = &access_granted;
+ r2.out.rid = &rid;
+
+ return samr_CreateUser2(dce_call, mem_ctx, &r2);
}
}
-/*
- samr_CreateUser2
-*/
-static NTSTATUS samr_CreateUser2(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
- struct samr_CreateUser2 *r)
-{
- DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
-}
-
-
/*
samr_QueryDisplayInfo3
*/
{
struct ldb_message **msgs;
int ret;
- const char * const attrs[] = {"minPwdLength", "pwdProperties", NULL };
+ char * const attrs[] = {"minPwdLength", "pwdProperties", NULL };
if (r->in.name == NULL || r->in.name->name == NULL) {
return NT_STATUS_NO_SUCH_DOMAIN;
}
- ret = samdb_search(&msgs, attrs,
+ ret = samdb_search(mem_ctx, &msgs, attrs,
"(&(name=%s)(objectclass=domain))",
r->in.name->name);
if (ret <= 0) {
return NT_STATUS_NO_SUCH_DOMAIN;
}
if (ret > 1) {
- samdb_search_free(msgs);
+ samdb_search_free(mem_ctx, msgs);
return NT_STATUS_INTERNAL_DB_CORRUPTION;
}
r->out.info.min_pwd_len = samdb_result_uint(msgs[0], "minPwdLength", 0);
r->out.info.password_properties = samdb_result_uint(msgs[0], "pwdProperties", 1);
- samdb_search_free(msgs);
+ samdb_search_free(mem_ctx, msgs);
return NT_STATUS_OK;
}
return 0;
}
+/*
+ a alloc function for ldb
+*/
+static void *samdb_alloc(void *context, void *ptr, size_t size)
+{
+ return talloc_realloc((TALLOC_CTX *)context, ptr, size);
+}
/*
search the sam for the specified attributes - va_list varient
*/
-int samdb_search_v(struct ldb_message ***res,
- const char * const *attrs,
+int samdb_search_v(TALLOC_CTX *mem_ctx,
+ struct ldb_message ***res,
+ char * const *attrs,
const char *format,
va_list ap)
{
return -1;
}
+ ldb_set_alloc(sam_db, samdb_alloc, mem_ctx);
+
count = ldb_search(sam_db, NULL, LDB_SCOPE_SUBTREE, expr, attrs, res);
free(expr);
/*
search the sam for the specified attributes - varargs varient
*/
-int samdb_search(struct ldb_message ***res,
- const char * const *attrs,
+int samdb_search(TALLOC_CTX *mem_ctx,
+ struct ldb_message ***res,
+ char * const *attrs,
const char *format, ...)
{
va_list ap;
int count;
va_start(ap, format);
- count = samdb_search_v(res, attrs, format, ap);
+ count = samdb_search_v(mem_ctx, res, attrs, format, ap);
va_end(ap);
return count;
/*
free up a search result
*/
-int samdb_search_free(struct ldb_message **res)
+int samdb_search_free(TALLOC_CTX *mem_ctx, struct ldb_message **res)
{
+ ldb_set_alloc(sam_db, samdb_alloc, mem_ctx);
return ldb_search_free(sam_db, res);
}
/*
search the sam for a single string attribute in exactly 1 record
*/
-const char *samdb_search_string(TALLOC_CTX *mem_ctx,
- const char *attr_name,
- const char *format, ...)
+char *samdb_search_string(TALLOC_CTX *mem_ctx,
+ const char *attr_name,
+ const char *format, ...)
{
va_list ap;
int count;
- const char * const attrs[2] = { attr_name, NULL };
+ char * const attrs[2] = { attr_name, NULL };
struct ldb_message **res = NULL;
- const char *str = NULL;
+ char *str = NULL;
va_start(ap, format);
- count = samdb_search_v(&res, attrs, format, ap);
+ count = samdb_search_v(mem_ctx, &res, attrs, format, ap);
va_end(ap);
if (count == 0) {
res[0]->elements[0].values[0].data == NULL) {
DEBUG(1,("samdb: search for %s %s not single valued\n",
attr_name, format));
- samdb_search_free(res);
+ samdb_search_free(mem_ctx, res);
return NULL;
}
res[0]->elements[0].values[0].data,
res[0]->elements[0].values[0].length);
- samdb_search_free(res);
+ samdb_search_free(mem_ctx, res);
return str;
}
{
va_list ap;
int count, i;
- const char * const attrs[2] = { attr_name, NULL };
+ char * const attrs[2] = { attr_name, NULL };
struct ldb_message **res = NULL;
va_start(ap, format);
- count = samdb_search_v(&res, attrs, format, ap);
+ count = samdb_search_v(mem_ctx, &res, attrs, format, ap);
va_end(ap);
if (count <= 0) {
res[i]->elements[0].values[0].data == NULL) {
DEBUG(1,("samdb: search for %s %s not single valued\n",
attr_name, format));
- samdb_search_free(res);
+ samdb_search_free(mem_ctx, res);
return -1;
}
}
*strs = talloc_array_p(mem_ctx, char *, count+1);
if (! *strs) {
- samdb_search_free(res);
+ samdb_search_free(mem_ctx, res);
return -1;
}
}
(*strs)[count] = NULL;
- samdb_search_free(res);
+ samdb_search_free(mem_ctx, res);
return count;
}