svn commit: samba r9367 - in branches/SOC/SAMBA_3_0/source: include
libmsrpc
skel at samba.org
skel at samba.org
Wed Aug 17 17:01:41 GMT 2005
Author: skel
Date: 2005-08-17 17:01:41 +0000 (Wed, 17 Aug 2005)
New Revision: 9367
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=9367
Log:
added functions to remove/list/clear/set alias members
Modified:
branches/SOC/SAMBA_3_0/source/include/libmsrpc.h
branches/SOC/SAMBA_3_0/source/libmsrpc/cac_samr.c
Changeset:
Modified: branches/SOC/SAMBA_3_0/source/include/libmsrpc.h
===================================================================
--- branches/SOC/SAMBA_3_0/source/include/libmsrpc.h 2005-08-17 15:23:52 UTC (rev 9366)
+++ branches/SOC/SAMBA_3_0/source/include/libmsrpc.h 2005-08-17 17:01:41 UTC (rev 9367)
@@ -1516,6 +1516,58 @@
int cac_SamAddAliasMember(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamAddAliasMember *op);
+struct SamRemoveAliasMember {
+ struct {
+ /**Open handle to the alias*/
+ POLICY_HND *alias_hnd;
+
+ /**The SID of the member*/
+ DOM_SID *sid;
+ } in;
+};
+
+int cac_SamRemoveAliasMember(CacServerHandle *hnd, TALLOC_CTX *mem_Ctx, struct SamRemoveAliasMember *op);
+
+struct SamGetAliasMembers {
+ struct {
+ /**Open handle to the alias*/
+ POLICY_HND *alias_hnd;
+ } in;
+
+ struct {
+ /**The number of members*/
+ uint32 num_members;
+
+ /**An array storing the SIDs of the users*/
+ DOM_SID *sids;
+ } out;
+};
+
+int cac_SamGetAliasMembers(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamGetAliasMembers *op);
+
+/**@ingroup SAM_Functions
+ * Removes all the members of an alias - warning: if this function fails is is possible that some but not all members were removed
+ */
+int cac_SamClearAliasMembers(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, POLICY_HND *alias_hnd);
+
+struct SamSetAliasMembers {
+ struct {
+ /**Open handle to the group*/
+ POLICY_HND *alias_hnd;
+
+ /**Number of members in the group - if this is 0, all members of the group will be removed*/
+ uint32 num_members;
+
+ /**The SIDs of the accounts to add*/
+ DOM_SID *sids;
+ } in;
+};
+
+/**@ingroup SAM_Functions
+ * Removes all the users from an alias and adds a list of members to the alias*/
+int cac_SamSetAliasMembers(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamSetAliasMembers *op);
+
+
void cac_GetAuthDataFn(const char * pServer,
const char * pShare,
char * pWorkgroup,
Modified: branches/SOC/SAMBA_3_0/source/libmsrpc/cac_samr.c
===================================================================
--- branches/SOC/SAMBA_3_0/source/libmsrpc/cac_samr.c 2005-08-17 15:23:52 UTC (rev 9366)
+++ branches/SOC/SAMBA_3_0/source/libmsrpc/cac_samr.c 2005-08-17 17:01:41 UTC (rev 9367)
@@ -1274,3 +1274,175 @@
return CAC_SUCCESS;
}
+int cac_SamRemoveAliasMember(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamRemoveAliasMember *op) {
+ SMBCSRV *srv = NULL;
+
+ if(!hnd)
+ return CAC_FAILURE;
+
+ if(!hnd->_internal.ctx || !hnd->_internal.pipes[PI_SAMR]) {
+ hnd->status = NT_STATUS_INVALID_HANDLE;
+ return CAC_FAILURE;
+ }
+
+ if(!op || !op->in.alias_hnd || !op->in.sid || !mem_ctx) {
+ hnd->status = NT_STATUS_INVALID_PARAMETER;
+ return CAC_FAILURE;
+ }
+
+ srv = cac_GetServer(hnd);
+ if(!srv) {
+ hnd->status = NT_STATUS_UNSUCCESSFUL;
+ return CAC_FAILURE;
+ }
+
+ srv->cli.pipe_idx = PI_SAMR;
+
+ hnd->status = cli_samr_del_aliasmem( &(srv->cli), mem_ctx, op->in.alias_hnd, op->in.sid);
+
+ if(!NT_STATUS_IS_OK(hnd->status))
+ return CAC_FAILURE;
+
+ return CAC_SUCCESS;
+}
+
+int cac_SamGetAliasMembers(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamGetAliasMembers *op) {
+ SMBCSRV *srv = NULL;
+
+ uint32 num_mem_out;
+ DOM_SID *sids_out;
+
+ if(!hnd)
+ return CAC_FAILURE;
+
+ if(!hnd->_internal.ctx || !hnd->_internal.pipes[PI_SAMR]) {
+ hnd->status = NT_STATUS_INVALID_HANDLE;
+ return CAC_FAILURE;
+ }
+
+ if(!op || !op->in.alias_hnd || !mem_ctx) {
+ hnd->status = NT_STATUS_INVALID_PARAMETER;
+ return CAC_FAILURE;
+ }
+
+ srv = cac_GetServer(hnd);
+ if(!srv) {
+ hnd->status = NT_STATUS_UNSUCCESSFUL;
+ return CAC_FAILURE;
+ }
+
+ srv->cli.pipe_idx = PI_SAMR;
+
+ hnd->status = cli_samr_query_aliasmem( &(srv->cli), mem_ctx, op->in.alias_hnd, &num_mem_out, &sids_out);
+
+ if(!NT_STATUS_IS_OK(hnd->status))
+ return CAC_FAILURE;
+
+ op->out.num_members = num_mem_out;
+ op->out.sids = sids_out;
+
+ return CAC_SUCCESS;
+}
+
+int cac_SamClearAliasMembers(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, POLICY_HND *alias_hnd) {
+ SMBCSRV *srv = NULL;
+
+ int result = CAC_SUCCESS;
+
+ uint32 i = 0;
+
+ uint32 num_mem = 0;
+ DOM_SID *sid = NULL;
+
+ NTSTATUS status;
+
+ if(!hnd)
+ return CAC_FAILURE;
+
+ if(!hnd->_internal.ctx || !hnd->_internal.pipes[PI_SAMR]) {
+ hnd->status = NT_STATUS_INVALID_HANDLE;
+ return CAC_FAILURE;
+ }
+
+ if(!alias_hnd || !mem_ctx) {
+ hnd->status = NT_STATUS_INVALID_PARAMETER;
+ return CAC_FAILURE;
+ }
+
+ srv = cac_GetServer(hnd);
+ if(!srv) {
+ hnd->status = NT_STATUS_UNSUCCESSFUL;
+ return CAC_FAILURE;
+ }
+
+ srv->cli.pipe_idx = PI_SAMR;
+
+ hnd->status = cli_samr_query_aliasmem(&(srv->cli), mem_ctx, alias_hnd, &num_mem, &sid);
+
+ if(!NT_STATUS_IS_OK(hnd->status))
+ return CAC_FAILURE;
+
+ /*try to delete the users one by one*/
+ for(i = 0; i < num_mem && NT_STATUS_IS_OK(hnd->status); i++) {
+ hnd->status = cli_samr_del_aliasmem(&(srv->cli), mem_ctx, alias_hnd, &sid[i]);
+ }
+
+ /*if not all members could be removed, then try to re-add the members that were already deleted*/
+ if(!NT_STATUS_IS_OK(hnd->status)) {
+ status = NT_STATUS_OK;
+
+ for(i -= 1; i >= 0 && NT_STATUS_IS_OK(status); i--) {
+ status = cli_samr_add_aliasmem( &(srv->cli), mem_ctx, alias_hnd, &sid[i]);
+ }
+
+ /*we return with the NTSTATUS error that we got when trying to delete users*/
+ if(!NT_STATUS_IS_OK(status))
+ result = CAC_FAILURE;
+ }
+
+ talloc_free(sid);
+ return result;
+}
+
+int cac_SamSetAliasMembers(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamSetAliasMembers *op) {
+ SMBCSRV *srv = NULL;
+
+ uint32 i = 0;
+
+ if(!hnd)
+ return CAC_FAILURE;
+
+ if(!hnd->_internal.ctx || !hnd->_internal.pipes[PI_SAMR]) {
+ hnd->status = NT_STATUS_INVALID_HANDLE;
+ return CAC_FAILURE;
+ }
+
+ if(!op || !op->in.alias_hnd || !mem_ctx) {
+ hnd->status = NT_STATUS_INVALID_PARAMETER;
+ return CAC_FAILURE;
+ }
+
+ srv = cac_GetServer(hnd);
+ if(!srv) {
+ hnd->status = NT_STATUS_UNSUCCESSFUL;
+ return CAC_FAILURE;
+ }
+
+ srv->cli.pipe_idx = PI_SAMR;
+
+ /*use cac_SamClearAliasMembers() to clear them*/
+ if(!cac_SamClearAliasMembers(hnd, mem_ctx, op->in.alias_hnd))
+ return CAC_FAILURE; /*hnd->status is already set*/
+
+
+ for(i = 0; i < op->in.num_members && NT_STATUS_IS_OK(hnd->status); i++) {
+ hnd->status = cli_samr_add_aliasmem( &(srv->cli), mem_ctx, op->in.alias_hnd, &(op->in.sids[i]));
+ }
+
+ if(!NT_STATUS_IS_OK(hnd->status))
+ return CAC_FAILURE;
+
+ return CAC_SUCCESS;
+
+}
+
More information about the samba-cvs
mailing list