diff options
Diffstat (limited to 'source3/libmsrpc')
-rw-r--r-- | source3/libmsrpc/Doxyfile | 173 | ||||
-rw-r--r-- | source3/libmsrpc/cac_lsarpc.c | 1255 | ||||
-rw-r--r-- | source3/libmsrpc/cac_samr.c | 2706 | ||||
-rw-r--r-- | source3/libmsrpc/cac_svcctl.c | 631 | ||||
-rw-r--r-- | source3/libmsrpc/cac_winreg.c | 1177 | ||||
-rw-r--r-- | source3/libmsrpc/libmsrpc.c | 349 | ||||
-rw-r--r-- | source3/libmsrpc/libmsrpc_internal.c | 775 |
7 files changed, 0 insertions, 7066 deletions
diff --git a/source3/libmsrpc/Doxyfile b/source3/libmsrpc/Doxyfile deleted file mode 100644 index f4e6f5e51b..0000000000 --- a/source3/libmsrpc/Doxyfile +++ /dev/null @@ -1,173 +0,0 @@ -# Doxyfile 0.1 - -#--------------------------------------------------------------------------- -# General configuration options -#--------------------------------------------------------------------------- -PROJECT_NAME = libmsrpc -PROJECT_NUMBER = - -# NOTE: By default, Doxygen writes into the dox/ subdirectory of the -# invocation directory. If you want to put it somewhere else, for -# example, to write straight into a webserver directory, then override -# this variable in a configuration concatenated to this one: Doxygen -# doesn't mind variables being redefined. - -OUTPUT_DIRECTORY = dox - -OUTPUT_LANGUAGE = English -EXTRACT_ALL = YES -EXTRACT_PRIVATE = YES -EXTRACT_STATIC = YES -HIDE_UNDOC_MEMBERS = NO -HIDE_UNDOC_CLASSES = NO -BRIEF_MEMBER_DESC = YES -REPEAT_BRIEF = YES -ALWAYS_DETAILED_SEC = NO -FULL_PATH_NAMES = YES -STRIP_FROM_PATH = $(PWD)/ -INTERNAL_DOCS = YES -CLASS_DIAGRAMS = YES -SOURCE_BROWSER = YES -INLINE_SOURCES = YES -STRIP_CODE_COMMENTS = NO -CASE_SENSE_NAMES = YES -SHORT_NAMES = NO -HIDE_SCOPE_NAMES = YES -VERBATIM_HEADERS = YES -SHOW_INCLUDE_FILES = YES -JAVADOC_AUTOBRIEF = YES -INHERIT_DOCS = YES -INLINE_INFO = YES -SORT_MEMBER_DOCS = NO -DISTRIBUTE_GROUP_DOC = NO -TAB_SIZE = 8 -GENERATE_TODOLIST = YES -GENERATE_TESTLIST = YES -GENERATE_BUGLIST = YES -ALIASES = -ENABLED_SECTIONS = -MAX_INITIALIZER_LINES = 30 -OPTIMIZE_OUTPUT_FOR_C = YES -SHOW_USED_FILES = YES -REFERENCED_BY_RELATION = YES -#--------------------------------------------------------------------------- -# configuration options related to warning and progress messages -#--------------------------------------------------------------------------- -QUIET = YES -WARNINGS = NO -WARN_IF_UNDOCUMENTED = NO -WARN_FORMAT = "$file:$line: $text" -WARN_LOGFILE = -#--------------------------------------------------------------------------- -# configuration options related to the input files -#--------------------------------------------------------------------------- -INPUT = ../include/ -FILE_PATTERNS = libmsrpc.h -RECURSIVE = YES -EXCLUDE = -EXCLUDE_PATTERNS = -EXAMPLE_PATH = -EXAMPLE_PATTERNS = -IMAGE_PATH = -INPUT_FILTER = -FILTER_SOURCE_FILES = NO -#--------------------------------------------------------------------------- -# configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- -ALPHABETICAL_INDEX = YES -COLS_IN_ALPHA_INDEX = 1 -IGNORE_PREFIX = -#--------------------------------------------------------------------------- -# configuration options related to the HTML output -#--------------------------------------------------------------------------- -GENERATE_HTML = YES -HTML_OUTPUT = . -HTML_HEADER = -HTML_FOOTER = -HTML_STYLESHEET = -HTML_ALIGN_MEMBERS = YES -GENERATE_HTMLHELP = NO -GENERATE_CHI = NO -BINARY_TOC = NO -TOC_EXPAND = NO -DISABLE_INDEX = NO -ENUM_VALUES_PER_LINE = 3 -GENERATE_TREEVIEW = NO -TREEVIEW_WIDTH = 250 -#--------------------------------------------------------------------------- -# configuration options related to the LaTeX output -#--------------------------------------------------------------------------- -GENERATE_LATEX = NO -LATEX_OUTPUT = latex -COMPACT_LATEX = NO -PAPER_TYPE = a4wide -EXTRA_PACKAGES = -LATEX_HEADER = -PDF_HYPERLINKS = YES -USE_PDFLATEX = YES -LATEX_BATCHMODE = YES -#--------------------------------------------------------------------------- -# configuration options related to the RTF output -#--------------------------------------------------------------------------- -GENERATE_RTF = NO -RTF_OUTPUT = rtf -COMPACT_RTF = NO -RTF_HYPERLINKS = NO -RTF_STYLESHEET_FILE = -RTF_EXTENSIONS_FILE = -#--------------------------------------------------------------------------- -# configuration options related to the man page output -#--------------------------------------------------------------------------- -GENERATE_MAN = NO -MAN_OUTPUT = man -MAN_EXTENSION = .3 -MAN_LINKS = NO -#--------------------------------------------------------------------------- -# configuration options related to the XML output -#--------------------------------------------------------------------------- -GENERATE_XML = NO -#--------------------------------------------------------------------------- -# configuration options related to the preprocessor -#--------------------------------------------------------------------------- -ENABLE_PREPROCESSING = NO -MACRO_EXPANSION = NO -EXPAND_ONLY_PREDEF = NO -SEARCH_INCLUDES = YES -INCLUDE_PATH = -INCLUDE_FILE_PATTERNS = -PREDEFINED = -EXPAND_AS_DEFINED = -SKIP_FUNCTION_MACROS = YES -#--------------------------------------------------------------------------- -# configuration::additions related to external references -#--------------------------------------------------------------------------- -TAGFILES = -GENERATE_TAGFILE = -ALLEXTERNALS = NO -PERL_PATH = /usr/bin/perl -#--------------------------------------------------------------------------- -# configuration options related to the dot tool -#--------------------------------------------------------------------------- -HAVE_DOT = NO -CLASS_GRAPH = YES -COLLABORATION_GRAPH = YES -TEMPLATE_RELATIONS = YES -INCLUDE_GRAPH = YES -INCLUDED_BY_GRAPH = YES -GRAPHICAL_HIERARCHY = YES -DOT_PATH = -DOTFILE_DIRS = -MAX_DOT_GRAPH_WIDTH = 1024 -MAX_DOT_GRAPH_HEIGHT = 1024 -GENERATE_LEGEND = YES -DOT_CLEANUP = YES -#--------------------------------------------------------------------------- -# configuration::additions related to the search engine -#--------------------------------------------------------------------------- -SEARCHENGINE = NO -CGI_NAME = search.cgi -CGI_URL = -DOC_URL = -DOC_ABSPATH = -BIN_ABSPATH = /usr/local/bin/ -EXT_DOC_PATHS = diff --git a/source3/libmsrpc/cac_lsarpc.c b/source3/libmsrpc/cac_lsarpc.c deleted file mode 100644 index 5ff8f5142c..0000000000 --- a/source3/libmsrpc/cac_lsarpc.c +++ /dev/null @@ -1,1255 +0,0 @@ - -/* - * Unix SMB/CIFS implementation. - * MS-RPC client library implementation (LSA pipe) - * Copyright (C) Chris Nicholls 2005. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, see <http://www.gnu.org/licenses/>. - */ - -#include "libmsrpc.h" -#include "libsmb_internal.h" - -int cac_LsaOpenPolicy( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct LsaOpenPolicy *op ) -{ - SMBCSRV *srv = NULL; - POLICY_HND *policy = NULL; - struct rpc_pipe_client *pipe_hnd = NULL; - - if ( !hnd ) - return CAC_FAILURE; - - if ( !hnd->_internal.ctx ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( !mem_ctx || !op ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - op->out.pol = NULL; - - srv = cac_GetServer( hnd ); - if ( !srv ) { - hnd->status = NT_STATUS_INVALID_CONNECTION; - return CAC_FAILURE; - } - - /*see if there is already an active session on this pipe, if not then open one */ - if ( !hnd->_internal.pipes[PI_LSARPC] ) { - pipe_hnd = - cli_rpc_pipe_open_noauth( srv->cli, PI_LSARPC, - &hnd->status ); - - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_UNSUCCESSFUL; - return CAC_FAILURE; - } - - hnd->_internal.pipes[PI_LSARPC] = True; - } - - pipe_hnd = cac_GetPipe( hnd, PI_LSARPC ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - policy = TALLOC_P( mem_ctx, POLICY_HND ); - if ( !policy ) { - errno = ENOMEM; - hnd->status = NT_STATUS_NO_MEMORY; - return CAC_FAILURE; - } - - /*need to make sure that our nt status is good otherwise check might fail below */ - hnd->status = NT_STATUS_OK; - - if ( hnd->_internal.srv_level >= SRV_WIN_2K ) { - - /*try using open_policy2, if this fails try again in next block using open_policy, if that works then adjust hnd->_internal.srv_level */ - - /*we shouldn't need to modify the access mask to make it work here */ - hnd->status = - rpccli_lsa_open_policy2( pipe_hnd, mem_ctx, - op->in.security_qos, - op->in.access, policy ); - - } - - if ( hnd->_internal.srv_level < SRV_WIN_2K - || !NT_STATUS_IS_OK( hnd->status ) ) { - hnd->status = - rpccli_lsa_open_policy( pipe_hnd, mem_ctx, - op->in.security_qos, - op->in.access, policy ); - - if ( hnd->_internal.srv_level > SRV_WIN_NT4 - && NT_STATUS_IS_OK( hnd->status ) ) { - /*change the server level to 1 */ - hnd->_internal.srv_level = SRV_WIN_NT4; - } - - } - - if ( !NT_STATUS_IS_OK( hnd->status ) ) { - return CAC_FAILURE; - } - - op->out.pol = policy; - - return CAC_SUCCESS; -} - -int cac_LsaClosePolicy( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - POLICY_HND * pol ) -{ - - struct rpc_pipe_client *pipe_hnd = NULL; - - if ( !hnd ) - return CAC_FAILURE; - - if ( !pol ) - return CAC_SUCCESS; /*if the policy handle doesnt exist then it's already closed */ - - if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_LSARPC] ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_LSARPC ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - hnd->status = rpccli_lsa_Close( pipe_hnd, mem_ctx, pol ); - - TALLOC_FREE( pol ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - return CAC_SUCCESS; -} - -int cac_LsaGetNamesFromSids( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct LsaGetNamesFromSids *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - - int result = -1; - - int i; - - /*buffers for outputs */ - char **domains = NULL; - char **names = NULL; - enum lsa_SidType *types = NULL; - - CacSidInfo *sids_out = NULL; - DOM_SID *unknown_out = NULL; - int num_unknown = 0; - - int num_sids; - - int found_idx; - int unknown_idx; - - if ( !hnd ) - return CAC_FAILURE; - - if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_LSARPC] ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( !mem_ctx || !op || !op->in.pol || !op->in.sids ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - num_sids = op->in.num_sids; - - pipe_hnd = cac_GetPipe( hnd, PI_LSARPC ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - - - /*now actually lookup the names */ - hnd->status = - rpccli_lsa_lookup_sids( pipe_hnd, mem_ctx, op->in.pol, - op->in.num_sids, op->in.sids, - &domains, &names, &types ); - - if ( NT_STATUS_IS_OK( hnd->status ) ) { - /*this is the easy part, just make the out.sids array */ - if (num_sids) { - sids_out = TALLOC_ARRAY( mem_ctx, CacSidInfo, num_sids ); - if ( !sids_out ) { - errno = ENOMEM; - hnd->status = NT_STATUS_NO_MEMORY; - return CAC_FAILURE; - } - } else { - sids_out = NULL; - } - - for ( i = 0; i < num_sids; i++ ) { - sids_out[i].sid = op->in.sids[i]; - sids_out[i].name = names[i]; - sids_out[i].domain = domains[i]; - } - - result = CAC_SUCCESS; - } else if ( NT_STATUS_V( hnd->status ) == - NT_STATUS_V( STATUS_SOME_UNMAPPED ) ) { - /*first find out how many couldn't be looked up */ - - for ( i = 0; i < num_sids; i++ ) { - if ( names[i] == NULL ) { - num_unknown++; - } - } - - if ( num_unknown >= num_sids ) { - hnd->status = NT_STATUS_UNSUCCESSFUL; - return CAC_FAILURE; - } - - if ( num_sids - num_unknown) { - sids_out = - TALLOC_ARRAY( mem_ctx, CacSidInfo, - ( num_sids - num_unknown ) ); - if ( !sids_out ) { - errno = ENOMEM; - hnd->status = NT_STATUS_NO_MEMORY; - return CAC_FAILURE; - } - } else { - sids_out = NULL; - } - - if (num_unknown) { - unknown_out = TALLOC_ARRAY( mem_ctx, DOM_SID, num_unknown ); - if ( !unknown_out ) { - errno = ENOMEM; - hnd->status = NT_STATUS_NO_MEMORY; - return CAC_FAILURE; - } - } else { - unknown_out = NULL; - } - found_idx = unknown_idx = 0; - - /*now we can actually do the real work */ - for ( i = 0; i < num_sids; i++ ) { - if ( names[i] != NULL ) { - sids_out[found_idx].sid = op->in.sids[i]; - sids_out[found_idx].name = names[i]; - sids_out[found_idx].domain = domains[i]; - - found_idx++; - } else { /*then this one didnt work out */ - unknown_out[unknown_idx] = op->in.sids[i]; - - unknown_idx++; - } - } - - result = CAC_PARTIAL_SUCCESS; - } else { /*then it failed for some reason */ - return CAC_FAILURE; - } - - op->out.num_found = num_sids - num_unknown; - op->out.sids = sids_out; - op->out.unknown = unknown_out; - - return result; - -} - -int cac_LsaGetSidsFromNames( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct LsaGetSidsFromNames *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - int result = -1; - - int i; - - /*buffers for outputs */ - DOM_SID *sids = NULL; - enum lsa_SidType *types = NULL; - - CacSidInfo *sids_out = NULL; - char **unknown_out = NULL; - int num_unknown = 0; - - int num_names; - - int found_idx = 0; - int unknown_idx = 0; - - if ( !hnd ) - return CAC_FAILURE; - - if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_LSARPC] ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( !mem_ctx || !op || !op->in.pol || !op->in.names ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - num_names = op->in.num_names; - - pipe_hnd = cac_GetPipe( hnd, PI_LSARPC ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - - /*now actually lookup the names */ - hnd->status = - rpccli_lsa_lookup_names( pipe_hnd, mem_ctx, op->in.pol, - num_names, - ( const char ** ) op->in.names, NULL, - 1, &sids, &types ); - - if ( NT_STATUS_IS_OK( hnd->status ) ) { - /*this is the easy part, just make the out.sids array */ - if (num_names) { - sids_out = TALLOC_ARRAY( mem_ctx, CacSidInfo, num_names ); - if ( !sids_out ) { - errno = ENOMEM; - hnd->status = NT_STATUS_NO_MEMORY; - return CAC_FAILURE; - } - } else { - sids_out = NULL; - } - - for ( i = 0; i < num_names; i++ ) { - sids_out[i].sid = sids[i]; - sids_out[i].name = - talloc_strdup( mem_ctx, op->in.names[i] ); - sids_out[i].domain = NULL; - } - - result = CAC_SUCCESS; - } else if ( NT_STATUS_V( hnd->status ) == - NT_STATUS_V( STATUS_SOME_UNMAPPED ) ) { - /*first find out how many couldn't be looked up */ - - for ( i = 0; i < num_names; i++ ) { - if ( types[i] == SID_NAME_UNKNOWN ) { - num_unknown++; - } - } - - if ( num_unknown >= num_names ) { - hnd->status = NT_STATUS_UNSUCCESSFUL; - return CAC_FAILURE; - } - - if (num_names - num_unknown) { - sids_out = - TALLOC_ARRAY( mem_ctx, CacSidInfo, - ( num_names - num_unknown ) ); - if ( !sids_out ) { - errno = ENOMEM; - hnd->status = NT_STATUS_NO_MEMORY; - return CAC_FAILURE; - } - } else { - sids_out = NULL; - } - - if (num_unknown) { - unknown_out = TALLOC_ARRAY( mem_ctx, char *, num_unknown ); - if ( !unknown_out ) { - errno = ENOMEM; - hnd->status = NT_STATUS_NO_MEMORY; - return CAC_FAILURE; - } - } else { - unknown_out = NULL; - } - - unknown_idx = found_idx = 0; - - /*now we can actually do the real work */ - for ( i = 0; i < num_names; i++ ) { - if ( types[i] != SID_NAME_UNKNOWN ) { - sids_out[found_idx].sid = sids[i]; - sids_out[found_idx].name = - talloc_strdup( mem_ctx, - op->in.names[i] ); - sids_out[found_idx].domain = NULL; - - found_idx++; - } else { /*then this one didnt work out */ - unknown_out[unknown_idx] = - talloc_strdup( mem_ctx, - op->in.names[i] ); - - unknown_idx++; - } - } - - result = CAC_PARTIAL_SUCCESS; - } else { /*then it failed for some reason */ - return CAC_FAILURE; - } - - op->out.num_found = num_names - num_unknown; - op->out.sids = sids_out; - op->out.unknown = unknown_out; - - return result; - -} - -int cac_LsaFetchSid( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct LsaFetchSid *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - int result = -1; - - if ( !hnd ) - return CAC_FAILURE; - - if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_LSARPC] ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( !mem_ctx || !op || !op->in.pol ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_LSARPC ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - op->out.local_sid = NULL; - op->out.domain_sid = NULL; - - if ( ( op->in.info_class & CAC_LOCAL_INFO ) == CAC_LOCAL_INFO ) { - DOM_SID *local_sid = NULL; - char *dom_name = NULL; - - hnd->status = - rpccli_lsa_query_info_policy( pipe_hnd, mem_ctx, - op->in.pol, - CAC_LOCAL_INFO, - &dom_name, &local_sid ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) { - result = CAC_FAILURE; - goto domain; - } - - op->out.local_sid = talloc( mem_ctx, CacSidInfo ); - if ( !op->out.local_sid ) { - hnd->status = NT_STATUS_NO_MEMORY; - result = CAC_FAILURE; - goto domain; - } - - op->out.local_sid->domain = dom_name; - - sid_copy( &op->out.local_sid->sid, local_sid ); - TALLOC_FREE( local_sid ); - } - - domain: - - if ( ( op->in.info_class & CAC_DOMAIN_INFO ) == CAC_DOMAIN_INFO ) { - DOM_SID *domain_sid; - char *dom_name; - - hnd->status = - rpccli_lsa_query_info_policy( pipe_hnd, mem_ctx, - op->in.pol, - CAC_DOMAIN_INFO, - &dom_name, - &domain_sid ); - if ( !NT_STATUS_IS_OK( hnd->status ) ) { - /*if we succeeded above, report partial success */ - result = CAC_FAILURE; - goto done; - } else if ( result == CAC_FAILURE ) { - /*if we failed above but succeded here then report partial success */ - result = CAC_PARTIAL_SUCCESS; - } - - op->out.domain_sid = talloc( mem_ctx, CacSidInfo ); - if ( !op->out.domain_sid ) { - hnd->status = NT_STATUS_NO_MEMORY; - result = CAC_FAILURE; - goto done; - } - - op->out.domain_sid->domain = dom_name; - sid_copy( &op->out.domain_sid->sid, domain_sid ); - TALLOC_FREE( domain_sid ); - } - - done: - return result; -} - -int cac_LsaQueryInfoPolicy( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct LsaQueryInfoPolicy *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - - char *domain_name = NULL; - char *dns_name = NULL; - char *forest_name = NULL; - struct GUID *domain_guid = NULL; - DOM_SID *domain_sid = NULL; - - if ( !hnd ) - return CAC_FAILURE; - - if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_LSARPC] ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( !op || !op->in.pol ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_LSARPC ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - /*only works if info_class parm is 12 */ - hnd->status = - rpccli_lsa_query_info_policy2( pipe_hnd, mem_ctx, op->in.pol, - 12, &domain_name, &dns_name, - &forest_name, &domain_guid, - &domain_sid ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) { - return CAC_FAILURE; - } - - op->out.domain_name = domain_name; - op->out.dns_name = dns_name; - op->out.forest_name = forest_name; - op->out.domain_guid = domain_guid; - op->out.domain_sid = domain_sid; - - return CAC_SUCCESS; -} - -int cac_LsaEnumSids( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct LsaEnumSids *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - - uint32 num_sids; - DOM_SID *sids; - - if ( !hnd ) - return CAC_FAILURE; - - if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_LSARPC] ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( !op || !op->in.pol ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_LSARPC ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - hnd->status = - rpccli_lsa_enum_sids( pipe_hnd, mem_ctx, op->in.pol, - &( op->out.resume_idx ), - op->in.pref_max_sids, &num_sids, - &sids ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) { - return CAC_FAILURE; - } - - op->out.num_sids = num_sids; - op->out.sids = sids; - - return CAC_SUCCESS; - -} - -int cac_LsaEnumAccountRights( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct LsaEnumAccountRights *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - - uint32 count = 0; - char **privs = NULL; - - if ( !hnd ) - return CAC_FAILURE; - - if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_LSARPC] ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( !op->in.pol ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - if ( !op->in.name && !op->in.sid ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_LSARPC ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( op->in.name && !op->in.sid ) { - DOM_SID *user_sid = NULL; - enum lsa_SidType *type; - - /*lookup the SID */ - hnd->status = - rpccli_lsa_lookup_names( pipe_hnd, mem_ctx, - op->in.pol, 1, - ( const char ** ) &( op->in. - name ), - NULL, 1, &user_sid, &type ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - op->in.sid = user_sid; - } - - hnd->status = - rpccli_lsa_enum_account_rights( pipe_hnd, mem_ctx, op->in.pol, - op->in.sid, &count, &privs ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) { - return CAC_FAILURE; - } - - op->out.num_privs = count; - op->out.priv_names = privs; - - return CAC_SUCCESS; -} - -int cac_LsaEnumTrustedDomains( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct LsaEnumTrustedDomains *op ) -{ - struct rpc_pipe_client *pipe_hnd; - - uint32 num_domains; - char **domain_names; - DOM_SID *domain_sids; - - if ( !hnd ) - return CAC_FAILURE; - - if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_LSARPC] ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( !op->in.pol ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_LSARPC ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - hnd->status = - rpccli_lsa_enum_trust_dom( pipe_hnd, mem_ctx, op->in.pol, - &( op->out.resume_idx ), - &num_domains, &domain_names, - &domain_sids ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) { - return CAC_FAILURE; - } - - op->out.num_domains = num_domains; - op->out.domain_names = domain_names; - op->out.domain_sids = domain_sids; - - return CAC_SUCCESS; -} - -int cac_LsaOpenTrustedDomain( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct LsaOpenTrustedDomain *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - - POLICY_HND *dom_pol = NULL; - - if ( !hnd ) - return CAC_FAILURE; - - if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_LSARPC] ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( !op->in.pol || !op->in.access || !op->in.domain_sid ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_LSARPC ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - dom_pol = talloc( mem_ctx, POLICY_HND ); - if ( !dom_pol ) { - hnd->status = NT_STATUS_NO_MEMORY; - errno = ENOMEM; - return CAC_FAILURE; - } - - hnd->status = - rpccli_lsa_open_trusted_domain( pipe_hnd, mem_ctx, op->in.pol, - op->in.domain_sid, - op->in.access, dom_pol ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) { - return CAC_FAILURE; - } - - op->out.domain_pol = dom_pol; - - return CAC_SUCCESS; -} - -int cac_LsaQueryTrustedDomainInfo( CacServerHandle * hnd, - TALLOC_CTX * mem_ctx, - struct LsaQueryTrustedDomainInfo *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - - LSA_TRUSTED_DOMAIN_INFO *dom_info; - - if ( !hnd ) - return CAC_FAILURE; - - if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_LSARPC] ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( !op->in.pol || !op->in.info_class ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - if ( !op->in.domain_sid && !op->in.domain_name ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_LSARPC ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( op->in.domain_sid ) { - hnd->status = - rpccli_lsa_query_trusted_domain_info_by_sid( pipe_hnd, - mem_ctx, - op->in. - pol, - op->in. - info_class, - op->in. - domain_sid, - &dom_info ); - } else if ( op->in.domain_name ) { - hnd->status = - rpccli_lsa_query_trusted_domain_info_by_name - ( pipe_hnd, mem_ctx, op->in.pol, op->in.info_class, - op->in.domain_name, &dom_info ); - } - - if ( !NT_STATUS_IS_OK( hnd->status ) ) { - return CAC_FAILURE; - } - - op->out.info = dom_info; - - return CAC_SUCCESS; - -} - -int cac_LsaEnumPrivileges( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct LsaEnumPrivileges *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - - uint32 num_privs; - char **priv_names; - uint32 *high_bits; - uint32 *low_bits; - - if ( !hnd ) { - return CAC_FAILURE; - } - - if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_LSARPC] ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( !op || !op->in.pol ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_LSARPC ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - hnd->status = - rpccli_lsa_enum_privilege( pipe_hnd, mem_ctx, op->in.pol, - &( op->out.resume_idx ), - op->in.pref_max_privs, &num_privs, - &priv_names, &high_bits, - &low_bits ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) { - return CAC_FAILURE; - } - - op->out.num_privs = num_privs; - op->out.priv_names = priv_names; - op->out.high_bits = high_bits; - op->out.low_bits = low_bits; - - return CAC_SUCCESS; -} - -int cac_LsaOpenAccount( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct LsaOpenAccount *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - - POLICY_HND *user_pol = NULL; - - if ( !hnd ) { - return CAC_FAILURE; - } - - if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_LSARPC] ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( !op || !op->in.pol ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - if ( !op->in.sid && !op->in.name ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_LSARPC ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - /*look up the user's SID if we have to */ - if ( op->in.name && !op->in.sid ) { - DOM_SID *user_sid = NULL; - enum lsa_SidType *type; - - /*lookup the SID */ - hnd->status = - rpccli_lsa_lookup_names( pipe_hnd, mem_ctx, - op->in.pol, 1, - ( const char ** ) &( op->in. - name ), - NULL, 1, &user_sid, &type ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - op->in.sid = user_sid; - } - - user_pol = talloc( mem_ctx, POLICY_HND ); - if ( !user_pol ) { - hnd->status = NT_STATUS_NO_MEMORY; - return CAC_FAILURE; - } - - hnd->status = - rpccli_lsa_open_account( pipe_hnd, mem_ctx, op->in.pol, - op->in.sid, op->in.access, - user_pol ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) { - TALLOC_FREE( user_pol ); - return CAC_FAILURE; - } - - op->out.user = user_pol; - - return CAC_SUCCESS; -} - - -int cac_LsaAddPrivileges( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct LsaAddPrivileges *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - - DOM_SID *user_sid = NULL; - enum lsa_SidType *type = NULL; - - if ( !hnd ) { - return CAC_FAILURE; - } - - if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_LSARPC] ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( !op || !op->in.pol || !op->in.priv_names ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - if ( !op->in.sid && !op->in.name ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_LSARPC ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( op->in.name && !op->in.sid ) { - /*lookup the SID */ - hnd->status = - rpccli_lsa_lookup_names( pipe_hnd, mem_ctx, - op->in.pol, 1, - ( const char ** ) &( op->in. - name ), - NULL, 1, &user_sid, &type ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - op->in.sid = user_sid; - } - - hnd->status = - rpccli_lsa_add_account_rights( pipe_hnd, mem_ctx, op->in.pol, - *( op->in.sid ), - op->in.num_privs, - ( const char ** ) op->in. - priv_names ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) { - return CAC_FAILURE; - } - - return CAC_SUCCESS; -} - -int cac_LsaRemovePrivileges( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct LsaRemovePrivileges *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - - DOM_SID *user_sid = NULL; - enum lsa_SidType *type = NULL; - - if ( !hnd ) { - return CAC_FAILURE; - } - - if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_LSARPC] ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( !op || !op->in.pol || !op->in.priv_names ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - if ( !op->in.sid && !op->in.name ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_LSARPC ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( op->in.name && !op->in.sid ) { - /*lookup the SID */ - hnd->status = - rpccli_lsa_lookup_names( pipe_hnd, mem_ctx, - op->in.pol, 1, - ( const char ** ) &( op->in. - name ), - NULL, 1, &user_sid, &type ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - op->in.sid = user_sid; - } - - hnd->status = - rpccli_lsa_remove_account_rights( pipe_hnd, mem_ctx, - op->in.pol, *( op->in.sid ), - False, op->in.num_privs, - ( const char ** ) op->in. - priv_names ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) { - return CAC_FAILURE; - } - - return CAC_SUCCESS; -} - -int cac_LsaClearPrivileges( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct LsaClearPrivileges *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - - DOM_SID *user_sid = NULL; - enum lsa_SidType *type = NULL; - - if ( !hnd ) { - return CAC_FAILURE; - } - - if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_LSARPC] ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( !op || !op->in.pol ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - if ( !op->in.sid && !op->in.name ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_LSARPC ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( op->in.name && !op->in.sid ) { - /*lookup the SID */ - hnd->status = - rpccli_lsa_lookup_names( pipe_hnd, mem_ctx, - op->in.pol, 1, - ( const char ** ) &( op->in. - name ), - NULL, 1, &user_sid, &type ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - op->in.sid = user_sid; - } - - hnd->status = - rpccli_lsa_remove_account_rights( pipe_hnd, mem_ctx, - op->in.pol, *( op->in.sid ), - True, 0, NULL ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) { - return CAC_FAILURE; - } - - return CAC_SUCCESS; -} - -int cac_LsaSetPrivileges( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct LsaAddPrivileges *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - - DOM_SID *user_sid = NULL; - enum lsa_SidType *type = NULL; - - if ( !hnd ) { - return CAC_FAILURE; - } - - if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_LSARPC] ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( !op || !op->in.pol || !op->in.priv_names ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - if ( !op->in.sid && !op->in.name ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_LSARPC ); - if ( !pipe_hnd ) { - return CAC_FAILURE; - } - - if ( op->in.name && !op->in.sid ) { - /*lookup the SID */ - hnd->status = - rpccli_lsa_lookup_names( pipe_hnd, mem_ctx, - op->in.pol, 1, - ( const char ** ) &( op->in. - name ), - NULL, 1, &user_sid, &type ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - op->in.sid = user_sid; - } - - /*first remove all privileges */ - hnd->status = - rpccli_lsa_remove_account_rights( pipe_hnd, mem_ctx, - op->in.pol, *( op->in.sid ), - True, 0, NULL ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) { - return CAC_FAILURE; - } - - hnd->status = - rpccli_lsa_add_account_rights( pipe_hnd, mem_ctx, op->in.pol, - *( op->in.sid ), - op->in.num_privs, - ( const char ** ) op->in. - priv_names ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) { - return CAC_FAILURE; - } - - return CAC_SUCCESS; -} - -int cac_LsaGetSecurityObject( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct LsaGetSecurityObject *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - - /*this is taken from rpcclient/cmd_lsarpc.c */ - uint16 info_level = 4; - - SEC_DESC_BUF *sec_out = NULL; - - if ( !hnd ) { - return CAC_FAILURE; - } - - if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_LSARPC] ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( !op || !op->in.pol ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_LSARPC ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - hnd->status = - rpccli_lsa_query_secobj( pipe_hnd, mem_ctx, op->in.pol, - info_level, &sec_out ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - op->out.sec = sec_out; - - return CAC_FAILURE; -} diff --git a/source3/libmsrpc/cac_samr.c b/source3/libmsrpc/cac_samr.c deleted file mode 100644 index 4c25f95288..0000000000 --- a/source3/libmsrpc/cac_samr.c +++ /dev/null @@ -1,2706 +0,0 @@ - -/* - * Unix SMB/CIFS implementation. - * MS-RPC client library implementation (SAMR pipe) - * Copyright (C) Chris Nicholls 2005. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, see <http://www.gnu.org/licenses/>. - */ - -#include "libmsrpc.h" -#include "libmsrpc_internal.h" - -/*used by cac_SamGetNamesFromRids*/ -#define SAMR_RID_UNKNOWN 8 - -#define SAMR_ENUM_MAX_SIZE 0xffff - -/*not sure what this is.. taken from rpcclient/cmd_samr.c*/ -#define SAMR_LOOKUP_FLAGS 0x000003e8 - -DOM_SID *cac_get_domain_sid( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - uint32 des_access ); - -int cac_SamConnect( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct SamConnect *op ) -{ - SMBCSRV *srv = NULL; - struct rpc_pipe_client *pipe_hnd = NULL; - POLICY_HND *sam_out = NULL; - - if ( !hnd ) - return CAC_FAILURE; - - if ( !hnd->_internal.ctx ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( !op || op->in.access == 0 || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - srv = cac_GetServer( hnd ); - if ( !srv ) { - hnd->status = NT_STATUS_INVALID_CONNECTION; - return CAC_FAILURE; - } - - /*initialize for samr pipe if we have to */ - if ( !hnd->_internal.pipes[PI_SAMR] ) { - if ( ! - ( pipe_hnd = - cli_rpc_pipe_open_noauth( srv->cli, PI_SAMR, - &hnd->status ) ) ) { - return CAC_FAILURE; - } - - hnd->_internal.pipes[PI_SAMR] = True; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SAMR ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - sam_out = talloc( mem_ctx, POLICY_HND ); - if ( !sam_out ) { - hnd->status = NT_STATUS_NO_MEMORY; - return CAC_FAILURE; - } - - if ( hnd->_internal.srv_level >= SRV_WIN_2K_SP3 ) { - hnd->status = - rpccli_samr_connect4( pipe_hnd, mem_ctx, - op->in.access, sam_out ); - } - - if ( hnd->_internal.srv_level < SRV_WIN_2K_SP3 - || !NT_STATUS_IS_OK( hnd->status ) ) { - /*if sam_connect4 failed, the use sam_connect and lower srv_level */ - - hnd->status = - rpccli_samr_connect( pipe_hnd, mem_ctx, op->in.access, - sam_out ); - - if ( NT_STATUS_IS_OK( hnd->status ) - && hnd->_internal.srv_level > SRV_WIN_2K ) { - hnd->_internal.srv_level = SRV_WIN_2K; - } - } - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - op->out.sam = sam_out; - - return CAC_SUCCESS; -} - -int cac_SamClose( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - POLICY_HND * sam ) -{ - struct rpc_pipe_client *pipe_hnd = 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 ( !sam || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SAMR ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - hnd->status = rpccli_samr_close( pipe_hnd, mem_ctx, sam ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - return CAC_SUCCESS; -} - -/*this is an internal function. Due to a circular dependency, it must be prototyped in libmsrpc.h (which I don't want to do) - * cac_SamOpenDomain() is the only function that calls it, so I just put the definition here - */ - -/*attempts to find the sid of the domain we are connected to*/ -DOM_SID *cac_get_domain_sid( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - uint32 des_access ) -{ - struct LsaOpenPolicy lop; - struct LsaFetchSid fs; - - DOM_SID *sid; - - ZERO_STRUCT( lop ); - ZERO_STRUCT( fs ); - - lop.in.access = des_access; - lop.in.security_qos = True; - - if ( !cac_LsaOpenPolicy( hnd, mem_ctx, &lop ) ) - return NULL; - - fs.in.pol = lop.out.pol; - fs.in.info_class = CAC_DOMAIN_INFO; - - if ( !cac_LsaFetchSid( hnd, mem_ctx, &fs ) ) - return NULL; - - cac_LsaClosePolicy( hnd, mem_ctx, lop.out.pol ); - - if ( !fs.out.domain_sid ) - return NULL; - - sid = ( DOM_SID * ) TALLOC_MEMDUP( mem_ctx, - &( fs.out.domain_sid->sid ), - sizeof( DOM_SID ) ); - - if ( !sid ) { - hnd->status = NT_STATUS_NO_MEMORY; - } - - return sid; - -} - -int cac_SamOpenDomain( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct SamOpenDomain *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - - DOM_SID *sid_buf; - POLICY_HND *sam_out; - POLICY_HND *pol_out; - - struct SamLookupDomain sld; - - if ( !hnd ) - return CAC_FAILURE; - - if ( !hnd->_internal.ctx ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( !op || op->in.access == 0 || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - if ( !op->in.sam ) { - /*use cac_SamConnect() since it does the session setup */ - struct SamConnect sc; - - ZERO_STRUCT( sc ); - - sc.in.access = op->in.access; - - if ( !cac_SamConnect( hnd, mem_ctx, &sc ) ) { - return CAC_FAILURE; - } - - sam_out = sc.out.sam; - } else { - sam_out = op->in.sam; - } - - if ( !op->in.sid ) { - /*find the sid for the SAM's domain */ - - /*try using cac_SamLookupDomain() first */ - ZERO_STRUCT( sld ); - - sld.in.sam = sam_out; - sld.in.name = hnd->domain; - - if ( cac_SamLookupDomain( hnd, mem_ctx, &sld ) ) { - /*then we got the sid */ - sid_buf = sld.out.sid; - } else { - /*try to get it from the LSA */ - sid_buf = - cac_get_domain_sid( hnd, mem_ctx, - op->in.access ); - } - } else { - /*we already have the sid for the domain we want */ - sid_buf = op->in.sid; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SAMR ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - pol_out = talloc( mem_ctx, POLICY_HND ); - if ( !pol_out ) { - hnd->status = NT_STATUS_NO_MEMORY; - return CAC_FAILURE; - } - - /*now open the domain */ - hnd->status = - rpccli_samr_open_domain( pipe_hnd, mem_ctx, sam_out, - op->in.access, sid_buf, pol_out ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - op->out.sam = sam_out; - op->out.dom_hnd = pol_out; - - return CAC_SUCCESS; -} - -int cac_SamOpenUser( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct SamOpenUser *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - - uint32 *rid_buf = NULL; - - uint32 num_rids = 0; - uint32 *rid_types = NULL; - - POLICY_HND *user_out = 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.dom_hnd || op->in.access == 0 || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - if ( op->in.rid == 0 && op->in.name == NULL ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SAMR ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( op->in.rid == 0 && op->in.name ) { - /*lookup the name and then set rid_buf */ - - hnd->status = - rpccli_samr_lookup_names( pipe_hnd, mem_ctx, - op->in.dom_hnd, - SAMR_LOOKUP_FLAGS, 1, - ( const char ** ) &op->in. - name, &num_rids, &rid_buf, - &rid_types ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - if ( num_rids == 0 || rid_buf == NULL - || rid_types[0] == SAMR_RID_UNKNOWN ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - TALLOC_FREE( rid_types ); - - } else { - rid_buf = &op->in.rid; - } - - user_out = talloc( mem_ctx, POLICY_HND ); - if ( !user_out ) { - hnd->status = NT_STATUS_NO_MEMORY; - return CAC_FAILURE; - } - - hnd->status = - rpccli_samr_open_user( pipe_hnd, mem_ctx, op->in.dom_hnd, - op->in.access, *rid_buf, user_out ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - op->out.user_hnd = user_out; - - return CAC_SUCCESS; -} - -int cac_SamCreateUser( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct SamCreateUser *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - - POLICY_HND *user_out = NULL; - uint32 rid_out; - - /**found in rpcclient/cmd_samr.c*/ - uint32 unknown = 0xe005000b; - - 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.dom_hnd || !op->in.name || op->in.acb_mask == 0 - || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SAMR ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - user_out = talloc( mem_ctx, POLICY_HND ); - if ( !user_out ) { - hnd->status = NT_STATUS_NO_MEMORY; - return CAC_FAILURE; - } - - hnd->status = - rpccli_samr_create_dom_user( pipe_hnd, mem_ctx, - op->in.dom_hnd, op->in.name, - op->in.acb_mask, unknown, - user_out, &rid_out ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - op->out.user_hnd = user_out; - op->out.rid = rid_out; - - return CAC_SUCCESS; -} - -int cac_SamDeleteUser( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - POLICY_HND * user_hnd ) -{ - struct rpc_pipe_client *pipe_hnd = 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 ( !user_hnd || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SAMR ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - hnd->status = - rpccli_samr_delete_dom_user( pipe_hnd, mem_ctx, user_hnd ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - return CAC_SUCCESS; -} - -int cac_SamEnumUsers( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct SamEnumUsers *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - - uint32 resume_idx_out = 0; - char **names_out = NULL; - uint32 *rids_out = NULL; - uint32 num_users_out = 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.dom_hnd || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - /*this is a hack.. but is the only reliable way to know if everything has been enumerated */ - if ( op->out.done == True ) - return CAC_FAILURE; - - pipe_hnd = cac_GetPipe( hnd, PI_SAMR ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - resume_idx_out = op->out.resume_idx; - - hnd->status = - rpccli_samr_enum_dom_users( pipe_hnd, mem_ctx, op->in.dom_hnd, - &resume_idx_out, op->in.acb_mask, - SAMR_ENUM_MAX_SIZE, &names_out, - &rids_out, &num_users_out ); - - - if ( NT_STATUS_IS_OK( hnd->status ) ) - op->out.done = True; - - /*if there are no more entries, the operation will return NT_STATUS_OK. - * We want to return failure if no results were returned*/ - if ( !NT_STATUS_IS_OK( hnd->status ) - && NT_STATUS_V( hnd->status ) != - NT_STATUS_V( STATUS_MORE_ENTRIES ) ) - return CAC_FAILURE; - - op->out.resume_idx = resume_idx_out; - op->out.num_users = num_users_out; - op->out.rids = rids_out; - op->out.names = names_out; - - return CAC_SUCCESS; -} - -int cac_SamGetNamesFromRids( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct SamGetNamesFromRids *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - - uint32 num_names_out; - char **names_out; - uint32 *name_types_out; - - - uint32 i = 0; - - CacLookupRidsRecord *map_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.dom_hnd || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - if ( !op->in.rids && op->in.num_rids != 0 ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - if ( op->in.num_rids == 0 ) { - /*nothing to do */ - op->out.num_names = 0; - return CAC_SUCCESS; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SAMR ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - hnd->status = - rpccli_samr_lookup_rids( pipe_hnd, mem_ctx, op->in.dom_hnd, - op->in.num_rids, op->in.rids, - &num_names_out, &names_out, - &name_types_out ); - - if ( !NT_STATUS_IS_OK( hnd->status ) - && !NT_STATUS_EQUAL( hnd->status, STATUS_SOME_UNMAPPED ) ) - return CAC_FAILURE; - - if (num_names_out) { - map_out = TALLOC_ARRAY( mem_ctx, CacLookupRidsRecord, num_names_out ); - if ( !map_out ) { - hnd->status = NT_STATUS_NO_MEMORY; - return CAC_FAILURE; - } - } else { - map_out = NULL; - } - - for ( i = 0; i < num_names_out; i++ ) { - if ( name_types_out[i] == SAMR_RID_UNKNOWN ) { - map_out[i].found = False; - map_out[i].name = NULL; - map_out[i].type = 0; - } else { - map_out[i].found = True; - map_out[i].name = - talloc_strdup( mem_ctx, names_out[i] ); - map_out[i].type = name_types_out[i]; - } - map_out[i].rid = op->in.rids[i]; - } - - TALLOC_FREE( names_out ); - TALLOC_FREE( name_types_out ); - - op->out.num_names = num_names_out; - op->out.map = map_out; - - if ( NT_STATUS_EQUAL( hnd->status, STATUS_SOME_UNMAPPED ) ) - return CAC_PARTIAL_SUCCESS; - - return CAC_SUCCESS; -} - -int cac_SamGetRidsFromNames( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct SamGetRidsFromNames *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - - uint32 num_rids_out; - uint32 *rids_out; - uint32 *rid_types_out; - - uint32 i = 0; - - CacLookupRidsRecord *map_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.dom_hnd || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - if ( !op->in.names && op->in.num_names != 0 ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - if ( op->in.num_names == 0 ) { - /*then we don't have to do anything */ - op->out.num_rids = 0; - return CAC_SUCCESS; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SAMR ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - hnd->status = - rpccli_samr_lookup_names( pipe_hnd, mem_ctx, op->in.dom_hnd, - SAMR_LOOKUP_FLAGS, op->in.num_names, - ( const char ** ) op->in.names, - &num_rids_out, &rids_out, - &rid_types_out ); - - if ( !NT_STATUS_IS_OK( hnd->status ) - && !NT_STATUS_EQUAL( hnd->status, STATUS_SOME_UNMAPPED ) ) - return CAC_FAILURE; - - if (num_rids_out) { - map_out = TALLOC_ARRAY( mem_ctx, CacLookupRidsRecord, num_rids_out ); - if ( !map_out ) { - hnd->status = NT_STATUS_NO_MEMORY; - return CAC_FAILURE; - } - } else { - map_out = NULL; - } - - for ( i = 0; i < num_rids_out; i++ ) { - - if ( rid_types_out[i] == SAMR_RID_UNKNOWN ) { - map_out[i].found = False; - map_out[i].rid = 0; - map_out[i].type = 0; - } else { - map_out[i].found = True; - map_out[i].rid = rids_out[i]; - map_out[i].type = rid_types_out[i]; - } - - map_out[i].name = talloc_strdup( mem_ctx, op->in.names[i] ); - } - - op->out.num_rids = num_rids_out; - op->out.map = map_out; - - TALLOC_FREE( rids_out ); - TALLOC_FREE( rid_types_out ); - - if ( NT_STATUS_EQUAL( hnd->status, STATUS_SOME_UNMAPPED ) ) - return CAC_PARTIAL_SUCCESS; - - return CAC_SUCCESS; -} - - -int cac_SamGetGroupsForUser( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct SamGetGroupsForUser *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - - DOM_GID *groups = NULL; - uint32 num_groups_out = 0; - - uint32 *rids_out = NULL; - uint32 *attr_out = NULL; - - uint32 i; - - 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.user_hnd || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SAMR ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - hnd->status = - rpccli_samr_query_usergroups( pipe_hnd, mem_ctx, - op->in.user_hnd, - &num_groups_out, &groups ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - - if (num_groups_out) { - rids_out = TALLOC_ARRAY( mem_ctx, uint32, num_groups_out ); - if ( !rids_out ) { - hnd->status = NT_STATUS_NO_MEMORY; - return CAC_FAILURE; - } - attr_out = TALLOC_ARRAY( mem_ctx, uint32, num_groups_out ); - if ( !attr_out ) { - hnd->status = NT_STATUS_NO_MEMORY; - return CAC_FAILURE; - } - } else { - rids_out = NULL; - attr_out = NULL; - } - - for ( i = 0; i < num_groups_out; i++ ) { - rids_out[i] = groups[i].g_rid; - attr_out[i] = groups[i].attr; - } - - TALLOC_FREE( groups ); - - op->out.num_groups = num_groups_out; - op->out.rids = rids_out; - op->out.attributes = attr_out; - - return CAC_SUCCESS; -} - - -int cac_SamOpenGroup( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct SamOpenGroup *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - - POLICY_HND *group_hnd_out = 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.access == 0 || op->in.rid == 0 || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SAMR ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - group_hnd_out = talloc( mem_ctx, POLICY_HND ); - if ( !group_hnd_out ) { - hnd->status = NT_STATUS_NO_MEMORY; - return CAC_FAILURE; - } - - hnd->status = - rpccli_samr_open_group( pipe_hnd, mem_ctx, op->in.dom_hnd, - op->in.access, op->in.rid, - group_hnd_out ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - op->out.group_hnd = group_hnd_out; - - return CAC_SUCCESS; -} - -int cac_SamCreateGroup( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct SamCreateGroup *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - - POLICY_HND *group_hnd_out = 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.name || op->in.name[0] == '\0' - || op->in.access == 0 || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SAMR ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - group_hnd_out = talloc( mem_ctx, POLICY_HND ); - if ( !group_hnd_out ) { - hnd->status = NT_STATUS_NO_MEMORY; - return CAC_FAILURE; - } - - hnd->status = - rpccli_samr_create_dom_group( pipe_hnd, mem_ctx, - op->in.dom_hnd, op->in.name, - op->in.access, group_hnd_out ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - op->out.group_hnd = group_hnd_out; - - return CAC_SUCCESS; - -} - -int cac_SamDeleteGroup( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - POLICY_HND * group_hnd ) -{ - struct rpc_pipe_client *pipe_hnd = 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 ( !group_hnd || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SAMR ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - hnd->status = - rpccli_samr_delete_dom_group( pipe_hnd, mem_ctx, group_hnd ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - return CAC_SUCCESS; - -} - -int cac_SamGetGroupMembers( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct SamGetGroupMembers *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - - uint32 num_mem_out; - uint32 *rids_out; - uint32 *attr_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.group_hnd || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SAMR ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - hnd->status = - rpccli_samr_query_groupmem( pipe_hnd, mem_ctx, - op->in.group_hnd, &num_mem_out, - &rids_out, &attr_out ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - op->out.num_members = num_mem_out; - op->out.rids = rids_out; - op->out.attributes = attr_out; - - return CAC_SUCCESS; -} - - -int cac_SamAddGroupMember( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct SamAddGroupMember *op ) -{ - struct rpc_pipe_client *pipe_hnd = 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.group_hnd || op->in.rid == 0 || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SAMR ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - hnd->status = - rpccli_samr_add_groupmem( pipe_hnd, mem_ctx, op->in.group_hnd, - op->in.rid ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - return CAC_SUCCESS; -} - -int cac_SamRemoveGroupMember( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct SamRemoveGroupMember *op ) -{ - struct rpc_pipe_client *pipe_hnd = 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.group_hnd || op->in.rid == 0 || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SAMR ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - hnd->status = - rpccli_samr_del_groupmem( pipe_hnd, mem_ctx, op->in.group_hnd, - op->in.rid ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - return CAC_SUCCESS; -} - -int cac_SamClearGroupMembers( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - POLICY_HND * group_hnd ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - - int result = CAC_SUCCESS; - - int i = 0; - - uint32 num_mem = 0; - uint32 *rid = NULL; - uint32 *attr = 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 ( !group_hnd || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SAMR ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - hnd->status = - rpccli_samr_query_groupmem( pipe_hnd, mem_ctx, group_hnd, - &num_mem, &rid, &attr ); - - 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 = - rpccli_samr_del_groupmem( pipe_hnd, mem_ctx, - group_hnd, rid[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 = rpccli_samr_add_groupmem( pipe_hnd, mem_ctx, - group_hnd, - rid[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( attr ); - - return result; -} - -int cac_SamSetGroupMembers( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct SamSetGroupMembers *op ) -{ - struct rpc_pipe_client *pipe_hnd = 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.group_hnd || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SAMR ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - /*use cac_SamClearGroupMembers() to clear them */ - if ( !cac_SamClearGroupMembers( hnd, mem_ctx, op->in.group_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 = - rpccli_samr_add_groupmem( pipe_hnd, mem_ctx, - op->in.group_hnd, - op->in.rids[i] ); - } - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - return CAC_SUCCESS; - -} - -int cac_SamEnumGroups( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct SamEnumGroups *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - - uint32 i = 0; - - uint32 resume_idx_out = 0; - char **names_out = NULL; - char **desc_out = NULL; - uint32 *rids_out = NULL; - uint32 num_groups_out = 0; - - struct acct_info *acct_buf = 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.dom_hnd || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - /*using this BOOL is the only reliable way to know that we are done */ - if ( op->out.done == True ) /*we return failure so the call will break out of a loop */ - return CAC_FAILURE; - - pipe_hnd = cac_GetPipe( hnd, PI_SAMR ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - resume_idx_out = op->out.resume_idx; - - hnd->status = - rpccli_samr_enum_dom_groups( pipe_hnd, mem_ctx, - op->in.dom_hnd, &resume_idx_out, - SAMR_ENUM_MAX_SIZE, &acct_buf, - &num_groups_out ); - - - if ( NT_STATUS_IS_OK( hnd->status ) ) { - op->out.done = True; - } else if ( NT_STATUS_V( hnd->status ) != - NT_STATUS_V( STATUS_MORE_ENTRIES ) ) { - /*if there are no more entries, the operation will return NT_STATUS_OK. - * We want to return failure if no results were returned*/ - return CAC_FAILURE; - } - - if (num_groups_out) { - names_out = TALLOC_ARRAY( mem_ctx, char *, num_groups_out ); - if ( !names_out ) { - hnd->status = NT_STATUS_NO_MEMORY; - TALLOC_FREE( acct_buf ); - return CAC_FAILURE; - } - - desc_out = TALLOC_ARRAY( mem_ctx, char *, num_groups_out ); - if ( !desc_out ) { - hnd->status = NT_STATUS_NO_MEMORY; - TALLOC_FREE( acct_buf ); - TALLOC_FREE( names_out ); - return CAC_FAILURE; - } - - rids_out = TALLOC_ARRAY( mem_ctx, uint32, num_groups_out ); - if ( !rids_out ) { - hnd->status = NT_STATUS_NO_MEMORY; - TALLOC_FREE( acct_buf ); - TALLOC_FREE( names_out ); - TALLOC_FREE( desc_out ); - return CAC_FAILURE; - } - } else { - names_out = NULL; - desc_out = NULL; - rids_out = NULL; - } - - for ( i = 0; i < num_groups_out; i++ ) { - names_out[i] = - talloc_strdup( mem_ctx, acct_buf[i].acct_name ); - desc_out[i] = talloc_strdup( mem_ctx, acct_buf[i].acct_desc ); - rids_out[i] = acct_buf[i].rid; - - if ( !names_out[i] || !desc_out[i] ) { - hnd->status = NT_STATUS_NO_MEMORY; - return CAC_FAILURE; - } - } - - op->out.resume_idx = resume_idx_out; - op->out.num_groups = num_groups_out; - op->out.rids = rids_out; - op->out.names = names_out; - op->out.descriptions = desc_out; - - return CAC_SUCCESS; -} - -int cac_SamEnumAliases( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct SamEnumAliases *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - - uint32 i = 0; - - uint32 resume_idx_out = 0; - char **names_out = NULL; - char **desc_out = NULL; - uint32 *rids_out = NULL; - uint32 num_als_out = 0; - - struct acct_info *acct_buf = 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.dom_hnd || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - /*this is a hack.. but is the only reliable way to know if everything has been enumerated */ - if ( op->out.done == True ) { - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SAMR ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - resume_idx_out = op->out.resume_idx; - - hnd->status = - rpccli_samr_enum_als_groups( pipe_hnd, mem_ctx, - op->in.dom_hnd, &resume_idx_out, - SAMR_ENUM_MAX_SIZE, &acct_buf, - &num_als_out ); - - - if ( NT_STATUS_IS_OK( hnd->status ) ) - op->out.done = True; - - /*if there are no more entries, the operation will return NT_STATUS_OK. - * We want to return failure if no results were returned*/ - if ( !NT_STATUS_IS_OK( hnd->status ) - && NT_STATUS_V( hnd->status ) != - NT_STATUS_V( STATUS_MORE_ENTRIES ) ) - return CAC_FAILURE; - - if (num_als_out) { - names_out = TALLOC_ARRAY( mem_ctx, char *, num_als_out ); - if ( !names_out ) { - hnd->status = NT_STATUS_NO_MEMORY; - TALLOC_FREE( acct_buf ); - return CAC_FAILURE; - } - - desc_out = TALLOC_ARRAY( mem_ctx, char *, num_als_out ); - if ( !desc_out ) { - hnd->status = NT_STATUS_NO_MEMORY; - TALLOC_FREE( acct_buf ); - TALLOC_FREE( names_out ); - return CAC_FAILURE; - } - - rids_out = TALLOC_ARRAY( mem_ctx, uint32, num_als_out ); - if ( !rids_out ) { - hnd->status = NT_STATUS_NO_MEMORY; - TALLOC_FREE( acct_buf ); - TALLOC_FREE( names_out ); - TALLOC_FREE( desc_out ); - return CAC_FAILURE; - } - } else { - names_out = NULL; - desc_out = NULL; - rids_out = NULL; - } - - for ( i = 0; i < num_als_out; i++ ) { - names_out[i] = - talloc_strdup( mem_ctx, acct_buf[i].acct_name ); - desc_out[i] = talloc_strdup( mem_ctx, acct_buf[i].acct_desc ); - rids_out[i] = acct_buf[i].rid; - - if ( !names_out[i] || !desc_out[i] ) { - hnd->status = NT_STATUS_NO_MEMORY; - return CAC_FAILURE; - } - } - - op->out.resume_idx = resume_idx_out; - op->out.num_aliases = num_als_out; - op->out.rids = rids_out; - op->out.names = names_out; - op->out.descriptions = desc_out; - - return CAC_SUCCESS; -} - -int cac_SamCreateAlias( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct SamCreateAlias *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - - POLICY_HND *als_hnd_out = 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.name || op->in.name[0] == '\0' || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SAMR ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - als_hnd_out = talloc( mem_ctx, POLICY_HND ); - if ( !als_hnd_out ) { - hnd->status = NT_STATUS_NO_MEMORY; - return CAC_FAILURE; - } - - hnd->status = - rpccli_samr_create_dom_alias( pipe_hnd, mem_ctx, - op->in.dom_hnd, op->in.name, - als_hnd_out ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - op->out.alias_hnd = als_hnd_out; - - return CAC_SUCCESS; - -} - -int cac_SamOpenAlias( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct SamOpenAlias *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - - POLICY_HND *als_hnd_out = 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.access == 0 || op->in.rid == 0 || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SAMR ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - als_hnd_out = talloc( mem_ctx, POLICY_HND ); - if ( !als_hnd_out ) { - hnd->status = NT_STATUS_NO_MEMORY; - return CAC_FAILURE; - } - - hnd->status = - rpccli_samr_open_alias( pipe_hnd, mem_ctx, op->in.dom_hnd, - op->in.access, op->in.rid, - als_hnd_out ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - op->out.alias_hnd = als_hnd_out; - - return CAC_SUCCESS; -} - -int cac_SamDeleteAlias( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - POLICY_HND * alias_hnd ) -{ - struct rpc_pipe_client *pipe_hnd = 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 ( !alias_hnd || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SAMR ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - hnd->status = - rpccli_samr_delete_dom_alias( pipe_hnd, mem_ctx, alias_hnd ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - return CAC_SUCCESS; - -} - -int cac_SamAddAliasMember( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct SamAddAliasMember *op ) -{ - struct rpc_pipe_client *pipe_hnd = 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; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SAMR ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - hnd->status = - rpccli_samr_add_aliasmem( pipe_hnd, mem_ctx, op->in.alias_hnd, - op->in.sid ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - return CAC_SUCCESS; -} - -int cac_SamRemoveAliasMember( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct SamRemoveAliasMember *op ) -{ - struct rpc_pipe_client *pipe_hnd = 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; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SAMR ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - hnd->status = - rpccli_samr_del_aliasmem( pipe_hnd, 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 ) -{ - struct rpc_pipe_client *pipe_hnd = 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; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SAMR ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - hnd->status = - rpccli_samr_query_aliasmem( pipe_hnd, 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 ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - - int result = CAC_SUCCESS; - - int 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; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SAMR ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - hnd->status = - rpccli_samr_query_aliasmem( pipe_hnd, 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 = - rpccli_samr_del_aliasmem( pipe_hnd, 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 = rpccli_samr_add_aliasmem( pipe_hnd, 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 ) -{ - struct rpc_pipe_client *pipe_hnd = 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; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SAMR ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - /*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 = - rpccli_samr_add_aliasmem( pipe_hnd, mem_ctx, - op->in.alias_hnd, - &( op->in.sids[i] ) ); - } - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - return CAC_SUCCESS; - -} - -int cac_SamUserChangePasswd( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct SamUserChangePasswd *op ) -{ - SMBCSRV *srv = NULL; - struct rpc_pipe_client *pipe_hnd = 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_INVALID_CONNECTION; - return CAC_FAILURE; - } - - /*open a session on SAMR if we don't have one */ - if ( !hnd->_internal.pipes[PI_SAMR] ) { - if ( ! - ( pipe_hnd = - cli_rpc_pipe_open_noauth( srv->cli, PI_SAMR, - &hnd->status ) ) ) { - return CAC_FAILURE; - } - - hnd->_internal.pipes[PI_SAMR] = True; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SAMR ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - hnd->status = - rpccli_samr_chgpasswd_user( pipe_hnd, 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; - struct rpc_pipe_client *pipe_hnd = NULL; - - SAM_USERINFO_CTR *ctr; - - 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_INVALID_CONNECTION; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SAMR ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - /*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 = - rpccli_samr_query_userinfo( pipe_hnd, mem_ctx, user_hnd, 0x10, - &ctr ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - /**check the ACB mask*/ - if ( ( ctr->info.id16->acb_info & ACB_DISABLED ) == ACB_DISABLED ) { - /*toggle the disabled bit */ - ctr->info.id16->acb_info ^= ACB_DISABLED; - } else { - /*the user is already enabled so just return success */ - return CAC_SUCCESS; - } - - /*now set the userinfo */ - hnd->status = - rpccli_samr_set_userinfo2( pipe_hnd, mem_ctx, user_hnd, 0x10, - &srv->cli->user_session_key, ctr ); - - /*this will only work properly if we use set_userinfo2 - fail if it is not supported */ - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - return CAC_SUCCESS; -} - -int cac_SamDisableUser( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - POLICY_HND * user_hnd ) -{ - SMBCSRV *srv = NULL; - struct rpc_pipe_client *pipe_hnd = NULL; - - SAM_USERINFO_CTR *ctr; - - 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_INVALID_CONNECTION; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SAMR ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - hnd->status = - rpccli_samr_query_userinfo( pipe_hnd, mem_ctx, user_hnd, 0x10, - &ctr ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - if ( ( ctr->info.id16->acb_info & ACB_DISABLED ) == ACB_DISABLED ) { - /*then the user is already disabled */ - return CAC_SUCCESS; - } - - /*toggle the disabled bit */ - ctr->info.id16->acb_info ^= ACB_DISABLED; - - /*this will only work properly if we use set_userinfo2 */ - hnd->status = - rpccli_samr_set_userinfo2( pipe_hnd, mem_ctx, user_hnd, 0x10, - &srv->cli->user_session_key, ctr ); - - /*this will only work properly if we use set_userinfo2 fail if it is not supported */ - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - return CAC_SUCCESS; -} - -int cac_SamSetPassword( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct SamSetPassword *op ) -{ - SMBCSRV *srv = NULL; - struct rpc_pipe_client *pipe_hnd = NULL; - - SAM_USERINFO_CTR ctr; - SAM_USER_INFO_24 info24; - uint8 pw[516]; - - 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->in.user_hnd || !op->in.password || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - srv = cac_GetServer( hnd ); - if ( !srv ) { - hnd->status = NT_STATUS_INVALID_CONNECTION; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SAMR ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - ZERO_STRUCT( ctr ); - ZERO_STRUCT( info24 ); - - encode_pw_buffer( pw, op->in.password, STR_UNICODE ); - - init_sam_user_info24( &info24, ( char * ) pw, 24 ); - - ctr.switch_value = 24; - ctr.info.id24 = &info24; - - hnd->status = - rpccli_samr_set_userinfo( pipe_hnd, mem_ctx, op->in.user_hnd, - 24, &srv->cli->user_session_key, - &ctr ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - return CAC_SUCCESS; -} - -int cac_SamGetUserInfo( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct SamGetUserInfo *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - - SAM_USERINFO_CTR *ctr; - - 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->in.user_hnd || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SAMR ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - hnd->status = - rpccli_samr_query_userinfo( pipe_hnd, mem_ctx, - op->in.user_hnd, 21, &ctr ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - op->out.info = cac_MakeUserInfo( mem_ctx, ctr ); - - if ( !op->out.info ) { - hnd->status = NT_STATUS_NO_MEMORY; - return CAC_FAILURE; - } - - return CAC_SUCCESS; -} - -int cac_SamSetUserInfo( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct SamSetUserInfo *op ) -{ - SMBCSRV *srv = NULL; - struct rpc_pipe_client *pipe_hnd = NULL; - - SAM_USERINFO_CTR *ctr; - - 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->in.user_hnd || !op->in.info || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - ctr = cac_MakeUserInfoCtr( mem_ctx, op->in.info ); - if ( !ctr ) { - hnd->status = NT_STATUS_NO_MEMORY; - return CAC_FAILURE; - } - - srv = cac_GetServer( hnd ); - if ( !srv ) { - hnd->status = NT_STATUS_INVALID_CONNECTION; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SAMR ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( hnd->_internal.srv_level >= SRV_WIN_NT4 ) { - hnd->status = - rpccli_samr_set_userinfo2( pipe_hnd, mem_ctx, - op->in.user_hnd, 21, - &srv->cli-> - user_session_key, ctr ); - } - - if ( hnd->_internal.srv_level < SRV_WIN_NT4 - || !NT_STATUS_IS_OK( hnd->status ) ) { - hnd->status = - rpccli_samr_set_userinfo( pipe_hnd, mem_ctx, - op->in.user_hnd, 21, - &srv->cli->user_session_key, - ctr ); - - if ( NT_STATUS_IS_OK( hnd->status ) - && hnd->_internal.srv_level > SRV_WIN_NT4 ) { - hnd->_internal.srv_level = SRV_WIN_NT4; - } - } - - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - return CAC_SUCCESS; -} - - -int cac_SamGetUserInfoCtr( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct SamGetUserInfoCtr *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - - SAM_USERINFO_CTR *ctr_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->in.user_hnd || op->in.info_class == 0 || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SAMR ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - hnd->status = - rpccli_samr_query_userinfo( pipe_hnd, mem_ctx, - op->in.user_hnd, - op->in.info_class, &ctr_out ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - op->out.ctr = ctr_out; - - return CAC_SUCCESS; -} - -int cac_SamSetUserInfoCtr( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct SamSetUserInfoCtr *op ) -{ - SMBCSRV *srv = NULL; - struct rpc_pipe_client *pipe_hnd = 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->in.user_hnd || !op->in.ctr || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - srv = cac_GetServer( hnd ); - if ( !srv ) { - hnd->status = NT_STATUS_INVALID_CONNECTION; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SAMR ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - - hnd->status = - rpccli_samr_set_userinfo( pipe_hnd, mem_ctx, op->in.user_hnd, - op->in.ctr->switch_value, - &srv->cli->user_session_key, - op->in.ctr ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - return CAC_SUCCESS; - -} - -int cac_SamRenameUser( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct SamRenameUser *op ) -{ - SMBCSRV *srv = NULL; - struct rpc_pipe_client *pipe_hnd = NULL; - - SAM_USERINFO_CTR ctr; - SAM_USER_INFO_7 info7; - - 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->in.user_hnd || !op->in.new_name - || op->in.new_name[0] == '\0' || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - srv = cac_GetServer( hnd ); - if ( !srv ) { - hnd->status = NT_STATUS_INVALID_CONNECTION; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SAMR ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - ZERO_STRUCT( ctr ); - ZERO_STRUCT( info7 ); - - init_sam_user_info7( &info7, op->in.new_name ); - - ctr.switch_value = 7; - ctr.info.id7 = &info7; - - hnd->status = - rpccli_samr_set_userinfo( pipe_hnd, mem_ctx, op->in.user_hnd, - 7, &srv->cli->user_session_key, - &ctr ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - return CAC_SUCCESS; -} - - -int cac_SamGetGroupInfo( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct SamGetGroupInfo *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - - GROUP_INFO_CTR *ctr; - - 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->in.group_hnd || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SAMR ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - - /*get a GROUP_INFO_1 structure */ - hnd->status = - rpccli_samr_query_groupinfo( pipe_hnd, mem_ctx, - op->in.group_hnd, 1, &ctr ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - op->out.info = cac_MakeGroupInfo( mem_ctx, ctr ); - if ( !op->out.info ) { - hnd->status = NT_STATUS_NO_MEMORY; - return CAC_FAILURE; - } - - return CAC_SUCCESS; -} - -int cac_SamSetGroupInfo( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct SamSetGroupInfo *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - - GROUP_INFO_CTR *ctr = 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->in.group_hnd || !op->in.info || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - ctr = cac_MakeGroupInfoCtr( mem_ctx, op->in.info ); - if ( !ctr ) { - hnd->status = NT_STATUS_NO_MEMORY; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SAMR ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - hnd->status = - rpccli_samr_set_groupinfo( pipe_hnd, mem_ctx, - op->in.group_hnd, ctr ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - return CAC_SUCCESS; -} - -int cac_SamRenameGroup( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct SamRenameGroup *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - - GROUP_INFO_CTR ctr; - - 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->in.group_hnd || !op->in.new_name - || op->in.new_name[0] == '\0' || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SAMR ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - ZERO_STRUCT( ctr ); - - init_samr_group_info2( &ctr.group.info2, op->in.new_name ); - ctr.switch_value1 = 2; - - hnd->status = - rpccli_samr_set_groupinfo( pipe_hnd, mem_ctx, - op->in.group_hnd, &ctr ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - return CAC_SUCCESS; -} - -int cac_SamGetAliasInfo( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct SamGetAliasInfo *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - - ALIAS_INFO_CTR ctr; - - 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->in.alias_hnd || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SAMR ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - /*get a GROUP_INFO_1 structure */ - hnd->status = - rpccli_samr_query_alias_info( pipe_hnd, mem_ctx, - op->in.alias_hnd, 1, &ctr ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - op->out.info = cac_MakeAliasInfo( mem_ctx, ctr ); - if ( !op->out.info ) { - hnd->status = NT_STATUS_NO_MEMORY; - return CAC_FAILURE; - } - - return CAC_SUCCESS; - -} - -int cac_SamSetAliasInfo( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct SamSetAliasInfo *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - - ALIAS_INFO_CTR *ctr = 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->in.alias_hnd || !op->in.info || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - ctr = cac_MakeAliasInfoCtr( mem_ctx, op->in.info ); - if ( !ctr ) { - hnd->status = NT_STATUS_NO_MEMORY; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SAMR ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - hnd->status = - rpccli_samr_set_aliasinfo( pipe_hnd, mem_ctx, - op->in.alias_hnd, ctr ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - return CAC_SUCCESS; -} - -int cac_SamGetDomainInfo( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct SamGetDomainInfo *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - - SAM_UNK_CTR ctr; - SAM_UNK_INFO_1 info1; - SAM_UNK_INFO_2 info2; - SAM_UNK_INFO_12 info12; - - /*use this to keep track of a failed call */ - NTSTATUS status_buf = NT_STATUS_OK; - - uint16 fail_count = 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->in.dom_hnd || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SAMR ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - /*first try with info 1 */ - hnd->status = - rpccli_samr_query_dom_info( pipe_hnd, mem_ctx, op->in.dom_hnd, - 1, &ctr ); - - if ( NT_STATUS_IS_OK( hnd->status ) ) { - /*then we buffer the SAM_UNK_INFO_1 structure */ - info1 = ctr.info.inf1; - } else { - /*then the call failed, store the status and ZERO out the info structure */ - ZERO_STRUCT( info1 ); - status_buf = hnd->status; - fail_count++; - } - - /*try again for the next one */ - hnd->status = - rpccli_samr_query_dom_info( pipe_hnd, mem_ctx, op->in.dom_hnd, - 2, &ctr ); - - if ( NT_STATUS_IS_OK( hnd->status ) ) { - /*store the info */ - info2 = ctr.info.inf2; - } else { - /*ZERO out the structure and store the bad status */ - ZERO_STRUCT( info2 ); - status_buf = hnd->status; - fail_count++; - } - - /*once more */ - hnd->status = - rpccli_samr_query_dom_info( pipe_hnd, mem_ctx, op->in.dom_hnd, - 12, &ctr ); - - if ( NT_STATUS_IS_OK( hnd->status ) ) { - info12 = ctr.info.inf12; - } else { - ZERO_STRUCT( info12 ); - status_buf = hnd->status; - fail_count++; - } - - /*return failure if all 3 calls failed */ - if ( fail_count == 3 ) - return CAC_FAILURE; - - op->out.info = cac_MakeDomainInfo( mem_ctx, &info1, &info2, &info12 ); - - if ( !op->out.info ) { - hnd->status = NT_STATUS_NO_MEMORY; - return CAC_FAILURE; - } - - if ( fail_count > 0 ) { - hnd->status = status_buf; - return CAC_PARTIAL_SUCCESS; - } - - return CAC_SUCCESS; -} - -int cac_SamGetDomainInfoCtr( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct SamGetDomainInfoCtr *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - - SAM_UNK_CTR *ctr_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->in.dom_hnd || op->in.info_class == 0 || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SAMR ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - ctr_out = talloc( mem_ctx, SAM_UNK_CTR ); - if ( !ctr_out ) { - hnd->status = NT_STATUS_NO_MEMORY; - return CAC_FAILURE; - } - - hnd->status = - rpccli_samr_query_dom_info( pipe_hnd, mem_ctx, op->in.dom_hnd, - op->in.info_class, ctr_out ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - op->out.info = ctr_out; - - return CAC_SUCCESS; -} - -int cac_SamGetDisplayInfo( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct SamGetDisplayInfo *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - - SAM_DISPINFO_CTR ctr_out; - - uint32 max_entries_buf = 0; - uint32 max_size_buf = 0; - - uint32 resume_idx_out; - uint32 num_entries_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->in.dom_hnd || op->in.info_class == 0 || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - if ( op->out.done == True ) /*this is done so we can use the function as a loop condition */ - return CAC_FAILURE; - - pipe_hnd = cac_GetPipe( hnd, PI_SAMR ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( op->in.max_entries == 0 || op->in.max_size == 0 ) { - get_query_dispinfo_params( op->out.loop_count, - &max_entries_buf, &max_size_buf ); - } else { - max_entries_buf = op->in.max_entries; - max_size_buf = op->in.max_size; - } - - resume_idx_out = op->out.resume_idx; - - hnd->status = - rpccli_samr_query_dispinfo( pipe_hnd, mem_ctx, op->in.dom_hnd, - &resume_idx_out, - op->in.info_class, - &num_entries_out, max_entries_buf, - max_size_buf, &ctr_out ); - - if ( !NT_STATUS_IS_OK( hnd->status ) - && !NT_STATUS_EQUAL( hnd->status, STATUS_MORE_ENTRIES ) ) { - /*be defensive, maybe they'll call again without zeroing the struct */ - op->out.loop_count = 0; - op->out.resume_idx = 0; - return CAC_FAILURE; - } - - if ( NT_STATUS_IS_OK( hnd->status ) ) { - /*we want to quit once the function is called next. so it can be used in a loop */ - op->out.done = True; - } - - op->out.resume_idx = resume_idx_out; - op->out.num_entries = num_entries_out; - op->out.ctr = ctr_out; - op->out.loop_count++; - - return CAC_SUCCESS; -} - -int cac_SamLookupDomain( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct SamLookupDomain *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - - DOM_SID *sid_out = 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->in.sam || !op->in.name || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SAMR ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - sid_out = talloc( mem_ctx, DOM_SID ); - if ( !sid_out ) { - hnd->status = NT_STATUS_NO_MEMORY; - return CAC_FAILURE; - } - - hnd->status = - rpccli_samr_lookup_domain( pipe_hnd, mem_ctx, op->in.sam, - op->in.name, sid_out ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - op->out.sid = sid_out; - - return CAC_SUCCESS; -} - -int cac_SamGetSecurityObject( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct SamGetSecurityObject *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - - /*this number taken from rpcclient/cmd_samr.c, I think it is the only supported level */ - uint32 sec_info = DACL_SECURITY_INFORMATION; - - SEC_DESC_BUF *sec_out = 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->in.pol || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SAMR ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - hnd->status = - rpccli_samr_query_sec_obj( pipe_hnd, mem_ctx, op->in.pol, - sec_info, mem_ctx, &sec_out ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - op->out.sec = sec_out; - - return CAC_SUCCESS; -} - -int cac_SamFlush( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct SamFlush *op ) -{ - struct SamOpenDomain od; - - 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.dom_hnd || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - if ( !cac_SamClose( hnd, mem_ctx, op->in.dom_hnd ) ) - return CAC_FAILURE; - - ZERO_STRUCT( od ); - od.in.access = - ( op->in.access ) ? op->in.access : MAXIMUM_ALLOWED_ACCESS; - od.in.sid = op->in.sid; - - if ( !cac_SamOpenDomain( hnd, mem_ctx, &od ) ) - return CAC_FAILURE; - - /*this function does not use an output parameter to make it as convenient as possible to use */ - *op->in.dom_hnd = *od.out.dom_hnd; - - TALLOC_FREE( od.out.dom_hnd ); - - return CAC_SUCCESS; -} diff --git a/source3/libmsrpc/cac_svcctl.c b/source3/libmsrpc/cac_svcctl.c deleted file mode 100644 index c5385ec151..0000000000 --- a/source3/libmsrpc/cac_svcctl.c +++ /dev/null @@ -1,631 +0,0 @@ - -/* - * Unix SMB/CIFS implementation. - * MS-RPC client library implementation (SVCCTL pipe) - * Copyright (C) Chris Nicholls 2005. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, see <http://www.gnu.org/licenses/>. - */ - -#include "libmsrpc.h" -#include "libsmb_internal.h" - -#define WAIT_SLEEP_TIME 300000 - -int cac_WaitForService( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - POLICY_HND * svc_hnd, uint32 state, uint32 timeout, - SERVICE_STATUS * status ); - -int cac_SvcOpenScm( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct SvcOpenScm *op ) -{ - SMBCSRV *srv = NULL; - struct rpc_pipe_client *pipe_hnd = NULL; - WERROR err; - - POLICY_HND *scm_out = NULL; - - if ( !hnd ) - return CAC_FAILURE; - - if ( !hnd->_internal.ctx ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( !op || op->in.access == 0 || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - srv = cac_GetServer( hnd ); - if ( !srv ) { - hnd->status = NT_STATUS_INVALID_CONNECTION; - return CAC_FAILURE; - } - - /*initialize for samr pipe if we have to */ - if ( !hnd->_internal.pipes[PI_SVCCTL] ) { - if ( ! - ( pipe_hnd = - cli_rpc_pipe_open_noauth( srv->cli, PI_SVCCTL, - &( hnd->status ) ) ) ) { - hnd->status = NT_STATUS_UNSUCCESSFUL; - return CAC_FAILURE; - } - - hnd->_internal.pipes[PI_SVCCTL] = True; - } - - scm_out = talloc( mem_ctx, POLICY_HND ); - if ( !scm_out ) { - hnd->status = NT_STATUS_NO_MEMORY; - return CAC_FAILURE; - } - - err = rpccli_svcctl_open_scm( pipe_hnd, mem_ctx, scm_out, - op->in.access ); - hnd->status = werror_to_ntstatus( err ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - op->out.scm_hnd = scm_out; - - return CAC_SUCCESS; -} - -int cac_SvcClose( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - POLICY_HND * scm_hnd ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - - if ( !hnd ) - return CAC_FAILURE; - - if ( !hnd->_internal.ctx ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( !scm_hnd || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SVCCTL ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - hnd->status = rpccli_svcctl_CloseServiceHandle( pipe_hnd, mem_ctx, scm_hnd ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - return CAC_SUCCESS; -} - -int cac_SvcEnumServices( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct SvcEnumServices *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - WERROR err; - - uint32 type_buf = 0; - uint32 state_buf = 0; - - uint32 num_svc_out = 0; - - ENUM_SERVICES_STATUS *svc_buf = NULL; - - if ( !hnd ) - return CAC_FAILURE; - - if ( !hnd->_internal.ctx ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( !op || !op->in.scm_hnd || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SVCCTL ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - type_buf = - ( op->in.type != - 0 ) ? op->in. - type : ( SVCCTL_TYPE_DRIVER | SVCCTL_TYPE_WIN32 ); - state_buf = ( op->in.state != 0 ) ? op->in.state : SVCCTL_STATE_ALL; - - err = rpccli_svcctl_enumerate_services( pipe_hnd, mem_ctx, - op->in.scm_hnd, type_buf, - state_buf, &num_svc_out, - &svc_buf ); - hnd->status = werror_to_ntstatus( err ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - op->out.services = - cac_MakeServiceArray( mem_ctx, svc_buf, num_svc_out ); - - if ( !op->out.services ) { - hnd->status = NT_STATUS_NO_MEMORY; - return CAC_FAILURE; - } - - TALLOC_FREE( svc_buf ); - - op->out.num_services = num_svc_out; - - return CAC_SUCCESS; -} - -int cac_SvcOpenService( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct SvcOpenService *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - WERROR err; - - POLICY_HND *svc_hnd_out = NULL; - - if ( !hnd ) - return CAC_FAILURE; - - if ( !hnd->_internal.ctx ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( !op || !op->in.scm_hnd || !op->in.name || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SVCCTL ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - svc_hnd_out = talloc( mem_ctx, POLICY_HND ); - if ( !svc_hnd_out ) { - hnd->status = NT_STATUS_NO_MEMORY; - return CAC_FAILURE; - } - - err = rpccli_svcctl_open_service( pipe_hnd, mem_ctx, op->in.scm_hnd, - svc_hnd_out, op->in.name, - op->in.access ); - hnd->status = werror_to_ntstatus( err ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - op->out.svc_hnd = svc_hnd_out; - - return CAC_SUCCESS; -} - -int cac_SvcControlService( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct SvcControlService *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - WERROR err; - - SERVICE_STATUS status_out; - - if ( !hnd ) - return CAC_FAILURE; - - if ( !hnd->_internal.ctx ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( !op || !op->in.svc_hnd || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - if ( op->in.control < SVCCTL_CONTROL_STOP - || op->in.control > SVCCTL_CONTROL_SHUTDOWN ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SVCCTL ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - err = rpccli_svcctl_control_service( pipe_hnd, mem_ctx, - op->in.svc_hnd, op->in.control, - &status_out ); - hnd->status = werror_to_ntstatus( err ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - return CAC_SUCCESS; -} - -int cac_SvcGetStatus( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct SvcGetStatus *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - WERROR err; - - SERVICE_STATUS status_out; - - if ( !hnd ) - return CAC_FAILURE; - - if ( !hnd->_internal.ctx ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( !op || !op->in.svc_hnd || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SVCCTL ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - err = rpccli_svcctl_query_status( pipe_hnd, mem_ctx, op->in.svc_hnd, - &status_out ); - hnd->status = werror_to_ntstatus( err ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - op->out.status = status_out; - - return CAC_SUCCESS; -} - - - -/*Internal function - similar to code found in utils/net_rpc_service.c - * Waits for a service to reach a specific state. - * svc_hnd - Handle to the service - * state - the state we are waiting for - * timeout - number of seconds to wait - * returns CAC_FAILURE if the state is never reached - * or CAC_SUCCESS if the state is reached - */ -int cac_WaitForService( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - POLICY_HND * svc_hnd, uint32 state, uint32 timeout, - SERVICE_STATUS * status ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - - /*number of milliseconds we have spent */ - uint32 time_spent = 0; - WERROR err; - - if ( !hnd || !mem_ctx || !svc_hnd || !status ) - return CAC_FAILURE; - - pipe_hnd = cac_GetPipe( hnd, PI_SVCCTL ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - while ( status->state != state && time_spent < ( timeout * 1000000 ) - && NT_STATUS_IS_OK( hnd->status ) ) { - /*if this is the first call, then we _just_ got the status.. sleep now */ - usleep( WAIT_SLEEP_TIME ); - time_spent += WAIT_SLEEP_TIME; - - err = rpccli_svcctl_query_status( pipe_hnd, mem_ctx, svc_hnd, - status ); - hnd->status = werror_to_ntstatus( err ); - } - - if ( status->state == state ) - return CAC_SUCCESS; - - return CAC_FAILURE; -} - -int cac_SvcStartService( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct SvcStartService *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - WERROR err; - - SERVICE_STATUS status_buf; - - if ( !hnd ) - return CAC_FAILURE; - - if ( !hnd->_internal.ctx ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( !op || !op->in.svc_hnd || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - if ( op->in.num_parms != 0 && op->in.parms == NULL ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SVCCTL ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - err = rpccli_svcctl_start_service( pipe_hnd, mem_ctx, op->in.svc_hnd, - ( const char ** ) op->in.parms, - op->in.num_parms ); - hnd->status = werror_to_ntstatus( err ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - if ( op->in.timeout == 0 ) - return CAC_SUCCESS; - - return cac_WaitForService( hnd, mem_ctx, op->in.svc_hnd, - SVCCTL_RUNNING, op->in.timeout, - &status_buf ); -} - -int cac_SvcStopService( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct SvcStopService *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - WERROR err; - - SERVICE_STATUS status_out; - - if ( !hnd ) - return CAC_FAILURE; - - if ( !hnd->_internal.ctx ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( !op || !op->in.svc_hnd || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SVCCTL ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - err = rpccli_svcctl_control_service( pipe_hnd, mem_ctx, - op->in.svc_hnd, - SVCCTL_CONTROL_STOP, - &status_out ); - hnd->status = werror_to_ntstatus( err ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - op->out.status = status_out; - - if ( op->in.timeout == 0 ) - return CAC_SUCCESS; - - return cac_WaitForService( hnd, mem_ctx, op->in.svc_hnd, - SVCCTL_STOPPED, op->in.timeout, - &op->out.status ); -} - -int cac_SvcPauseService( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct SvcPauseService *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - WERROR err; - - SERVICE_STATUS status_out; - - if ( !hnd ) - return CAC_FAILURE; - - if ( !hnd->_internal.ctx ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( !op || !op->in.svc_hnd || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SVCCTL ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - err = rpccli_svcctl_control_service( pipe_hnd, mem_ctx, - op->in.svc_hnd, - SVCCTL_CONTROL_PAUSE, - &status_out ); - hnd->status = werror_to_ntstatus( err ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - op->out.status = status_out; - - if ( op->in.timeout == 0 ) - return CAC_SUCCESS; - - return cac_WaitForService( hnd, mem_ctx, op->in.svc_hnd, - SVCCTL_PAUSED, op->in.timeout, - &op->out.status ); -} - -int cac_SvcContinueService( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct SvcContinueService *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - WERROR err; - - SERVICE_STATUS status_out; - - if ( !hnd ) - return CAC_FAILURE; - - if ( !hnd->_internal.ctx ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( !op || !op->in.svc_hnd || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SVCCTL ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - err = rpccli_svcctl_control_service( pipe_hnd, mem_ctx, - op->in.svc_hnd, - SVCCTL_CONTROL_CONTINUE, - &status_out ); - hnd->status = werror_to_ntstatus( err ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - op->out.status = status_out; - - if ( op->in.timeout == 0 ) - return CAC_SUCCESS; - - return cac_WaitForService( hnd, mem_ctx, op->in.svc_hnd, - SVCCTL_RUNNING, op->in.timeout, - &op->out.status ); -} - -int cac_SvcGetDisplayName( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct SvcGetDisplayName *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - WERROR err; - - fstring disp_name_out; - - if ( !hnd ) - return CAC_FAILURE; - - if ( !hnd->_internal.ctx ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( !op || !op->in.svc_hnd || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SVCCTL ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - err = rpccli_svcctl_get_dispname( pipe_hnd, mem_ctx, op->in.svc_hnd, - disp_name_out ); - hnd->status = werror_to_ntstatus( err ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - op->out.display_name = talloc_strdup( mem_ctx, disp_name_out ); - - if ( !op->out.display_name ) { - hnd->status = NT_STATUS_NO_MEMORY; - return CAC_FAILURE; - } - - return CAC_SUCCESS; -} - - -int cac_SvcGetServiceConfig( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct SvcGetServiceConfig *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - WERROR err; - - SERVICE_CONFIG config_out; - - if ( !hnd ) - return CAC_FAILURE; - - if ( !hnd->_internal.ctx ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( !op || !op->in.svc_hnd || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_SVCCTL ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - err = rpccli_svcctl_query_config( pipe_hnd, mem_ctx, op->in.svc_hnd, - &config_out ); - hnd->status = werror_to_ntstatus( err ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - if ( !cac_InitCacServiceConfig - ( mem_ctx, &config_out, &op->out.config ) ) { - hnd->status = NT_STATUS_NO_MEMORY; - return CAC_FAILURE; - } - - return CAC_SUCCESS; - -} diff --git a/source3/libmsrpc/cac_winreg.c b/source3/libmsrpc/cac_winreg.c deleted file mode 100644 index 0470d2a80f..0000000000 --- a/source3/libmsrpc/cac_winreg.c +++ /dev/null @@ -1,1177 +0,0 @@ - -/* - * Unix SMB/CIFS implementation. - * MS-RPC client library implementation (WINREG pipe) - * Copyright (C) Chris Nicholls 2005. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, see <http://www.gnu.org/licenses/>. - */ - -#include "libmsrpc.h" -#include "libmsrpc_internal.h" - -NTSTATUS cac_delete_subkeys_recursive(struct rpc_pipe_client * pipe_hnd, - TALLOC_CTX * mem_ctx, POLICY_HND * key); - -int cac_RegConnect( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct RegConnect *op ) -{ - SMBCSRV *srv = NULL; - struct rpc_pipe_client *pipe_hnd = NULL; - POLICY_HND *key = NULL; - - if ( !hnd ) - return CAC_FAILURE; - - if ( !hnd->_internal.ctx ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( !op || !op->in.root || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - srv = cac_GetServer( hnd ); - if ( !srv ) { - hnd->status = NT_STATUS_INVALID_CONNECTION; - return CAC_FAILURE; - } - - /*initialize for winreg pipe if we have to */ - if ( !hnd->_internal.pipes[PI_WINREG] ) { - if ( ! - ( pipe_hnd = - cli_rpc_pipe_open_noauth( srv->cli, PI_WINREG, - &hnd->status ) ) ) { - return CAC_FAILURE; - } - - hnd->_internal.pipes[PI_WINREG] = True; - } - - pipe_hnd = cac_GetPipe( hnd, PI_WINREG ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - key = talloc( mem_ctx, POLICY_HND ); - if ( !key ) { - hnd->status = NT_STATUS_NO_MEMORY; - return CAC_FAILURE; - } - - hnd->status = - rpccli_winreg_Connect( pipe_hnd, mem_ctx, op->in.root, - op->in.access, key ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) { - return CAC_FAILURE; - } - - op->out.key = key; - - return CAC_SUCCESS; -} - -int cac_RegClose( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - POLICY_HND * key ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - - if ( !hnd ) - return CAC_FAILURE; - - if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_WINREG] ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( !key || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_WINREG ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - hnd->status = rpccli_winreg_CloseKey( pipe_hnd, mem_ctx, key ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) { - return CAC_FAILURE; - } - - return CAC_SUCCESS; -} - -int cac_RegOpenKey( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct RegOpenKey *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - struct winreg_String key_string; - - POLICY_HND *key_out; - POLICY_HND *parent_key; - - char *key_name = NULL; - uint32 reg_type = 0; - - struct RegConnect rc; - - if ( !hnd ) - return CAC_FAILURE; - - if ( !hnd->_internal.ctx ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( !op || !op->in.name || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - - key_out = talloc( mem_ctx, POLICY_HND ); - if ( !key_out ) { - hnd->status = NT_STATUS_NO_MEMORY; - return CAC_FAILURE; - } - - if ( !op->in.parent_key ) { - /*then we need to connect to the registry */ - if ( !cac_ParseRegPath( op->in.name, ®_type, &key_name ) ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - /*use cac_RegConnect because it handles the session setup */ - ZERO_STRUCT( rc ); - - rc.in.access = op->in.access; - rc.in.root = reg_type; - - if ( !cac_RegConnect( hnd, mem_ctx, &rc ) ) { - return CAC_FAILURE; - } - - /**if they only specified the root key, return the key we just opened*/ - if ( key_name == NULL ) { - op->out.key = rc.out.key; - return CAC_SUCCESS; - } - - parent_key = rc.out.key; - } else { - parent_key = op->in.parent_key; - key_name = op->in.name; - } - - pipe_hnd = cac_GetPipe( hnd, PI_WINREG ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - key_string.name = key_name; - hnd->status = - rpccli_winreg_OpenKey( pipe_hnd, mem_ctx, parent_key, - key_string, 0, op->in.access, - key_out ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) { - return CAC_FAILURE; - } - - if ( !op->in.parent_key ) { - /*then close the one that we opened above */ - hnd->status = - rpccli_winreg_CloseKey( pipe_hnd, mem_ctx, - parent_key ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) { - return CAC_FAILURE; - } - } - - op->out.key = key_out; - - return CAC_SUCCESS; -} - -int cac_RegEnumKeys( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct RegEnumKeys *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - - /*buffers for rpccli_reg_enum_key call */ - fstring key_name_in; - fstring class_name_in; - - /*output buffers */ - char **key_names_out = NULL; - char **class_names_out = NULL; - time_t *mod_times_out = NULL; - uint32 num_keys_out = 0; - uint32 resume_idx = 0; - - if ( !hnd ) - return CAC_FAILURE; - - /* This is to avoid useless rpc calls, if the last call - exhausted all the keys, then we don't need to go - through everything again */ - - if ( NT_STATUS_V( hnd->status ) == - NT_STATUS_V( NT_STATUS_GUIDS_EXHAUSTED ) ) - return CAC_FAILURE; - - if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_WINREG] ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( !op || op->in.max_keys == 0 || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_WINREG ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - /* The only way to know how many keys to expect is to - assume max_keys keys will be found */ - - key_names_out = TALLOC_ARRAY( mem_ctx, char *, op->in.max_keys ); - if ( !key_names_out ) { - hnd->status = NT_STATUS_NO_MEMORY; - return CAC_FAILURE; - } - - class_names_out = TALLOC_ARRAY( mem_ctx, char *, op->in.max_keys ); - if ( !class_names_out ) { - hnd->status = NT_STATUS_NO_MEMORY; - TALLOC_FREE( key_names_out ); - return CAC_FAILURE; - } - - mod_times_out = TALLOC_ARRAY( mem_ctx, time_t, op->in.max_keys ); - if ( !mod_times_out ) { - hnd->status = NT_STATUS_NO_MEMORY; - TALLOC_FREE( key_names_out ); - TALLOC_FREE( class_names_out ); - - return CAC_FAILURE; - } - - resume_idx = op->out.resume_idx; - - do { -#if 0 - hnd->status = - rpccli_winreg_EnumKey( pipe_hnd, mem_ctx, op->in.key, - resume_idx, key_name_in, - class_name_in, - &mod_times_out ); -#endif - - if ( !NT_STATUS_IS_OK( hnd->status ) ) { - /*don't increment any values */ - break; - } - - key_names_out[num_keys_out] = - talloc_strdup( mem_ctx, key_name_in ); - - class_names_out[num_keys_out] = - talloc_strdup( mem_ctx, class_name_in ); - - if ( !key_names_out[num_keys_out] - || !class_names_out[num_keys_out] ) { - hnd->status = NT_STATUS_NO_MEMORY; - break; - } - - resume_idx++; - num_keys_out++; - } while ( num_keys_out < op->in.max_keys ); - - if ( CAC_OP_FAILED( hnd->status ) ) { - op->out.num_keys = 0; - return CAC_FAILURE; - } - - op->out.resume_idx = resume_idx; - op->out.num_keys = num_keys_out; - op->out.key_names = key_names_out; - op->out.class_names = class_names_out; - op->out.mod_times = mod_times_out; - - return CAC_SUCCESS; -} - -int cac_RegCreateKey( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct RegCreateKey *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - POLICY_HND *key_out; - struct RegOpenKey rok; - struct winreg_String key_string, class_string; - enum winreg_CreateAction action = 0; - - if ( !hnd ) - return CAC_FAILURE; - - if ( !hnd->_internal.ctx ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( !op || !op->in.parent_key || !op->in.key_name || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - /*first try to open the key - we use cac_RegOpenKey(). this doubles as a way to ensure the winreg pipe is initialized */ - ZERO_STRUCT( rok ); - - rok.in.name = op->in.key_name; - rok.in.access = op->in.access; - rok.in.parent_key = op->in.parent_key; - - if ( cac_RegOpenKey( hnd, mem_ctx, &rok ) ) { - /*then we got the key, return */ - op->out.key = rok.out.key; - return CAC_SUCCESS; - } - - /*just be ultra-safe */ - pipe_hnd = cac_GetPipe( hnd, PI_WINREG ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - key_out = talloc( mem_ctx, POLICY_HND ); - if ( !key_out ) { - hnd->status = NT_STATUS_NO_MEMORY; - return CAC_FAILURE; - } - - key_string.name = op->in.key_name; - class_string.name = op->in.class_name; - hnd->status = - rpccli_winreg_CreateKey( pipe_hnd, mem_ctx, op->in.parent_key, - key_string, class_string, 0, - op->in.access, NULL, key_out, - &action ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) { - return CAC_FAILURE; - } - - op->out.key = key_out; - - return CAC_SUCCESS; - -} - -NTSTATUS cac_delete_subkeys_recursive( struct rpc_pipe_client * pipe_hnd, - TALLOC_CTX * mem_ctx, POLICY_HND * key ) -{ - POLICY_HND subkey; - fstring subkey_name; - int cur_key = 0; - NTSTATUS status; - uint32 num_subkeys, max_subkeylen, max_classlen; - uint32 num_values, max_valnamelen, maxvalbufsize; - char *name_buffer; - struct winreg_String class_string; - - NTTIME modtime; - uint32 secdescsize; - - /* First get the max subkey name length */ - - class_string.name = NULL; - status = rpccli_winreg_QueryInfoKey( pipe_hnd, mem_ctx, key, - &class_string, &num_subkeys, - &max_subkeylen, &max_classlen, - &num_values, &max_valnamelen, - &maxvalbufsize, &secdescsize, - &modtime ); - - - if ( !NT_STATUS_IS_OK( status ) ) { - return status; - } - - if ( (name_buffer = TALLOC_ARRAY( mem_ctx, char, max_subkeylen )) == NULL ) { - d_fprintf(stderr, "Memory allocation error.\n"); - return NT_STATUS_NO_MEMORY; - } - - - while ( NT_STATUS_IS_OK( status ) ) { - struct winreg_String key_string; - struct winreg_StringBuf subkey_string; - fstring subkeyname; - - memset( name_buffer, 0x0, max_subkeylen ); - subkey_string.name = name_buffer; - subkey_string.length = 0; - subkey_string.size = max_subkeylen; - - status = rpccli_winreg_EnumKey(pipe_hnd, mem_ctx, key, cur_key, - &subkey_string, NULL, NULL); - - if ( !NT_STATUS_IS_OK( status ) ) - break; - - /* copy the keyname and add the terminating NULL */ - - StrnCpy( subkeyname, subkey_string.name, - MIN(subkey_string.length, sizeof(subkeyname)-1) ); - subkeyname[MIN(subkey_string.length, sizeof(subkeyname)-1)] = '\0'; - - /*try to open the key with full access */ - - key_string.name = subkeyname; - status = rpccli_winreg_OpenKey( pipe_hnd, mem_ctx, key, - key_string, 0, REG_KEY_ALL, - &subkey ); - - if ( !NT_STATUS_IS_OK( status ) ) - break; - - status = cac_delete_subkeys_recursive( pipe_hnd, mem_ctx, - &subkey ); - - if ( !W_ERROR_EQUAL( ntstatus_to_werror(status), WERR_NO_MORE_ITEMS ) - && !NT_STATUS_IS_OK( status ) ) - break; - - /*flush the key just to be safe */ - rpccli_winreg_FlushKey( pipe_hnd, mem_ctx, key ); - - /*close the key that we opened */ - rpccli_winreg_CloseKey( pipe_hnd, mem_ctx, &subkey ); - - /*now we delete the subkey */ - key_string.name = subkey_name; - status = rpccli_winreg_DeleteKey( pipe_hnd, mem_ctx, key, - key_string ); - - cur_key++; - } - - - return status; -} - - - -int cac_RegDeleteKey( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct RegDeleteKey *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - struct winreg_String key_string; - - if ( !hnd ) - return CAC_FAILURE; - - if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_WINREG] ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( !op || !op->in.parent_key || !op->in.name || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_WINREG ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( op->in.recursive ) { - - /* first open the key, and then delete all of - it's subkeys recursively */ - - struct RegOpenKey rok; - - ZERO_STRUCT( rok ); - - rok.in.parent_key = op->in.parent_key; - rok.in.name = op->in.name; - rok.in.access = REG_KEY_ALL; - - if ( !cac_RegOpenKey( hnd, mem_ctx, &rok ) ) - return CAC_FAILURE; - - hnd->status = cac_delete_subkeys_recursive( pipe_hnd, mem_ctx, - rok.out.key ); - - /*close the key that we opened */ - cac_RegClose( hnd, mem_ctx, rok.out.key ); - - if ( NT_STATUS_V( hnd->status ) != - NT_STATUS_V( NT_STATUS_GUIDS_EXHAUSTED ) - && !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - /*now go on to actually delete the key */ - } - - key_string.name = op->in.name; - hnd->status = - rpccli_winreg_DeleteKey( pipe_hnd, mem_ctx, op->in.parent_key, - key_string ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) { - return CAC_FAILURE; - } - - return CAC_SUCCESS; -} - -int cac_RegDeleteValue( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct RegDeleteValue *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - struct winreg_String value_string; - - if ( !hnd ) - return CAC_FAILURE; - - if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_WINREG] ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( !op || !op->in.parent_key || !op->in.name || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_WINREG ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - value_string.name = op->in.name; - hnd->status = - rpccli_winreg_DeleteValue( pipe_hnd, mem_ctx, - op->in.parent_key, value_string ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) { - return CAC_FAILURE; - } - - return CAC_SUCCESS; -} - -int cac_RegQueryKeyInfo( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct RegQueryKeyInfo *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - uint32 num_subkeys_out = 0; - uint32 long_subkey_out = 0; - uint32 long_class_out = 0; - uint32 num_values_out = 0; - uint32 long_value_out = 0; - uint32 long_data_out = 0; - uint32 secdesc_size = 0; - NTTIME mod_time; - struct winreg_String class_string; - - if ( !hnd ) - return CAC_FAILURE; - - if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_WINREG] ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( !op || !op->in.key || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_WINREG ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - hnd->status = rpccli_winreg_QueryInfoKey( pipe_hnd, mem_ctx, - op->in.key, - &class_string, - &num_subkeys_out, - &long_subkey_out, - &long_class_out, - &num_values_out, - &long_value_out, - &long_data_out, - &secdesc_size, &mod_time ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - if ( !class_string.name ) { - op->out.class_name = talloc_strdup( mem_ctx, "" ); - } else { - op->out.class_name = talloc_strdup( mem_ctx, class_string.name ); - } - - if ( !op->out.class_name ) { - hnd->status = NT_STATUS_NO_MEMORY; - return CAC_FAILURE; - } - - op->out.num_subkeys = num_subkeys_out; - op->out.longest_subkey = long_subkey_out; - op->out.longest_class = long_class_out; - op->out.num_values = num_values_out; - op->out.longest_value_name = long_value_out; - op->out.longest_value_data = long_data_out; - op->out.security_desc_size = secdesc_size; - op->out.last_write_time = nt_time_to_unix( mod_time ); - - return CAC_FAILURE; -} - -int cac_RegQueryValue( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct RegQueryValue *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - struct winreg_String value_string; - REGVAL_BUFFER buffer; - REG_VALUE_DATA *data_out = NULL; - enum winreg_Type val_type; - uint8 *buf; - uint32 buf_size = 4096; - uint32 length = 0; - - if ( !hnd ) - return CAC_FAILURE; - - if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_WINREG] ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( !op || !op->in.key || !op->in.val_name || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_WINREG ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - value_string.name = op->in.val_name; - - if ( ( buf = TALLOC_ARRAY( mem_ctx, uint8, buf_size ) ) == NULL ) { - hnd->status = NT_STATUS_NO_MEMORY; - return CAC_FAILURE; - } - - hnd->status = rpccli_winreg_QueryValue( pipe_hnd, mem_ctx, op->in.key, - value_string, &val_type, buf, - &buf_size, &length ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - init_regval_buffer( &buffer, buf, length ); - - data_out = cac_MakeRegValueData( mem_ctx, val_type, buffer ); - if ( !data_out ) { - if ( errno == ENOMEM ) - hnd->status = NT_STATUS_NO_MEMORY; - else - hnd->status = NT_STATUS_INVALID_PARAMETER; - - return CAC_FAILURE; - } - - op->out.type = val_type; - op->out.data = data_out; - - return CAC_SUCCESS; -} - - -int cac_RegEnumValues( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct RegEnumValues *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - char *name_buffer; - REGVAL_BUFFER val_buf; - uint32 *types_out = NULL; - REG_VALUE_DATA **values_out = NULL; - char **val_names_out = NULL; - uint32 num_values_out = 0; - uint32 resume_idx = 0; - uint32 num_subkeys, max_subkeylen, max_classlen; - uint32 num_values, max_valnamelen, maxvalbufsize; - struct winreg_String class_string; - NTTIME modtime; - uint32 secdescsize; - uint8 *buffer; - - if ( !hnd ) - return CAC_FAILURE; - - /* This is to avoid useless rpc calls, if the last - call exhausted all the keys, then we don't need - to go through everything again */ - - if ( NT_STATUS_V( hnd->status ) == - NT_STATUS_V( NT_STATUS_GUIDS_EXHAUSTED ) ) - return CAC_FAILURE; - - if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_WINREG] ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( !op || !op->in.key || op->in.max_values == 0 || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_WINREG ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - /*we need to assume that the max number of values will be enumerated */ - types_out = TALLOC_ARRAY( mem_ctx, uint32, op->in.max_values ); - - if ( !types_out ) { - hnd->status = NT_STATUS_NO_MEMORY; - return CAC_FAILURE; - } - - values_out = TALLOC_ARRAY( mem_ctx, REG_VALUE_DATA *, - op->in.max_values ); - - if ( !values_out ) { - TALLOC_FREE( types_out ); - hnd->status = NT_STATUS_NO_MEMORY; - return CAC_FAILURE; - } - - val_names_out = TALLOC_ARRAY( mem_ctx, char *, op->in.max_values ); - - if ( !val_names_out ) { - TALLOC_FREE( types_out ); - TALLOC_FREE( values_out ); - hnd->status = NT_STATUS_NO_MEMORY; - return CAC_FAILURE; - } - - resume_idx = op->out.resume_idx; - - class_string.name = NULL; - hnd->status = rpccli_winreg_QueryInfoKey( pipe_hnd, mem_ctx, op->in.key, - &class_string, &num_subkeys, - &max_subkeylen, &max_classlen, - &num_values, &max_valnamelen, - &maxvalbufsize, &secdescsize, - &modtime ); - - if ( !NT_STATUS_IS_OK(hnd->status) ) { - TALLOC_FREE( types_out ); - TALLOC_FREE( values_out ); - - return CAC_FAILURE; - } - - if ( (buffer = TALLOC_ARRAY( mem_ctx, uint8, maxvalbufsize )) == NULL ) { - TALLOC_FREE( types_out ); - TALLOC_FREE( values_out ); - hnd->status = NT_STATUS_NO_MEMORY; - - return CAC_FAILURE; - } - - if ( (name_buffer = TALLOC_ARRAY(mem_ctx, char, max_valnamelen)) == NULL ) { - TALLOC_FREE( types_out ); - TALLOC_FREE( values_out ); - TALLOC_FREE( buffer ); - hnd->status = NT_STATUS_NO_MEMORY; - - return CAC_FAILURE; - } - - do { - uint32 data_size = maxvalbufsize; - uint32 data_length = 0; - struct winreg_ValNameBuf name_buf; - - memset( name_buffer, 0x0, max_valnamelen ); - name_buf.name = name_buffer; - name_buf.size = max_valnamelen; - name_buf.length = 0; - - hnd->status = rpccli_winreg_EnumValue( pipe_hnd, mem_ctx, - op->in.key, - resume_idx, &name_buf, - &types_out[num_values_out], buffer, - &data_size, - &data_length ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - break; - - ZERO_STRUCT( val_buf ); - init_regval_buffer( &val_buf, buffer, data_length ); - - values_out[num_values_out] = cac_MakeRegValueData( mem_ctx, - types_out[num_values_out], - val_buf ); - val_names_out[num_values_out] = TALLOC_ARRAY( mem_ctx, char, name_buf.length+1 ); - - if ( !val_names_out[num_values_out] - || !values_out[num_values_out] ) { - hnd->status = NT_STATUS_NO_MEMORY; - break; - } - - StrnCpy( val_names_out[num_values_out], name_buf.name, name_buf.length ); - (val_names_out[num_values_out])[name_buf.length] = '\0'; - - num_values_out++; - resume_idx++; - } while ( num_values_out < op->in.max_values ); - - if ( CAC_OP_FAILED( hnd->status ) ) - return CAC_FAILURE; - - op->out.types = types_out; - op->out.num_values = num_values_out; - op->out.value_names = val_names_out; - op->out.values = values_out; - op->out.resume_idx = resume_idx; - - return CAC_SUCCESS; -} - -int cac_RegSetValue( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct RegSetValue *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - struct winreg_String value_string; - - RPC_DATA_BLOB *buffer; - - if ( !hnd ) - return CAC_FAILURE; - - if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_WINREG] ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( !op || !op->in.key || !op->in.val_name || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_WINREG ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - buffer = cac_MakeRpcDataBlob( mem_ctx, op->in.type, op->in.value ); - - if ( !buffer ) { - if ( errno == ENOMEM ) - hnd->status = NT_STATUS_NO_MEMORY; - else - hnd->status = NT_STATUS_INVALID_PARAMETER; - - return CAC_FAILURE; - } - - value_string.name = op->in.val_name; - hnd->status = - rpccli_winreg_SetValue( pipe_hnd, mem_ctx, op->in.key, - value_string, op->in.type, - buffer->buffer, buffer->buf_len ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - /*flush */ - hnd->status = rpccli_winreg_FlushKey( pipe_hnd, mem_ctx, op->in.key ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - return CAC_SUCCESS; -} - - - -int cac_RegGetVersion( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct RegGetVersion *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - uint32 version_out; - - if ( !hnd ) - return CAC_FAILURE; - - if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_WINREG] ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( !op || !op->in.key || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_WINREG ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - hnd->status = - rpccli_winreg_GetVersion( pipe_hnd, mem_ctx, op->in.key, - &version_out ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - op->out.version = version_out; - - return CAC_SUCCESS; -} - -int cac_RegGetKeySecurity( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct RegGetKeySecurity *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - struct KeySecurityData keysec; - - ZERO_STRUCT( keysec ); - - if ( !hnd ) - return CAC_FAILURE; - - if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_WINREG] ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( !op || !op->in.key || op->in.info_type == 0 || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_WINREG ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - hnd->status = - rpccli_winreg_GetKeySecurity( pipe_hnd, mem_ctx, op->in.key, - op->in.info_type, &keysec ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) { - return CAC_FAILURE; - } - -#if 0 /* FIX ME!!!! unmarshall the security descriptor */ - op->out.size = buf.sd_size; - op->out.descriptor = dup_sec_desc( mem_ctx, buf.sd ); -#endif - - if ( op->out.descriptor == NULL ) { - return CAC_FAILURE; - } - - return CAC_SUCCESS; -} - -int cac_RegSetKeySecurity( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct RegSetKeySecurity *op ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - struct KeySecurityData keysec; - - ZERO_STRUCT( keysec ); - - if ( !hnd ) - return CAC_FAILURE; - - if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_WINREG] ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( !op || !op->in.key || op->in.info_type == 0 || op->in.size == 0 - || !op->in.descriptor || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_WINREG ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - /* FIXME!!! Marshall in the input sec_desc to struct KeySecurityData */ - hnd->status = - rpccli_winreg_SetKeySecurity( pipe_hnd, mem_ctx, op->in.key, - op->in.info_type, &keysec ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) { - return CAC_FAILURE; - } - - return CAC_SUCCESS; -} - -int cac_Shutdown( CacServerHandle * hnd, TALLOC_CTX * mem_ctx, - struct Shutdown *op ) -{ - SMBCSRV *srv = NULL; - struct rpc_pipe_client *pipe_hnd = NULL; - struct initshutdown_String msg_string; - struct initshutdown_String_sub s; - - char *msg; - - if ( !hnd ) - return CAC_FAILURE; - - if ( !hnd->_internal.ctx ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - if ( !op || !mem_ctx ) { - hnd->status = NT_STATUS_INVALID_PARAMETER; - return CAC_FAILURE; - } - - srv = cac_GetServer( hnd ); - if ( !srv ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - /*initialize for winreg pipe if we have to */ - if ( !hnd->_internal.pipes[PI_INITSHUTDOWN] ) { - if ( ! - ( pipe_hnd = - cli_rpc_pipe_open_noauth( srv->cli, PI_INITSHUTDOWN, - &( hnd->status ) ) ) ) { - return CAC_FAILURE; - } - - hnd->_internal.pipes[PI_INITSHUTDOWN] = True; - } - - pipe_hnd = cac_GetPipe( hnd, PI_INITSHUTDOWN ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - msg = ( op->in.message != - NULL ) ? op->in.message : talloc_strdup( mem_ctx, "" ); - msg_string.name = &s; - msg_string.name->name = msg; - - hnd->status = NT_STATUS_OK; - - if ( hnd->_internal.srv_level > SRV_WIN_NT4 ) { - hnd->status = - rpccli_initshutdown_InitEx( pipe_hnd, mem_ctx, NULL, - &msg_string, - op->in.timeout, - op->in.reboot, - op->in.force, - op->in.reason ); - } - - if ( hnd->_internal.srv_level < SRV_WIN_2K - || !NT_STATUS_IS_OK( hnd->status ) ) { - hnd->status = - rpccli_initshutdown_Init( pipe_hnd, mem_ctx, NULL, - &msg_string, op->in.timeout, - op->in.reboot, - op->in.force ); - - hnd->_internal.srv_level = SRV_WIN_NT4; - } - - if ( !NT_STATUS_IS_OK( hnd->status ) ) { - return CAC_FAILURE; - } - - return CAC_SUCCESS; -} - -int cac_AbortShutdown( CacServerHandle * hnd, TALLOC_CTX * mem_ctx ) -{ - struct rpc_pipe_client *pipe_hnd = NULL; - - if ( !hnd ) - return CAC_FAILURE; - - if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_INITSHUTDOWN] ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - pipe_hnd = cac_GetPipe( hnd, PI_INITSHUTDOWN ); - if ( !pipe_hnd ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return CAC_FAILURE; - } - - hnd->status = rpccli_initshutdown_Abort( pipe_hnd, mem_ctx, NULL ); - - if ( !NT_STATUS_IS_OK( hnd->status ) ) - return CAC_FAILURE; - - return CAC_SUCCESS; -} diff --git a/source3/libmsrpc/libmsrpc.c b/source3/libmsrpc/libmsrpc.c deleted file mode 100644 index 1211702b9a..0000000000 --- a/source3/libmsrpc/libmsrpc.c +++ /dev/null @@ -1,349 +0,0 @@ - -/* - * Unix SMB/CIFS implementation. - * MS-RPC client library implementation - * Copyright (C) Chris Nicholls 2005. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, see <http://www.gnu.org/licenses/>. - */ - -#include "libmsrpc.h" -#include "libmsrpc_internal.h" -#include "libsmbclient.h" -#include "libsmb_internal.h" - -int cac_InitHandleData( CacServerHandle * hnd ); - -/*this function is based on code found in smbc_init_context() (libsmb/libsmbclient.c)*/ -void cac_Init( int debug ) -{ - if ( debug < 0 || debug > 99 ) - debug = 0; - - DEBUGLEVEL = debug; - - setup_logging( "libmsrpc", True ); -} - -int cac_InitHandleMem( CacServerHandle * hnd ) -{ - hnd->username = SMB_MALLOC_ARRAY( char, sizeof( fstring ) ); - - if ( !hnd->username ) - return CAC_FAILURE; - - hnd->username[0] = '\0'; - - hnd->domain = SMB_MALLOC_ARRAY( char, sizeof( fstring ) ); - if ( !hnd->domain ) - return CAC_FAILURE; - - hnd->domain[0] = '\0'; - - hnd->netbios_name = SMB_MALLOC_ARRAY( char, sizeof( fstring ) ); - if ( !hnd->netbios_name ) - return CAC_FAILURE; - - hnd->netbios_name[0] = '\0'; - - hnd->password = SMB_MALLOC_ARRAY( char, sizeof( fstring ) ); - if ( !hnd->password ) - return CAC_FAILURE; - - hnd->password[0] = '\0'; - - hnd->server = SMB_MALLOC_ARRAY( char, sizeof( fstring ) ); - if ( !hnd->server ) - return CAC_FAILURE; - - hnd->server[0] = '\0'; - - return CAC_SUCCESS; -} - -CacServerHandle *cac_NewServerHandle( BOOL allocate_fields ) -{ - CacServerHandle *hnd; - - hnd = SMB_MALLOC_P( CacServerHandle ); - - if ( !hnd ) { - errno = ENOMEM; - return NULL; - } - - ZERO_STRUCTP( hnd ); - - if ( allocate_fields == True ) { - if ( !cac_InitHandleMem( hnd ) ) { - SAFE_FREE( hnd ); - return NULL; - } - } - - hnd->_internal.ctx = smbc_new_context( ); - if ( !hnd->_internal.ctx ) { - cac_FreeHandle( hnd ); - return NULL; - } - - hnd->_internal.ctx->callbacks.auth_fn = cac_GetAuthDataFn; - - /*add defaults */ - hnd->debug = 0; - - /*start at the highest and it will fall down after trying the functions */ - hnd->_internal.srv_level = SRV_WIN_2K3; - - hnd->_internal.user_supplied_ctx = False; - - return hnd; -} - -int cac_InitHandleData( CacServerHandle * hnd ) -{ - /*store any automatically initialized values */ - if ( !hnd->netbios_name ) { - hnd->netbios_name = - SMB_STRDUP( hnd->_internal.ctx->netbios_name ); - } else if ( hnd->netbios_name[0] == '\0' ) { - strncpy( hnd->netbios_name, hnd->_internal.ctx->netbios_name, - sizeof( fstring ) ); - } - - if ( !hnd->username ) { - hnd->username = SMB_STRDUP( hnd->_internal.ctx->user ); - } else if ( hnd->username[0] == '\0' ) { - strncpy( hnd->username, hnd->_internal.ctx->user, - sizeof( fstring ) ); - } - - if ( !hnd->domain ) { - hnd->domain = SMB_STRDUP( hnd->_internal.ctx->workgroup ); - } else if ( hnd->domain[0] == '\0' ) { - strncpy( hnd->domain, hnd->_internal.ctx->workgroup, - sizeof( fstring ) ); - } - - return CAC_SUCCESS; -} - -void cac_SetAuthDataFn( CacServerHandle * hnd, smbc_get_auth_data_fn auth_fn ) -{ - hnd->_internal.ctx->callbacks.auth_fn = auth_fn; -} - -void cac_SetSmbcContext( CacServerHandle * hnd, SMBCCTX * ctx ) -{ - - SAFE_FREE( hnd->_internal.ctx ); - - hnd->_internal.user_supplied_ctx = True; - - hnd->_internal.ctx = ctx; - - /*_try_ to avoid any problems that might occur if cac_Connect() isn't called*/ - /*cac_InitHandleData(hnd); */ -} - -/*used internally*/ -SMBCSRV *cac_GetServer( CacServerHandle * hnd ) -{ - SMBCSRV *srv; - - if ( !hnd || !hnd->_internal.ctx ) { - return NULL; - } - - srv = smbc_attr_server( hnd->_internal.ctx, hnd->server, "IPC$", - hnd->domain, hnd->username, hnd->password, - NULL ); - if ( !srv ) { - hnd->status = NT_STATUS_UNSUCCESSFUL; - DEBUG( 1, - ( "cac_GetServer: Could not find server connection.\n" ) ); - } - - return srv; -} - - -int cac_Connect( CacServerHandle * hnd, const char *srv ) -{ - if ( !hnd ) { - return CAC_FAILURE; - } - - /*these values should be initialized by the user */ - if ( !hnd->server && !srv ) { - return CAC_FAILURE; - } - - - /*change the server name in the server handle if necessary */ - if ( srv && hnd->server && strcmp( hnd->server, srv ) == 0 ) { - SAFE_FREE( hnd->server ); - hnd->server = SMB_STRDUP( srv ); - } - - - /*first see if the context has already been setup */ - if ( !( hnd->_internal.ctx->internal->_initialized ) ) { - hnd->_internal.ctx->debug = hnd->debug; - - /*initialize the context */ - if ( !smbc_init_context( hnd->_internal.ctx ) ) { - return CAC_FAILURE; - } - } - - /*copy any uninitialized values out of the smbc context into the handle */ - if ( !cac_InitHandleData( hnd ) ) { - return CAC_FAILURE; - } - - DEBUG( 3, ( "cac_Connect: Username: %s\n", hnd->username ) ); - DEBUG( 3, ( "cac_Connect: Domain: %s\n", hnd->domain ) ); - DEBUG( 3, ( "cac_Connect: Netbios Name: %s\n", hnd->netbios_name ) ); - - if ( !cac_GetServer( hnd ) ) { - return CAC_FAILURE; - } - - return CAC_SUCCESS; - -} - - -void cac_FreeHandle( CacServerHandle * hnd ) -{ - if ( !hnd ) - return; - - /*only free the context if we created it */ - if ( !hnd->_internal.user_supplied_ctx ) { - smbc_free_context( hnd->_internal.ctx, True ); - } - - SAFE_FREE( hnd->netbios_name ); - SAFE_FREE( hnd->domain ); - SAFE_FREE( hnd->username ); - SAFE_FREE( hnd->password ); - SAFE_FREE( hnd->server ); - SAFE_FREE( hnd ); - -} - -void cac_InitCacTime( CacTime * cactime, NTTIME nttime ) -{ - float high, low; - uint32 sec; - - if ( !cactime ) - return; - - ZERO_STRUCTP( cactime ); - - /*this code is taken from display_time() found in rpcclient/cmd_samr.c */ - if ( nttime == 0 ) - return; - - if ( nttime == 0x80000000000000LL ) - return; - - high = 65536; - high = high / 10000; - high = high * 65536; - high = high / 1000; - high = high * ( ~( nttime >> 32 ) ); - - low = ~( nttime & 0xFFFFFFFF ); - low = low / ( 1000 * 1000 * 10 ); - - sec = high + low; - - cactime->days = sec / ( 60 * 60 * 24 ); - cactime->hours = - ( sec - ( cactime->days * 60 * 60 * 24 ) ) / ( 60 * 60 ); - cactime->minutes = - ( sec - ( cactime->days * 60 * 60 * 24 ) - - ( cactime->hours * 60 * 60 ) ) / 60; - cactime->seconds = - sec - ( cactime->days * 60 * 60 * 24 ) - - ( cactime->hours * 60 * 60 ) - ( cactime->minutes * 60 ); -} - -void cac_GetAuthDataFn( const char *pServer, - const char *pShare, - char *pWorkgroup, - int maxLenWorkgroup, - char *pUsername, - int maxLenUsername, - char *pPassword, int maxLenPassword ) -{ - char temp[sizeof( fstring )]; - - static char authUsername[sizeof( fstring )]; - static char authWorkgroup[sizeof( fstring )]; - static char authPassword[sizeof( fstring )]; - static char authSet = 0; - - char *pass = NULL; - - - if ( authSet ) { - strncpy( pWorkgroup, authWorkgroup, maxLenWorkgroup - 1 ); - strncpy( pUsername, authUsername, maxLenUsername - 1 ); - strncpy( pPassword, authPassword, maxLenPassword - 1 ); - } else { - d_printf( "Domain: [%s] ", pWorkgroup ); - fgets( temp, sizeof( fstring ), stdin ); - - if ( temp[strlen( temp ) - 1] == '\n' ) { /* A new line? */ - temp[strlen( temp ) - 1] = '\0'; - } - - - if ( temp[0] != '\0' ) { - strncpy( pWorkgroup, temp, maxLenWorkgroup - 1 ); - strncpy( authWorkgroup, temp, maxLenWorkgroup - 1 ); - } - - d_printf( "Username: [%s] ", pUsername ); - fgets( temp, sizeof( fstring ), stdin ); - - if ( temp[strlen( temp ) - 1] == '\n' ) { /* A new line? */ - temp[strlen( temp ) - 1] = '\0'; - } - - if ( temp[0] != '\0' ) { - strncpy( pUsername, temp, maxLenUsername - 1 ); - strncpy( authUsername, pUsername, - maxLenUsername - 1 ); - } - - pass = getpass( "Password: " ); - if ( pass ) - fstrcpy( temp, pass ); - if ( temp[strlen( temp ) - 1] == '\n' ) { /* A new line? */ - temp[strlen( temp ) - 1] = '\0'; - } - if ( temp[0] != '\0' ) { - strncpy( pPassword, temp, maxLenPassword - 1 ); - strncpy( authPassword, pPassword, - maxLenPassword - 1 ); - } - authSet = 1; - } -} diff --git a/source3/libmsrpc/libmsrpc_internal.c b/source3/libmsrpc/libmsrpc_internal.c deleted file mode 100644 index 5c80509659..0000000000 --- a/source3/libmsrpc/libmsrpc_internal.c +++ /dev/null @@ -1,775 +0,0 @@ - -/* - * Unix SMB/CIFS implementation. - * MS-RPC client internal functions - * Copyright (C) Chris Nicholls 2005. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, see <http://www.gnu.org/licenses/>. - */ - - -#include "libmsrpc.h" -#include "libmsrpc_internal.h" - -char *cac_unistr_to_str( TALLOC_CTX * mem_ctx, uint16 * src, int num_bytes ); -char *talloc_unistr2_to_ascii( TALLOC_CTX * mem_ctx, UNISTR2 str ); -char *cac_unistr_ascii( TALLOC_CTX * mem_ctx, UNISTR src ); - -/*used to get a struct rpc_pipe_client* to be passed into rpccli* calls*/ -struct rpc_pipe_client *cac_GetPipe( CacServerHandle * hnd, int pi_idx ) -{ - SMBCSRV *srv = NULL; - struct rpc_pipe_client *pipe_hnd = NULL; - - if ( !hnd ) { - return NULL; - } - - if ( hnd->_internal.pipes[pi_idx] == False ) { - hnd->status = NT_STATUS_INVALID_HANDLE; - return NULL; - } - - srv = cac_GetServer( hnd ); - if ( !srv ) { - hnd->status = NT_STATUS_INVALID_CONNECTION; - return NULL; - } - - pipe_hnd = srv->cli->pipe_list; - - while ( pipe_hnd != NULL && pipe_hnd->pipe_idx != pi_idx ) { - pipe_hnd = pipe_hnd->next; - } - - return pipe_hnd; -} - -/*takes a string like HKEY_LOCAL_MACHINE\HARDWARE\ACPI and returns the reg_type code and then a pointer to the start of the path (HARDWARE)*/ -int cac_ParseRegPath( char *path, uint32 * reg_type, char **key_name ) -{ - - if ( !path ) - return CAC_FAILURE; - - if ( strncmp( path, "HKLM", 4 ) == 0 ) { - *reg_type = HKEY_LOCAL_MACHINE; - *key_name = ( path[4] == '\\' ) ? path + 5 : NULL; - } else if ( strncmp( path, "HKEY_LOCAL_MACHINE", 18 ) == 0 ) { - *reg_type = HKEY_LOCAL_MACHINE; - *key_name = ( path[18] == '\\' ) ? path + 19 : NULL; - } else if ( strncmp( path, "HKCR", 4 ) == 0 ) { - *reg_type = HKEY_CLASSES_ROOT; - *key_name = ( path[4] == '\\' ) ? path + 5 : NULL; - } else if ( strncmp( path, "HKEY_CLASSES_ROOT", 17 ) == 0 ) { - *reg_type = HKEY_CLASSES_ROOT; - *key_name = ( path[17] == '\\' ) ? path + 18 : NULL; - } else if ( strncmp( path, "HKU", 3 ) == 0 ) { - *reg_type = HKEY_USERS; - *key_name = ( path[3] == '\\' ) ? path + 4 : NULL; - } else if ( strncmp( path, "HKEY_USERS", 10 ) == 0 ) { - *reg_type = HKEY_USERS; - *key_name = ( path[10] == '\\' ) ? path + 11 : NULL; - } else if ( strncmp( path, "HKPD", 4 ) == 0 ) { - *reg_type = HKEY_PERFORMANCE_DATA; - *key_name = ( path[4] == '\\' ) ? path + 5 : NULL; - } else if ( strncmp( path, "HKEY_PERFORMANCE_DATA", 21 ) == 0 ) { - *reg_type = HKEY_PERFORMANCE_DATA; - *key_name = ( path[21] == '\\' ) ? path + 22 : NULL; - } else { - return CAC_FAILURE; - } - - return CAC_SUCCESS; -} - - - -RPC_DATA_BLOB *cac_MakeRpcDataBlob( TALLOC_CTX * mem_ctx, uint32 data_type, - REG_VALUE_DATA data ) -{ - RPC_DATA_BLOB *blob = NULL; - int i; - uint32 size = 0; - uint8 *multi = NULL; - uint32 multi_idx = 0; - - blob = talloc( mem_ctx, RPC_DATA_BLOB ); - - if ( !blob ) { - errno = ENOMEM; - return NULL; - } - - switch ( data_type ) { - case REG_SZ: - init_rpc_blob_str( blob, data.reg_sz, - strlen( data.reg_sz ) + 1 ); - break; - - case REG_EXPAND_SZ: - init_rpc_blob_str( blob, data.reg_expand_sz, - strlen( data.reg_sz ) + 1 ); - break; - - case REG_BINARY: - init_rpc_blob_bytes( blob, data.reg_binary.data, - data.reg_binary.data_length ); - break; - - case REG_DWORD: - init_rpc_blob_uint32( blob, data.reg_dword ); - break; - - case REG_DWORD_BIG_ENDIAN: - init_rpc_blob_uint32( blob, data.reg_dword_be ); - break; - - case REG_MULTI_SZ: - /*need to find the size */ - for ( i = 0; i < data.reg_multi_sz.num_strings; i++ ) { - size += strlen( data.reg_multi_sz.strings[i] ) + 1; - } - - /**need a whole bunch of unicode strings in a row (seperated by null characters), with an extra null-character on the end*/ - - multi = TALLOC_ZERO_ARRAY( mem_ctx, uint8, ( size + 1 ) * 2 ); /*size +1 for the extra null character */ - if ( !multi ) { - errno = ENOMEM; - break; - } - - /*do it using rpcstr_push() */ - multi_idx = 0; - for ( i = 0; i < data.reg_multi_sz.num_strings; i++ ) { - size_t len = - strlen( data.reg_multi_sz.strings[i] ) + 1; - - rpcstr_push( ( multi + multi_idx ), - data.reg_multi_sz.strings[i], len * 2, - STR_TERMINATE ); - - /* x2 becuase it is a uint8 buffer */ - multi_idx += len * 2; - } - - /*now initialize the buffer as binary data */ - init_rpc_blob_bytes( blob, multi, ( size + 1 ) * 2 ); - - break; - - default: - TALLOC_FREE( blob ); - blob = NULL; - return NULL; - } - - if ( !( blob->buffer ) ) { - TALLOC_FREE( blob ); - return NULL; - } - - return blob; -} - -/*turns a string in a uint16 array to a char array*/ -char *cac_unistr_to_str( TALLOC_CTX * mem_ctx, uint16 * src, int num_bytes ) -{ - char *buf; - - int i = 0; - - uint32 str_len = 0; - - /*don't allocate more space than we need */ - while ( ( str_len ) < num_bytes / 2 && src[str_len] != 0x0000 ) - str_len++; - - /*need room for a '\0' */ - str_len++; - - buf = TALLOC_ARRAY( mem_ctx, char, str_len ); - - if ( !buf ) { - return NULL; - } - - for ( i = 0; i < num_bytes / 2; i++ ) { - buf[i] = ( ( char * ) src )[2 * i]; - } - - buf[str_len - 1] = '\0'; - - return buf; -} - -REG_VALUE_DATA *cac_MakeRegValueData( TALLOC_CTX * mem_ctx, uint32 data_type, - REGVAL_BUFFER buf ) -{ - REG_VALUE_DATA *data; - - uint32 i; - - /*all of the following used for MULTI_SZ data */ - uint32 size = 0; - uint32 len = 0; - uint32 multi_idx = 0; - uint32 num_strings = 0; - char **strings = NULL; - - data = talloc( mem_ctx, REG_VALUE_DATA ); - if ( !data ) { - errno = ENOMEM; - return NULL; - } - - switch ( data_type ) { - case REG_SZ: - data->reg_sz = - cac_unistr_to_str( mem_ctx, buf.buffer, buf.buf_len ); - if ( !data->reg_sz ) { - TALLOC_FREE( data ); - errno = ENOMEM; - data = NULL; - } - - break; - - case REG_EXPAND_SZ: - data->reg_expand_sz = - cac_unistr_to_str( mem_ctx, buf.buffer, buf.buf_len ); - - if ( !data->reg_expand_sz ) { - TALLOC_FREE( data ); - errno = ENOMEM; - data = NULL; - } - - break; - - case REG_BINARY: - size = buf.buf_len; - - data->reg_binary.data_length = size; - - if (size) { - data->reg_binary.data = - ( uint8 * ) TALLOC_MEMDUP( mem_ctx, buf.buffer, size ); - if ( !data->reg_binary.data ) { - TALLOC_FREE( data ); - errno = ENOMEM; - data = NULL; - } - } else { - data->reg_binary.data = NULL; - } - break; - - case REG_DWORD: - data->reg_dword = *( ( uint32 * ) buf.buffer ); - break; - - case REG_DWORD_BIG_ENDIAN: - data->reg_dword_be = *( ( uint32 * ) buf.buffer ); - break; - - case REG_MULTI_SZ: - size = buf.buf_len; - - /*find out how many strings there are. size is # of bytes and we want to work uint16 */ - for ( i = 0; i < ( size / 2 - 1 ); i++ ) { - if ( buf.buffer[i] == 0x0000 ) - num_strings++; - - /*buffer is suppsed to be terminated with \0\0, but it might not be */ - if ( buf.buffer[i] == 0x0000 - && buf.buffer[i + 1] == 0x0000 ) - break; - } - - if (num_strings) { - strings = TALLOC_ARRAY( mem_ctx, char *, num_strings ); - - if ( !strings ) { - errno = ENOMEM; - TALLOC_FREE( data ); - break; - } - } else { - strings = NULL; - } - - if ( num_strings == 0 ) /*then our work here is done */ - break; - - for ( i = 0; i < num_strings; i++ ) { - /*find out how many characters are in this string */ - len = 0; - /*make sure we don't go past the end of the buffer and keep looping until we have a uni \0 */ - while ( multi_idx + len < size / 2 - && buf.buffer[multi_idx + len] != 0x0000 ) - len++; - - /*stay aware of the \0\0 */ - len++; - - strings[i] = TALLOC_ZERO_ARRAY( mem_ctx, char, len ); - - /*pull out the unicode string */ - rpcstr_pull( strings[i], ( buf.buffer + multi_idx ), - len, -1, STR_TERMINATE ); - - /*keep track of where we are in the bigger array */ - multi_idx += len; - } - - data->reg_multi_sz.num_strings = num_strings; - data->reg_multi_sz.strings = strings; - - break; - - default: - TALLOC_FREE( data ); - data = NULL; - } - - return data; -} - -SAM_USERINFO_CTR *cac_MakeUserInfoCtr( TALLOC_CTX * mem_ctx, - CacUserInfo * info ) -{ - SAM_USERINFO_CTR *ctr = NULL; - - /*the flags we are 'setting'- include/passdb.h */ - uint32 flags = - ACCT_USERNAME | ACCT_FULL_NAME | ACCT_PRIMARY_GID | - ACCT_DESCRIPTION | ACCT_COMMENT | ACCT_HOME_DIR | - ACCT_HOME_DRIVE | ACCT_LOGON_SCRIPT | ACCT_PROFILE | - ACCT_WORKSTATIONS | ACCT_FLAGS; - - NTTIME logon_time; - NTTIME logoff_time; - NTTIME kickoff_time; - NTTIME pass_last_set_time; - NTTIME pass_can_change_time; - NTTIME pass_must_change_time; - - UNISTR2 user_name; - UNISTR2 full_name; - UNISTR2 home_dir; - UNISTR2 dir_drive; - UNISTR2 log_scr; - UNISTR2 prof_path; - UNISTR2 desc; - UNISTR2 wkstas; - UNISTR2 mung_dial; - UNISTR2 unk; - - ctr = talloc( mem_ctx, SAM_USERINFO_CTR ); - if ( !ctr ) - return NULL; - - ZERO_STRUCTP( ctr->info.id23 ); - - ctr->info.id21 = talloc( mem_ctx, SAM_USER_INFO_21 ); - if ( !ctr->info.id21 ) - return NULL; - - ctr->switch_value = 21; - - ZERO_STRUCTP( ctr->info.id21 ); - - unix_to_nt_time( &logon_time, info->logon_time ); - unix_to_nt_time( &logoff_time, info->logoff_time ); - unix_to_nt_time( &kickoff_time, info->kickoff_time ); - unix_to_nt_time( &pass_last_set_time, info->pass_last_set_time ); - unix_to_nt_time( &pass_can_change_time, info->pass_can_change_time ); - unix_to_nt_time( &pass_must_change_time, - info->pass_must_change_time ); - - /*initialize the strings */ - init_unistr2( &user_name, info->username, UNI_STR_TERMINATE ); - init_unistr2( &full_name, info->full_name, UNI_STR_TERMINATE ); - init_unistr2( &home_dir, info->home_dir, UNI_STR_TERMINATE ); - init_unistr2( &dir_drive, info->home_drive, UNI_STR_TERMINATE ); - init_unistr2( &log_scr, info->logon_script, UNI_STR_TERMINATE ); - init_unistr2( &prof_path, info->profile_path, UNI_STR_TERMINATE ); - init_unistr2( &desc, info->description, UNI_STR_TERMINATE ); - init_unistr2( &wkstas, info->workstations, UNI_STR_TERMINATE ); - init_unistr2( &unk, "\0", UNI_STR_TERMINATE ); - init_unistr2( &mung_dial, info->dial, UNI_STR_TERMINATE ); - - /*manually set passmustchange */ - ctr->info.id21->passmustchange = - ( info->pass_must_change ) ? 0x01 : 0x00; - - init_sam_user_info21W( ctr->info.id21, &logon_time, &logoff_time, &kickoff_time, &pass_last_set_time, &pass_can_change_time, &pass_must_change_time, &user_name, &full_name, &home_dir, &dir_drive, &log_scr, &prof_path, &desc, &wkstas, &unk, &mung_dial, info->lm_password, info->nt_password, info->rid, info->group_rid, info->acb_mask, flags, 168, /*logon divs */ - info->logon_hours, - info->bad_passwd_count, info->logon_count ); - - return ctr; - -} - -char *talloc_unistr2_to_ascii( TALLOC_CTX * mem_ctx, UNISTR2 str ) -{ - char *buf = NULL; - - if ( !mem_ctx ) - return NULL; - - buf = TALLOC_ARRAY( mem_ctx, char, ( str.uni_str_len + 1 ) ); - if ( !buf ) - return NULL; - - unistr2_to_ascii( buf, &str, str.uni_str_len + 1 ); - - return buf; -} - -CacUserInfo *cac_MakeUserInfo( TALLOC_CTX * mem_ctx, SAM_USERINFO_CTR * ctr ) -{ - CacUserInfo *info = NULL; - SAM_USER_INFO_21 *id21 = NULL; - - if ( !ctr || ctr->switch_value != 21 ) - return NULL; - - info = talloc( mem_ctx, CacUserInfo ); - if ( !info ) - return NULL; - - id21 = ctr->info.id21; - - ZERO_STRUCTP( info ); - - info->logon_time = nt_time_to_unix( id21->logon_time ); - info->logoff_time = nt_time_to_unix( id21->logoff_time ); - info->kickoff_time = nt_time_to_unix( id21->kickoff_time ); - info->pass_last_set_time = - nt_time_to_unix( id21->pass_last_set_time ); - info->pass_can_change_time = - nt_time_to_unix( id21->pass_can_change_time ); - info->pass_must_change_time = - nt_time_to_unix( id21->pass_must_change_time ); - - info->username = - talloc_unistr2_to_ascii( mem_ctx, id21->uni_user_name ); - if ( !info->username ) - return NULL; - - info->full_name = - talloc_unistr2_to_ascii( mem_ctx, id21->uni_full_name ); - if ( !info->full_name ) - return NULL; - - info->home_dir = - talloc_unistr2_to_ascii( mem_ctx, id21->uni_home_dir ); - if ( !info->home_dir ) - return NULL; - - info->home_drive = - talloc_unistr2_to_ascii( mem_ctx, id21->uni_dir_drive ); - if ( !info->home_drive ) - return NULL; - - info->logon_script = - talloc_unistr2_to_ascii( mem_ctx, id21->uni_logon_script ); - if ( !info->logon_script ) - return NULL; - - info->profile_path = - talloc_unistr2_to_ascii( mem_ctx, id21->uni_profile_path ); - if ( !info->profile_path ) - return NULL; - - info->description = - talloc_unistr2_to_ascii( mem_ctx, id21->uni_acct_desc ); - if ( !info->description ) - return NULL; - - info->workstations = - talloc_unistr2_to_ascii( mem_ctx, id21->uni_workstations ); - if ( !info->workstations ) - return NULL; - - info->dial = - talloc_unistr2_to_ascii( mem_ctx, id21->uni_munged_dial ); - if ( !info->dial ) - return NULL; - - info->rid = id21->user_rid; - info->group_rid = id21->group_rid; - info->acb_mask = id21->acb_info; - info->bad_passwd_count = id21->bad_password_count; - info->logon_count = id21->logon_count; - - memcpy( info->nt_password, id21->nt_pwd, 8 ); - memcpy( info->lm_password, id21->lm_pwd, 8 ); - - info->logon_hours = - ( LOGON_HRS * ) TALLOC_MEMDUP( mem_ctx, &( id21->logon_hrs ), - sizeof( LOGON_HRS ) ); - if ( !info->logon_hours ) - return NULL; - - info->pass_must_change = ( id21->passmustchange ) ? True : False; - - return info; -} - -CacGroupInfo *cac_MakeGroupInfo( TALLOC_CTX * mem_ctx, GROUP_INFO_CTR * ctr ) -{ - CacGroupInfo *info = NULL; - - if ( !mem_ctx || !ctr || ctr->switch_value1 != 1 ) - return NULL; - - info = talloc( mem_ctx, CacGroupInfo ); - if ( !info ) - return NULL; - - info->name = - talloc_unistr2_to_ascii( mem_ctx, - ctr->group.info1.uni_acct_name ); - if ( !info->name ) - return NULL; - - info->description = - talloc_unistr2_to_ascii( mem_ctx, - ctr->group.info1.uni_acct_desc ); - if ( !info->description ) - return NULL; - - info->num_members = ctr->group.info1.num_members; - - return info; -} - -GROUP_INFO_CTR *cac_MakeGroupInfoCtr( TALLOC_CTX * mem_ctx, - CacGroupInfo * info ) -{ - GROUP_INFO_CTR *ctr = NULL; - - if ( !mem_ctx || !info ) - return NULL; - - ctr = talloc( mem_ctx, GROUP_INFO_CTR ); - if ( !ctr ) - return NULL; - - ctr->switch_value1 = 1; - - init_samr_group_info1( &( ctr->group.info1 ), info->name, - info->description, info->num_members ); - - return ctr; -} - -CacAliasInfo *cac_MakeAliasInfo( TALLOC_CTX * mem_ctx, ALIAS_INFO_CTR ctr ) -{ - CacGroupInfo *info = NULL; - - if ( !mem_ctx || ctr.level != 1 ) - return NULL; - - info = talloc( mem_ctx, CacAliasInfo ); - if ( !info ) - return NULL; - - info->name = - talloc_unistr2_to_ascii( mem_ctx, - *( ctr.alias.info1.name.string ) ); - if ( !info->name ) - return NULL; - - info->description = - talloc_unistr2_to_ascii( mem_ctx, - *( ctr.alias.info1.description. - string ) ); - if ( !info->name ) - return NULL; - - info->num_members = ctr.alias.info1.num_member; - - return info; -} - -ALIAS_INFO_CTR *cac_MakeAliasInfoCtr( TALLOC_CTX * mem_ctx, - CacAliasInfo * info ) -{ - ALIAS_INFO_CTR *ctr = NULL; - - if ( !mem_ctx || !info ) - return NULL; - - ctr = talloc( mem_ctx, ALIAS_INFO_CTR ); - if ( !ctr ) - return NULL; - - ctr->level = 1; - - init_samr_alias_info1( &( ctr->alias.info1 ), info->name, - info->num_members, info->description ); - - return ctr; -} - -CacDomainInfo *cac_MakeDomainInfo( TALLOC_CTX * mem_ctx, - SAM_UNK_INFO_1 * info1, - SAM_UNK_INFO_2 * info2, - SAM_UNK_INFO_12 * info12 ) -{ - CacDomainInfo *info = NULL; - - if ( !mem_ctx || !info1 || !info2 || !info12 ) - return NULL; - - info = talloc( mem_ctx, CacDomainInfo ); - if ( !info ) - return NULL; - - info->min_pass_length = info1->min_length_password; - info->pass_history = info1->password_history; - - cac_InitCacTime( &( info->expire ), info1->expire ); - cac_InitCacTime( &( info->min_pass_age ), info1->min_passwordage ); - - info->server_role = info2->server_role; - info->num_users = info2->num_domain_usrs; - info->num_domain_groups = info2->num_domain_grps; - info->num_local_groups = info2->num_local_grps; - - /*if these have been ZERO'd out we need to know. uni_str_len will be 0 */ - if ( info2->uni_comment.uni_str_len == 0 ) { - info->comment = talloc_strdup( mem_ctx, "\0" ); - } else { - info->comment = - talloc_unistr2_to_ascii( mem_ctx, - info2->uni_comment ); - } - - if ( info2->uni_domain.uni_str_len == 0 ) { - info->domain_name = talloc_strdup( mem_ctx, "\0" ); - } else { - info->domain_name = - talloc_unistr2_to_ascii( mem_ctx, info2->uni_domain ); - } - - if ( info2->uni_server.uni_str_len == 0 ) { - info->server_name = talloc_strdup( mem_ctx, "\0" ); - } else { - info->server_name = - talloc_unistr2_to_ascii( mem_ctx, info2->uni_server ); - } - - - cac_InitCacTime( &( info->lockout_duration ), info12->duration ); - cac_InitCacTime( &( info->lockout_reset ), info12->reset_count ); - info->num_bad_attempts = info12->bad_attempt_lockout; - - return info; -} - -char *cac_unistr_ascii( TALLOC_CTX * mem_ctx, UNISTR src ) -{ - char *buf; - uint32 len; - - if ( !mem_ctx || !src.buffer ) - return NULL; - - len = unistrlen( src.buffer ) + 1; - - buf = TALLOC_ZERO_ARRAY( mem_ctx, char, len ); - if ( !buf ) - return NULL; - - rpcstr_pull( buf, src.buffer, len, -1, STR_TERMINATE ); - - return buf; -} - -CacService *cac_MakeServiceArray( TALLOC_CTX * mem_ctx, - ENUM_SERVICES_STATUS * svc, - uint32 num_services ) -{ - int i; - CacService *services = NULL; - - if ( !mem_ctx || !svc ) - return NULL; - - if (num_services) { - services = TALLOC_ZERO_ARRAY( mem_ctx, CacService, num_services ); - if ( !services ) - return NULL; - } else { - services = NULL; - } - - for ( i = 0; i < num_services; i++ ) { - services[i].service_name = - cac_unistr_ascii( mem_ctx, svc[i].servicename ); - services[i].display_name = - cac_unistr_ascii( mem_ctx, svc[i].displayname ); - - if ( !services[i].service_name || !services[i].display_name ) - return NULL; - - services[i].status = svc[i].status; - } - - return services; -} - -int cac_InitCacServiceConfig( TALLOC_CTX * mem_ctx, SERVICE_CONFIG * src, - CacServiceConfig * dest ) -{ - if ( !src || !dest ) - return CAC_FAILURE; - - dest->exe_path = - talloc_unistr2_to_ascii( mem_ctx, *src->executablepath ); - if ( !dest->exe_path ) - return CAC_FAILURE; - - dest->load_order_group = - talloc_unistr2_to_ascii( mem_ctx, *src->loadordergroup ); - if ( !dest->load_order_group ) - return CAC_FAILURE; - - dest->dependencies = - talloc_unistr2_to_ascii( mem_ctx, *src->dependencies ); - if ( !dest->dependencies ) - return CAC_FAILURE; - - dest->start_name = - talloc_unistr2_to_ascii( mem_ctx, *src->startname ); - if ( !dest->start_name ) - return CAC_FAILURE; - - dest->display_name = - talloc_unistr2_to_ascii( mem_ctx, *src->displayname ); - if ( !dest->display_name ) - return CAC_FAILURE; - - dest->type = src->service_type; - dest->start_type = src->start_type; - dest->error_control = src->error_control; - dest->tag_id = src->tag_id; - - return CAC_SUCCESS; -} |