Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

442 lines
10 KiB

  1. //+-----------------------------------------------------------------------
  2. //
  3. // File: SECDATA.hxx
  4. //
  5. // Contents: Structures for KDC global data mgmt
  6. //
  7. //
  8. // History:
  9. //
  10. //------------------------------------------------------------------------
  11. #ifndef INC__SECDATA_HXX
  12. #define INC__SECDATA_HXX
  13. // A bunch of include files that this file depends on...
  14. extern "C" {
  15. #include <nturtl.h>
  16. }
  17. #include "kdcsvr.hxx"
  18. //+---------------------------------------------------------------------------
  19. ///////////////////////////////////////////////////////////////
  20. //
  21. //
  22. // Constants and #define macros
  23. //
  24. //
  25. // Class: CSecurityData ()
  26. //
  27. // Purpose: Global data for KDC.
  28. //
  29. // Interface:
  30. // CSecurityData -- Constructor (need to call Init(), too)
  31. // ~CSecurityData -- Frees the strings.
  32. // Init -- Initializes the data.
  33. // NextJob -- Gets a job from the job queue.
  34. // AddJob -- Adds a job to the job queue.
  35. // GetJobEvent -- Gets a handle to an event that is
  36. // set when there's a job in the queue.
  37. // KdcRealm -- return the current realm.
  38. // KdcServiceName -- return "krbtgt"
  39. // KdcFullServiceName -- return "realm\krbtgt"
  40. // MachineName -- return machine name
  41. // KdcTgtTicketLifespan --
  42. // KdcTgsTicketLifespan --
  43. // KdcTicketRenewSpan --
  44. // KdcFlags --
  45. // DebugShowState --
  46. // DebugSetState --
  47. // DebugGetState --
  48. //
  49. // History: 4-02-93 WadeR Created
  50. //
  51. // Notes:
  52. //
  53. //----------------------------------------------------------------------------
  54. class CSecurityData {
  55. private:
  56. //
  57. // Private data
  58. //
  59. // Site constants
  60. KERB_REALM _KerbRealmName;
  61. KERB_REALM _KerbDnsRealmName;
  62. UNICODE_STRING _RealmName;
  63. UNICODE_STRING _DnsRealmName;
  64. UNICODE_STRING _KDC_Name;
  65. UNICODE_STRING _KDC_FullName;
  66. UNICODE_STRING _KDC_FullDnsName;
  67. UNICODE_STRING _KDC_FullKdcName;
  68. UNICODE_STRING _MachineName;
  69. UNICODE_STRING _SamMachineName; // got a $
  70. UNICODE_STRING _MachineUpn;
  71. UNICODE_STRING _ForestRoot;
  72. PKERB_INTERNAL_NAME _KrbtgtServiceName;
  73. PKERB_INTERNAL_NAME _KpasswdServiceName;
  74. LARGE_INTEGER _KDC_TgsTicketLifespan;
  75. LARGE_INTEGER _KDC_TgtTicketLifespan;
  76. LARGE_INTEGER _KDC_TicketRenewSpan;
  77. LARGE_INTEGER _KDC_DomainPasswordReplSkew;
  78. LARGE_INTEGER _KDC_RestrictionLifetime; // how long after a ticket is issued do we need to start checking restrictions again
  79. DWORD _KDC_Flags;
  80. ULONG _KDC_AuditEvents;
  81. KDC_TICKET_INFO _KrbtgtTicketInfo;
  82. BOOLEAN _KrbtgtTicketInfoValid;
  83. BOOLEAN _KDC_CrossForestEnabled;
  84. BOOLEAN _KDC_IsForestRoot;
  85. LARGE_INTEGER _KrbtgtPasswordLastSet;
  86. // Locks
  87. RTL_RESOURCE _Monitor;
  88. BOOLEAN _fMonitorInitialized;
  89. //
  90. // Private functions
  91. //
  92. public:
  93. //
  94. // Public functions
  95. //
  96. CSecurityData();
  97. ~CSecurityData(void);
  98. VOID Cleanup();
  99. NTSTATUS InitLock();
  100. NTSTATUS Init();
  101. NTSTATUS LoadParameters(SAM_HANDLE Domain);
  102. NTSTATUS ReloadPolicy(POLICY_NOTIFICATION_INFORMATION_CLASS Class);
  103. KERBERR GetKrbtgtTicketInfo(PKDC_TICKET_INFO TicketInfo);
  104. NTSTATUS UpdateKrbtgtTicketInfo();
  105. NTSTATUS SetForestRoot(PUNICODE_STRING NewForestRoot);
  106. // Site (domain) constants
  107. inline PUNICODE_STRING KdcRealmName();
  108. inline PUNICODE_STRING KdcDnsRealmName();
  109. inline KERB_REALM KdcKerbDnsRealmName();
  110. inline PUNICODE_STRING KdcServiceName();
  111. inline PUNICODE_STRING KdcFullServiceName();
  112. inline PUNICODE_STRING KdcFullServiceDnsName();
  113. inline PUNICODE_STRING KdcFullServiceKdcName();
  114. inline PUNICODE_STRING MachineName();
  115. inline PUNICODE_STRING MachineUpn();
  116. inline NTSTATUS GetKdcForestRoot(PUNICODE_STRING Temp);
  117. inline PKERB_INTERNAL_NAME KdcInternalName();
  118. inline PKERB_INTERNAL_NAME KpasswdInternalName();
  119. inline LARGE_INTEGER KdcTgtTicketLifespan();
  120. inline LARGE_INTEGER KdcTgsTicketLifespan();
  121. inline LARGE_INTEGER KdcTicketRenewSpan();
  122. inline LARGE_INTEGER KdcDomainPasswordReplSkew();
  123. inline LARGE_INTEGER KdcRestrictionLifetime();
  124. inline DWORD KdcFlags();
  125. inline VOID SetCrossForestEnabled(BOOLEAN NewState);
  126. inline VOID ReadLock();
  127. inline VOID WriteLock();
  128. inline VOID Unlock();
  129. #if DBG
  130. inline BOOL IsLocked();
  131. #endif
  132. inline BOOL AuditKdcEvent( ULONG EventToAudit );
  133. inline BOOLEAN IsCrossForestEnabled();
  134. inline BOOLEAN IsForestRoot( );
  135. inline BOOLEAN IsOurMachineName(PUNICODE_STRING Name);
  136. inline BOOLEAN IsOurRealm(PUNICODE_STRING Realm);
  137. inline BOOLEAN IsOurRealm(PKERB_REALM Realm);
  138. inline LARGE_INTEGER KrbtgtPasswordLastSet();
  139. #if DBG
  140. void DebugShowState(void);
  141. HRESULT DebugSetState(DWORD, LARGE_INTEGER, LARGE_INTEGER );
  142. HRESULT DebugGetState(DWORD *, LARGE_INTEGER *, LARGE_INTEGER * );
  143. #endif
  144. };
  145. //
  146. // Inline functions
  147. //
  148. inline PUNICODE_STRING
  149. CSecurityData::KdcServiceName()
  150. {
  151. return( &_KDC_Name);
  152. };
  153. inline PUNICODE_STRING
  154. CSecurityData::KdcFullServiceName()
  155. {
  156. return( &_KDC_FullName);
  157. };
  158. inline PUNICODE_STRING
  159. CSecurityData::KdcFullServiceDnsName()
  160. {
  161. return( &_KDC_FullDnsName);
  162. };
  163. inline NTSTATUS
  164. CSecurityData::GetKdcForestRoot(PUNICODE_STRING Output)
  165. {
  166. NTSTATUS Status = STATUS_POLICY_OBJECT_NOT_FOUND;
  167. ReadLock();
  168. if (_ForestRoot.Buffer != NULL)
  169. {
  170. Status = KerbDuplicateString(
  171. Output,
  172. &_ForestRoot
  173. );
  174. }
  175. Unlock();
  176. return ( Status );
  177. };
  178. inline BOOLEAN
  179. CSecurityData::IsCrossForestEnabled()
  180. {
  181. return( _KDC_CrossForestEnabled);
  182. };
  183. inline BOOLEAN
  184. CSecurityData::IsForestRoot()
  185. {
  186. return( _KDC_IsForestRoot);
  187. };
  188. inline VOID
  189. CSecurityData::SetCrossForestEnabled(BOOLEAN NewState)
  190. {
  191. WriteLock();
  192. _KDC_CrossForestEnabled = NewState;
  193. Unlock();
  194. }
  195. inline PUNICODE_STRING
  196. CSecurityData::KdcFullServiceKdcName()
  197. {
  198. return( &_KDC_FullKdcName);
  199. };
  200. inline PUNICODE_STRING
  201. CSecurityData::KdcRealmName()
  202. {
  203. return( &_RealmName );
  204. }
  205. inline PUNICODE_STRING
  206. CSecurityData::KdcDnsRealmName()
  207. {
  208. return( &_DnsRealmName );
  209. }
  210. inline KERB_REALM
  211. CSecurityData::KdcKerbDnsRealmName()
  212. {
  213. return( _KerbDnsRealmName );
  214. }
  215. inline PKERB_INTERNAL_NAME
  216. CSecurityData::KdcInternalName()
  217. {
  218. return( _KrbtgtServiceName );
  219. }
  220. inline PKERB_INTERNAL_NAME
  221. CSecurityData::KpasswdInternalName()
  222. {
  223. return( _KpasswdServiceName );
  224. }
  225. inline BOOLEAN
  226. CSecurityData::IsOurMachineName(
  227. IN PUNICODE_STRING Name
  228. )
  229. {
  230. return (RtlEqualUnicodeString(Name, &_MachineName, TRUE) ||
  231. RtlEqualUnicodeString(Name, &_SamMachineName, TRUE));
  232. }
  233. inline BOOLEAN
  234. CSecurityData::IsOurRealm(
  235. IN PKERB_REALM Realm
  236. )
  237. {
  238. return(KerbCompareRealmNames(
  239. Realm,
  240. &_KerbDnsRealmName
  241. ) ||
  242. KerbCompareRealmNames(
  243. Realm,
  244. &_KerbRealmName));
  245. }
  246. inline BOOLEAN
  247. CSecurityData::IsOurRealm(
  248. IN PUNICODE_STRING Realm
  249. )
  250. {
  251. return(KerbCompareUnicodeRealmNames(
  252. Realm,
  253. &_DnsRealmName
  254. ) ||
  255. KerbCompareUnicodeRealmNames(
  256. Realm,
  257. &_RealmName
  258. ));
  259. }
  260. inline PUNICODE_STRING
  261. CSecurityData::MachineName()
  262. {
  263. return( &_MachineName);
  264. };
  265. inline PUNICODE_STRING
  266. CSecurityData::MachineUpn()
  267. {
  268. return( &_MachineUpn);
  269. };
  270. inline LARGE_INTEGER
  271. CSecurityData::KdcTgtTicketLifespan()
  272. {
  273. LARGE_INTEGER Temp;
  274. ReadLock();
  275. Temp = _KDC_TgtTicketLifespan;
  276. Unlock();
  277. return(Temp);
  278. };
  279. inline LARGE_INTEGER
  280. CSecurityData::KdcTgsTicketLifespan()
  281. {
  282. LARGE_INTEGER Temp;
  283. ReadLock();
  284. Temp = _KDC_TgsTicketLifespan;
  285. Unlock();
  286. return(Temp);
  287. };
  288. inline LARGE_INTEGER
  289. CSecurityData::KdcTicketRenewSpan()
  290. {
  291. LARGE_INTEGER Temp;
  292. ReadLock();
  293. Temp = _KDC_TicketRenewSpan;
  294. Unlock();
  295. return( Temp );
  296. };
  297. inline LARGE_INTEGER
  298. CSecurityData::KdcDomainPasswordReplSkew()
  299. {
  300. LARGE_INTEGER Temp;
  301. ReadLock();
  302. Temp = _KDC_DomainPasswordReplSkew;
  303. Unlock();
  304. return( Temp );
  305. };
  306. inline LARGE_INTEGER
  307. CSecurityData::KdcRestrictionLifetime()
  308. {
  309. LARGE_INTEGER Temp;
  310. ReadLock();
  311. Temp = _KDC_RestrictionLifetime;
  312. Unlock();
  313. return( Temp );
  314. };
  315. inline DWORD
  316. CSecurityData::KdcFlags()
  317. {
  318. ULONG Temp;
  319. ReadLock();
  320. Temp = _KDC_Flags;
  321. Unlock();
  322. return( Temp );
  323. };
  324. inline BOOL
  325. CSecurityData::AuditKdcEvent(
  326. IN ULONG AuditEvent
  327. )
  328. {
  329. return( ( (_KDC_AuditEvents & AuditEvent) != 0) ? TRUE : FALSE);
  330. };
  331. inline VOID
  332. CSecurityData::ReadLock()
  333. {
  334. RtlAcquireResourceShared(&_Monitor, TRUE);
  335. }
  336. inline VOID
  337. CSecurityData::WriteLock()
  338. {
  339. RtlAcquireResourceExclusive(&_Monitor, TRUE);
  340. }
  341. inline VOID
  342. CSecurityData::Unlock()
  343. {
  344. RtlReleaseResource(&_Monitor);
  345. }
  346. #if DBG
  347. BOOL
  348. CSecurityData::IsLocked()
  349. {
  350. BOOLEAN IsLocked;
  351. RtlEnterCriticalSection( &_Monitor.CriticalSection );
  352. IsLocked = ( _Monitor.NumberOfActive != 0);
  353. RtlLeaveCriticalSection( &_Monitor.CriticalSection );
  354. return IsLocked;
  355. }
  356. #endif
  357. inline LARGE_INTEGER
  358. CSecurityData::KrbtgtPasswordLastSet()
  359. {
  360. LARGE_INTEGER Temp = {0};
  361. ReadLock();
  362. if (_KrbtgtTicketInfoValid)
  363. {
  364. Temp = _KrbtgtPasswordLastSet;
  365. }
  366. Unlock();
  367. return( Temp );
  368. }
  369. #endif // INC__SECDATA_HXX