Author: skel Date: 2005-08-20 22:50:13 +0000 (Sat, 20 Aug 2005) New Revision: 9436
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=9436 Log: added cac_SamEnableUser() - needs to be fixed Added: branches/SOC/SAMBA_3_0/source/libmsrpc/test/sam/enable.c Modified: branches/SOC/SAMBA_3_0/source/include/libmsrpc.h branches/SOC/SAMBA_3_0/source/libmsrpc/cac_samr.c branches/SOC/SAMBA_3_0/source/libmsrpc/test/Makefile Changeset: Modified: branches/SOC/SAMBA_3_0/source/include/libmsrpc.h =================================================================== --- branches/SOC/SAMBA_3_0/source/include/libmsrpc.h 2005-08-20 22:47:53 UTC (rev 9435) +++ branches/SOC/SAMBA_3_0/source/include/libmsrpc.h 2005-08-20 22:50:13 UTC (rev 9436) @@ -1570,6 +1570,24 @@ int cac_SamSetAliasMembers(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamSetAliasMembers *op); +struct SamUserChangePasswd { + struct { + /**The username*/ + char *username; + + /**The current password*/ + char *password; + + /**The new password*/ + char *new_password; + } in; +}; +/**Used by a user to change their password*/ +int cac_SamUserChangePasswd(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamUserChangePasswd *op); + +/*Enables a user*/ +int cac_SamEnableUser(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, POLICY_HND *user_hnd); + 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-20 22:47:53 UTC (rev 9435) +++ branches/SOC/SAMBA_3_0/source/libmsrpc/cac_samr.c 2005-08-20 22:50:13 UTC (rev 9436) @@ -1451,3 +1451,103 @@ } +int cac_SamUserChangePasswd(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamUserChangePasswd *op) { + SMBCSRV *srv = NULL; + + if(!hnd) + return CAC_FAILURE; + + if(!hnd->_internal.ctx) { + hnd->status = NT_STATUS_INVALID_HANDLE; + return CAC_FAILURE; + } + + if(!op || !op->in.username || !op->in.password || !op->in.new_password || !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; + } + + /*open a session on SAMR if we don't have one*/ + if(!hnd->_internal.pipes[PI_SAMR]) { + if(!cli_nt_session_open(&srv->cli, PI_SAMR)) { + hnd->status = NT_STATUS_UNSUCCESSFUL; + return CAC_FAILURE; + } + + hnd->_internal.pipes[PI_SAMR] = True; + } + + srv->cli.pipe_idx = PI_SAMR; + + hnd->status = cli_samr_chgpasswd_user(&(srv->cli), mem_ctx, op->in.username, op->in.new_password, op->in.password); + + if(!NT_STATUS_IS_OK(hnd->status)) + return CAC_FAILURE; + + return CAC_SUCCESS; +} + +int cac_SamEnableUser(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, POLICY_HND *user_hnd) { + SMBCSRV *srv = NULL; + + SAM_USERINFO_CTR *get_ctr; + SAM_USERINFO_CTR set_ctr; + SAM_USER_INFO_10 info10; + uint32 acb_mask = 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(!user_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; + + /*info_level = 21 is the only level that I have found to work reliably. It would be nice if user_level = 10 worked.*/ + hnd->status = cli_samr_query_userinfo( &(srv->cli), mem_ctx, user_hnd, 21, &get_ctr); + + if(!NT_STATUS_IS_OK(hnd->status)) + return CAC_FAILURE; + + /**check the ACB mask*/ + if((get_ctr->info.id21->acb_info & ACB_DISABLED) == ACB_DISABLED) { + /*toggle the disabled bit*/ + acb_mask = (get_ctr->info.id21->acb_info ^ ACB_DISABLED); + } + else { + /*the user is already enabled so just return success*/ + return CAC_SUCCESS; + } + + init_sam_user_info10(&info10, acb_mask); + + set_ctr.switch_value = 10; + set_ctr.info.id10 = &info10; + + /*now set the userinfo*/ + hnd->status = cli_samr_set_userinfo( &(srv->cli), mem_ctx, user_hnd, 10, &(srv->cli.user_session_key), &set_ctr); + + if(!NT_STATUS_IS_OK(hnd->status)) + return CAC_FAILURE; + + return CAC_SUCCESS; +} Modified: branches/SOC/SAMBA_3_0/source/libmsrpc/test/Makefile =================================================================== --- branches/SOC/SAMBA_3_0/source/libmsrpc/test/Makefile 2005-08-20 22:47:53 UTC (rev 9435) +++ branches/SOC/SAMBA_3_0/source/libmsrpc/test/Makefile 2005-08-20 22:50:13 UTC (rev 9436) @@ -82,5 +82,8 @@ samalias: sam/samalias.o test_util.o $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< test_util.o $(LIBS) +enable: sam/enable.o test_util.o + $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< test_util.o $(LIBS) + clean: rm -f $(TESTS) *.o lsa/*.o reg/*.o sam/*.o Added: branches/SOC/SAMBA_3_0/source/libmsrpc/test/sam/enable.c =================================================================== --- branches/SOC/SAMBA_3_0/source/libmsrpc/test/sam/enable.c 2005-08-20 22:47:53 UTC (rev 9435) +++ branches/SOC/SAMBA_3_0/source/libmsrpc/test/sam/enable.c 2005-08-20 22:50:13 UTC (rev 9436) @@ -0,0 +1,63 @@ + +#include "libmsrpc.h" +#include "test_util.h" + +int main(int argc, char **argv) { + CacServerHandle *hnd = NULL; + TALLOC_CTX *mem_ctx = NULL; + + struct SamOpenUser ou; + + fstring tmp; + + mem_ctx = talloc_init("cac_samgroup"); + + hnd = cac_NewServerHandle(); + + cac_SetAuthDataFn(hnd, cactest_GetAuthDataFn); + + cac_parse_cmd_line(argc, argv, hnd); + + if(!cac_Connect(hnd, NULL)) { + fprintf(stderr, "Could not connect to server %s. Error: %s\n", hnd->server, nt_errstr(hnd->status)); + exit(-1); + } + + struct SamOpenDomain sod; + ZERO_STRUCT(sod); + + sod.in.access = MAXIMUM_ALLOWED_ACCESS; + + if(!cac_SamOpenDomain(hnd, mem_ctx, &sod)) { + fprintf(stderr, "Could not open domain. Error: %s\n", nt_errstr(hnd->status)); + goto done; + } + + ZERO_STRUCT(ou); + printf("Enter username: "); + cactest_readline(stdin, tmp); + + ou.in.username = talloc_strdup(mem_ctx, tmp); + ou.in.access = MAXIMUM_ALLOWED_ACCESS; + ou.in.sam = sod.out.pol; + + if(!cac_SamOpenUser(hnd, mem_ctx, &ou)) { + fprintf(stderr, "Could not open user. Error: %s\n", nt_errstr(hnd->status)); + goto done; + } + + /*enable the user*/ + if(!cac_SamEnableUser(hnd, mem_ctx, ou.out.user)) { + fprintf(stderr, "Could not enable user: %s\n", nt_errstr(hnd->status)); + } + +done: + cac_SamClose(hnd, mem_ctx, sod.out.pol); + + cac_FreeHandle(hnd); + + talloc_destroy(mem_ctx); + + return 0; +} +
