ddraw/tests: Rewrite LimitTest().
[wine.git] / dlls / wbemprox / security.c
blobd3057e01f5562ee9f206a7d5cc9c5bd0c1b2aefe
1 /*
2 * __SystemSecurity implementation
4 * Copyright 2014 Vincent Povirk for CodeWeavers
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 #define COBJMACROS
23 #include "config.h"
24 #include <stdarg.h>
26 #include "windef.h"
27 #include "winbase.h"
28 #include "wbemcli.h"
29 #include "iads.h"
31 #include "wine/debug.h"
32 #include "wbemprox_private.h"
34 WINE_DEFAULT_DEBUG_CHANNEL(wbemprox);
36 static HRESULT to_byte_array( void *data, DWORD size, VARIANT *var )
38 SAFEARRAY *sa;
39 void *sadata;
40 HRESULT hr;
42 if (!(sa = SafeArrayCreateVector( VT_UI1, 0, size ))) return E_OUTOFMEMORY;
44 hr = SafeArrayAccessData( sa, &sadata );
46 if (SUCCEEDED(hr))
48 memcpy( sadata, data, size );
50 SafeArrayUnaccessData( sa );
52 else
54 SafeArrayDestroy( sa );
55 return hr;
58 set_variant( VT_UI1|VT_ARRAY, 0, sa, var );
59 return S_OK;
62 static HRESULT get_sd( SECURITY_DESCRIPTOR **sd, DWORD *size )
64 BYTE sid_admin_buffer[SECURITY_MAX_SID_SIZE];
65 SID *sid_admin = (SID*)sid_admin_buffer;
66 BYTE sid_network_buffer[SECURITY_MAX_SID_SIZE];
67 SID *sid_network = (SID*)sid_network_buffer;
68 BYTE sid_local_buffer[SECURITY_MAX_SID_SIZE];
69 SID *sid_local = (SID*)sid_local_buffer;
70 BYTE sid_users_buffer[SECURITY_MAX_SID_SIZE];
71 SID *sid_users = (SID*)sid_users_buffer;
72 BYTE acl_buffer[sizeof(ACL) + 4 * (sizeof(ACCESS_ALLOWED_ACE) - sizeof(DWORD) + SECURITY_MAX_SID_SIZE)];
73 ACL *acl = (ACL*)acl_buffer;
74 DWORD sid_size;
75 SECURITY_DESCRIPTOR absolute_sd;
76 HRESULT hr = S_OK;
78 sid_size = sizeof(sid_admin_buffer);
79 CreateWellKnownSid( WinBuiltinAdministratorsSid, NULL, sid_admin, &sid_size );
81 sid_size = sizeof(sid_network_buffer);
82 CreateWellKnownSid( WinNetworkServiceSid, NULL, sid_network, &sid_size );
84 sid_size = sizeof(sid_local_buffer);
85 CreateWellKnownSid( WinLocalServiceSid, NULL, sid_local, &sid_size );
87 sid_size = sizeof(sid_users_buffer);
88 CreateWellKnownSid( WinAuthenticatedUserSid, NULL, sid_users, &sid_size );
90 InitializeAcl( acl, sizeof(acl_buffer), ACL_REVISION );
92 AddAccessAllowedAceEx( acl, ACL_REVISION, CONTAINER_INHERIT_ACE|INHERITED_ACE,
93 ADS_RIGHT_DS_CREATE_CHILD|ADS_RIGHT_DS_DELETE_CHILD|ADS_RIGHT_ACTRL_DS_LIST|ADS_RIGHT_DS_SELF|
94 ADS_RIGHT_DS_READ_PROP|ADS_RIGHT_DS_WRITE_PROP|READ_CONTROL|WRITE_DAC,
95 sid_admin );
97 AddAccessAllowedAceEx( acl, ACL_REVISION, CONTAINER_INHERIT_ACE|INHERITED_ACE,
98 ADS_RIGHT_DS_CREATE_CHILD|ADS_RIGHT_DS_DELETE_CHILD|ADS_RIGHT_DS_READ_PROP,
99 sid_network );
101 AddAccessAllowedAceEx( acl, ACL_REVISION, CONTAINER_INHERIT_ACE|INHERITED_ACE,
102 ADS_RIGHT_DS_CREATE_CHILD|ADS_RIGHT_DS_DELETE_CHILD|ADS_RIGHT_DS_READ_PROP,
103 sid_local );
105 AddAccessAllowedAceEx( acl, ACL_REVISION, CONTAINER_INHERIT_ACE|INHERITED_ACE,
106 ADS_RIGHT_DS_CREATE_CHILD|ADS_RIGHT_DS_DELETE_CHILD|ADS_RIGHT_DS_READ_PROP,
107 sid_users );
109 InitializeSecurityDescriptor( &absolute_sd, SECURITY_DESCRIPTOR_REVISION );
111 SetSecurityDescriptorOwner( &absolute_sd, sid_admin, TRUE );
112 SetSecurityDescriptorGroup( &absolute_sd, sid_admin, TRUE );
113 SetSecurityDescriptorDacl( &absolute_sd, TRUE, acl, TRUE );
115 *size = GetSecurityDescriptorLength( &absolute_sd );
117 *sd = HeapAlloc( GetProcessHeap(), 0, *size );
118 if (!*sd)
119 hr = E_OUTOFMEMORY;
121 if (SUCCEEDED(hr))
123 if (!MakeSelfRelativeSD(&absolute_sd, *sd, size)) {
124 HeapFree( GetProcessHeap(), 0, *sd );
125 *sd = NULL;
126 hr = E_FAIL;
130 return hr;
133 HRESULT security_get_sd( IWbemClassObject *obj, IWbemClassObject *in, IWbemClassObject **out )
135 VARIANT var_sd, retval;
136 IWbemClassObject *sig, *out_params = NULL;
137 HRESULT hr, ret;
138 SECURITY_DESCRIPTOR *sd;
139 DWORD sd_size;
141 TRACE("%p, %p\n", in, out);
143 hr = create_signature( class_systemsecurityW, method_getsdW, PARAM_OUT, &sig );
145 if (SUCCEEDED(hr))
147 hr = IWbemClassObject_SpawnInstance( sig, 0, &out_params );
149 IWbemClassObject_Release( sig );
152 if (SUCCEEDED(hr))
154 ret = get_sd( &sd, &sd_size );
156 if (SUCCEEDED(ret))
158 VariantInit( &var_sd );
160 hr = to_byte_array( sd, sd_size, &var_sd );
162 if (SUCCEEDED(hr))
163 hr = IWbemClassObject_Put( out_params, param_sdW, 0, &var_sd, CIM_UINT8|CIM_FLAG_ARRAY );
165 HeapFree( GetProcessHeap(), 0, sd );
166 VariantClear( &var_sd );
169 if (SUCCEEDED(hr))
171 set_variant( VT_UI4, ret, NULL, &retval );
172 hr = IWbemClassObject_Put( out_params, param_returnvalueW, 0, &retval, CIM_UINT32 );
175 if (SUCCEEDED(hr) && out)
177 *out = out_params;
178 IWbemClassObject_AddRef( out_params );
181 IWbemClassObject_Release( out_params );
184 return hr;
188 HRESULT security_set_sd( IWbemClassObject *obj, IWbemClassObject *in, IWbemClassObject **out )
190 VARIANT retval;
191 IWbemClassObject *sig, *out_params = NULL;
192 HRESULT hr;
194 FIXME("stub\n");
196 hr = create_signature( class_systemsecurityW, method_setsdW, PARAM_OUT, &sig );
198 if (SUCCEEDED(hr))
200 hr = IWbemClassObject_SpawnInstance( sig, 0, &out_params );
202 IWbemClassObject_Release( sig );
205 if (SUCCEEDED(hr))
207 set_variant( VT_UI4, S_OK, NULL, &retval );
208 hr = IWbemClassObject_Put( out_params, param_returnvalueW, 0, &retval, CIM_UINT32 );
210 if (SUCCEEDED(hr) && out)
212 *out = out_params;
213 IWbemClassObject_AddRef( out_params );
216 IWbemClassObject_Release( out_params );
219 return hr;