/vmdir/server/kdckrb5/principal.c

https://github.com/vmware/lightwave · C · 366 lines · 290 code · 52 blank · 24 comment · 42 complexity · 938a12f6cde461218460f8028a708c8f MD5 · raw file

  1. /*
  2. * Copyright © 2012-2015 VMware, Inc. All Rights Reserved.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the “License”); you may not
  5. * use this file except in compliance with the License. You may obtain a copy
  6. * of the License at http://www.apache.org/licenses/LICENSE-2.0
  7. *
  8. * Unless required by applicable law or agreed to in writing, software
  9. * distributed under the License is distributed on an “AS IS” BASIS, without
  10. * warranties or conditions of any kind, EITHER EXPRESS OR IMPLIED. See the
  11. * License for the specific language governing permissions and limitations
  12. * under the License.
  13. */
  14. #include "includes.h"
  15. VOID
  16. VmKdcFreePrincipal(
  17. PVMKDC_PRINCIPAL pPrincipal)
  18. {
  19. DWORD i = 0;
  20. if (pPrincipal)
  21. {
  22. if (pPrincipal->components) {
  23. for (i=0; i<(int) pPrincipal->numComponents; i++) {
  24. VMKDC_SAFE_FREE_DATA(pPrincipal->components[i]);
  25. }
  26. VMKDC_SAFE_FREE_MEMORY(pPrincipal->components);
  27. }
  28. VMKDC_SAFE_FREE_DATA(pPrincipal->realm);
  29. VMKDC_SAFE_FREE_MEMORY(pPrincipal->name);
  30. VMKDC_SAFE_FREE_MEMORY(pPrincipal);
  31. }
  32. }
  33. DWORD
  34. VmKdcAllocatePrincipal(
  35. PVMKDC_PRINCIPAL *ppRetPrincipal)
  36. {
  37. PVMKDC_PRINCIPAL pPrincipal = NULL;
  38. DWORD dwError = 0;
  39. dwError = VmKdcAllocateMemory(sizeof(VMKDC_PRINCIPAL), (PVOID*)&pPrincipal);
  40. BAIL_ON_VMKDC_ERROR(dwError);
  41. error:
  42. if (dwError)
  43. {
  44. VMKDC_SAFE_FREE_PRINCIPAL(pPrincipal);
  45. }
  46. *ppRetPrincipal = pPrincipal;
  47. return dwError;
  48. }
  49. DWORD
  50. VmKdcMakePrincipal(
  51. PCSTR realmName,
  52. DWORD numComponents,
  53. PCSTR *components,
  54. VMKDC_NAME_TYPE eNameType,
  55. PVMKDC_PRINCIPAL *ppRetPrincipal)
  56. {
  57. PVMKDC_PRINCIPAL pPrincipal = NULL;
  58. DWORD dwError = 0;
  59. DWORD i = 0;
  60. dwError = VmKdcAllocatePrincipal(&pPrincipal);
  61. BAIL_ON_VMKDC_ERROR(dwError);
  62. pPrincipal->type = eNameType;
  63. dwError = VmKdcAllocateDataString(realmName, &pPrincipal->realm);
  64. BAIL_ON_VMKDC_ERROR(dwError);
  65. pPrincipal->numComponents = numComponents;
  66. dwError = VmKdcAllocateMemory(sizeof(VMKDC_DATA *) * numComponents,
  67. (PVOID*)&pPrincipal->components);
  68. BAIL_ON_VMKDC_ERROR(dwError);
  69. for (i=0; i<numComponents; i++) {
  70. dwError = VmKdcAllocateDataString(components[i], &pPrincipal->components[i]);
  71. BAIL_ON_VMKDC_ERROR(dwError);
  72. }
  73. error:
  74. if (dwError)
  75. {
  76. VMKDC_SAFE_FREE_PRINCIPAL(pPrincipal);
  77. }
  78. *ppRetPrincipal = pPrincipal;
  79. return dwError;
  80. }
  81. DWORD
  82. VmKdcParsePrincipalName(
  83. PVMKDC_CONTEXT pContext,
  84. PCSTR pPrincipalName,
  85. PVMKDC_PRINCIPAL *ppRetPrincipal)
  86. {
  87. DWORD dwError = 0;
  88. PVMKDC_PRINCIPAL pPrincipal = NULL;
  89. PVMKDC_DATA pRealm = NULL;
  90. PSTR p = NULL;
  91. PSTR q = NULL;
  92. PSTR pNewPrincipalName = NULL;
  93. int count = 0;
  94. size_t dwLen = 0;
  95. BOOLEAN bAtFound = FALSE;
  96. CHAR cSave = '\0';
  97. PCSTR pszRealm = NULL;
  98. if (pPrincipalName == NULL ||
  99. *pPrincipalName == '/' ||
  100. *pPrincipalName == '@' ||
  101. *pPrincipalName == '\0')
  102. {
  103. dwError = ERROR_INVALID_PARAMETER;
  104. BAIL_ON_VMKDC_ERROR(dwError);
  105. }
  106. dwLen = strlen(pPrincipalName) + 1;
  107. dwError = VmKdcAllocateMemory(sizeof(CHAR) + dwLen, (PVOID*)&pNewPrincipalName);
  108. BAIL_ON_VMKDC_ERROR(dwError);
  109. memcpy(pNewPrincipalName, pPrincipalName, dwLen);
  110. pNewPrincipalName[dwLen] = '\0';
  111. dwError = VmKdcAllocateMemory(sizeof(VMKDC_PRINCIPAL), (PVOID*)&pPrincipal);
  112. BAIL_ON_VMKDC_ERROR(dwError);
  113. /* count the number of name components */
  114. p = (PSTR) pNewPrincipalName;
  115. do
  116. {
  117. p++;
  118. if (*p == '/' || *p == '@' || *p == '\0')
  119. {
  120. count++;
  121. }
  122. }
  123. while (*p && *p != '@');
  124. /* allocate an array for the name components */
  125. dwError = VmKdcAllocateMemory(
  126. sizeof(VMKDC_DATA *) * count,
  127. (PVOID*)&pPrincipal->components);
  128. BAIL_ON_VMKDC_ERROR(dwError);
  129. /* allocate and copy the name components */
  130. count = 0;
  131. p = (PSTR) pNewPrincipalName;
  132. q = p;
  133. do
  134. {
  135. p++;
  136. if (*p == '/' || *p == '@' || *p == '\0')
  137. {
  138. dwLen = p - q;
  139. cSave = q[dwLen];
  140. q[dwLen] = '\0';
  141. dwError = VmKdcAllocateDataString(
  142. q,
  143. &pPrincipal->components[count]);
  144. q[dwLen] = cSave;
  145. BAIL_ON_VMKDC_ERROR(dwError);
  146. count++;
  147. if (*p == '@')
  148. {
  149. bAtFound = TRUE;
  150. break;
  151. }
  152. q = p + 1;
  153. }
  154. }
  155. while (*p && *p != '@');
  156. if (bAtFound)
  157. {
  158. /* allocate and copy the realm */
  159. dwError = VmKdcAllocateDataString(
  160. p+1,
  161. &pRealm);
  162. BAIL_ON_VMKDC_ERROR(dwError);
  163. }
  164. else
  165. {
  166. /* get the default realm */
  167. pszRealm = pContext->pGlobals->pszDefaultRealm;
  168. BAIL_ON_VMKDC_INVALID_POINTER(pszRealm, dwError);
  169. dwError = VmKdcAllocateDataString(
  170. pszRealm,
  171. &pRealm);
  172. BAIL_ON_VMKDC_ERROR(dwError);
  173. }
  174. pPrincipal->type = VMKDC_NT_PRINCIPAL;
  175. pPrincipal->name = pNewPrincipalName;
  176. pPrincipal->realm = pRealm;
  177. pPrincipal->numComponents = count;
  178. error:
  179. if (dwError)
  180. {
  181. VMKDC_SAFE_FREE_PRINCIPAL(pPrincipal);
  182. }
  183. *ppRetPrincipal = pPrincipal;
  184. return dwError;
  185. }
  186. DWORD
  187. VmKdcUnparsePrincipalName(
  188. PVMKDC_PRINCIPAL pPrincipal,
  189. PSTR *ppRetPrincipalName)
  190. {
  191. DWORD dwError = 0;
  192. PSTR principalName = NULL;
  193. PVMKDC_DATA data = NULL;
  194. DWORD allocLen = 0;
  195. DWORD index = 0;
  196. DWORD i = 0;
  197. PSTR ptr;
  198. DWORD len;
  199. BAIL_ON_VMKDC_INVALID_POINTER(pPrincipal, dwError);
  200. for (i=0; i<pPrincipal->numComponents; i++)
  201. {
  202. allocLen += VMKDC_GET_LEN_DATA(pPrincipal->components[i]) + 1;
  203. }
  204. allocLen += VMKDC_GET_LEN_DATA(pPrincipal->realm) + 1;
  205. dwError = VmKdcAllocateMemory(allocLen, (PVOID*)&principalName);
  206. BAIL_ON_VMKDC_ERROR(dwError);
  207. for (i=0; i<pPrincipal->numComponents; i++)
  208. {
  209. if (i > 0)
  210. {
  211. principalName[index++] = '/';
  212. }
  213. data = pPrincipal->components[i];
  214. ptr = VMKDC_GET_PTR_DATA(data);
  215. len = VMKDC_GET_LEN_DATA(data);
  216. strncpy(&principalName[index], ptr, len);
  217. #if 0
  218. /*
  219. * On Win32, calls strncpy_s(), which doesn't work as expected
  220. */
  221. dwError = VmKdcStringNCpyA(&principalName[index], len, ptr, len);
  222. BAIL_ON_VMKDC_ERROR(dwError);
  223. #endif
  224. index += len;
  225. }
  226. principalName[index++] = '@';
  227. data = pPrincipal->realm;
  228. ptr = VMKDC_GET_PTR_DATA(data);
  229. len = VMKDC_GET_LEN_DATA(data);
  230. strncpy(&principalName[index], ptr, len);
  231. for (i=index; principalName[i]; i++)
  232. {
  233. VMDIR_ASCII_LOWER_TO_UPPER(principalName[i]);
  234. }
  235. #if 0
  236. /*
  237. * On Win32, calls strncpy_s(), which doesn't work as expected
  238. */
  239. dwError = VmKdcStringNCpyA(&principalName[index], len, ptr, len);
  240. BAIL_ON_VMKDC_ERROR(dwError);
  241. #endif
  242. error:
  243. if (dwError)
  244. {
  245. VMKDC_SAFE_FREE_MEMORY(principalName);
  246. }
  247. *ppRetPrincipalName = principalName;
  248. return dwError;
  249. }
  250. DWORD
  251. VmKdcGetPrincipalName(
  252. PVMKDC_PRINCIPAL pPrincipal,
  253. PSTR *ppRetPrincipalName)
  254. {
  255. DWORD dwError = 0;
  256. BAIL_ON_VMKDC_INVALID_POINTER(pPrincipal, dwError);
  257. if (!pPrincipal->name)
  258. {
  259. dwError = VmKdcUnparsePrincipalName(pPrincipal, &pPrincipal->name);
  260. BAIL_ON_VMKDC_ERROR(dwError);
  261. }
  262. error:
  263. *ppRetPrincipalName = pPrincipal->name;
  264. return dwError;
  265. }
  266. DWORD
  267. VmKdcCopyPrincipal(
  268. PVMKDC_PRINCIPAL pPrincipal,
  269. PVMKDC_PRINCIPAL *ppRetPrincipal)
  270. {
  271. PVMKDC_PRINCIPAL pNewPrincipal = NULL;
  272. DWORD dwError = 0;
  273. DWORD i = 0;
  274. dwError = VmKdcAllocatePrincipal(&pNewPrincipal);
  275. BAIL_ON_VMKDC_ERROR(dwError);
  276. pNewPrincipal->type = pPrincipal->type;
  277. pNewPrincipal->numComponents = pPrincipal->numComponents;
  278. dwError = VmKdcAllocateData(VMKDC_GET_PTR_DATA(pPrincipal->realm),
  279. VMKDC_GET_LEN_DATA(pPrincipal->realm),
  280. &pNewPrincipal->realm);
  281. BAIL_ON_VMKDC_ERROR(dwError);
  282. dwError = VmKdcAllocateMemory(sizeof(VMKDC_DATA *) * pNewPrincipal->numComponents,
  283. (PVOID*)&pNewPrincipal->components);
  284. BAIL_ON_VMKDC_ERROR(dwError);
  285. for (i=0; i<pNewPrincipal->numComponents; i++) {
  286. dwError = VmKdcAllocateData(VMKDC_GET_PTR_DATA(pPrincipal->components[i]),
  287. VMKDC_GET_LEN_DATA(pPrincipal->components[i]),
  288. &pNewPrincipal->components[i]);
  289. BAIL_ON_VMKDC_ERROR(dwError);
  290. }
  291. error:
  292. if (dwError) {
  293. VMKDC_SAFE_FREE_PRINCIPAL(pNewPrincipal);
  294. }
  295. *ppRetPrincipal = pNewPrincipal;
  296. return dwError;
  297. }
  298. VOID
  299. VmKdcPrintPrincipal(
  300. PVMKDC_PRINCIPAL pPrincipal)
  301. {
  302. DWORD dwError = 0;
  303. DWORD i = 0;
  304. BAIL_ON_VMKDC_INVALID_POINTER(pPrincipal, dwError);
  305. VMDIR_LOG_VERBOSE(VMDIR_LOG_MASK_ALL, "VmKdcPrintPrincipal: type <%d>",
  306. pPrincipal->name);
  307. for (i=0; i<pPrincipal->numComponents; i++)
  308. {
  309. VMDIR_LOG_VERBOSE(VMDIR_LOG_MASK_ALL, "VmKdcPrintPrincipal: name[%d] <%s>",
  310. i, VMKDC_GET_PTR_DATA(pPrincipal->components[i]));
  311. }
  312. error:
  313. return;
  314. }