LINUX: afs_create infinite fetchStatus loop
[pkg-k5-afs_openafs.git] / src / WINNT / afsclass / c_usr.cpp
blobc009371bed21820d8d5f825b5b83b786d73635cd
1 /*
2 * Copyright 2000, International Business Machines Corporation and others.
3 * All Rights Reserved.
5 * This software has been released under the terms of the IBM Public
6 * License. For details, see the LICENSE file in the top-level source
7 * directory or online at http://www.openafs.org/dl/license10.html
8 */
10 #include <winsock2.h>
11 #include <ws2tcpip.h>
13 extern "C" {
14 #include <afsconfig.h>
15 #include <afs/param.h>
16 #include <roken.h>
19 #include <WINNT/afsclass.h>
20 #include "internal.h"
24 * DEFINITIONS ________________________________________________________________
28 #define USERACCESS_TO_ACCOUNTACCESS(_ua) ( ((_ua) == PTS_USER_OWNER_ACCESS) ? aaOWNER_ONLY : aaANYONE )
32 * ROUTINES ___________________________________________________________________
36 USER::USER (LPCELL lpCellParent, LPTSTR pszPrincipal, LPTSTR pszInstance)
38 m_lpiCell = lpCellParent->GetIdentifier();
39 lstrcpy (m_szPrincipal, pszPrincipal);
40 lstrcpy (m_szInstance, (pszInstance) ? pszInstance : TEXT(""));
42 m_lpiThis = NULL;
43 m_fStatusOutOfDate = TRUE;
44 m_mszOwnerOf = NULL;
45 m_mszMemberOf = NULL;
46 memset(&m_us, 0, sizeof(m_us));
50 USER::~USER (void)
52 if (m_lpiThis)
53 m_lpiThis->m_cRef --;
55 FreeString (m_mszOwnerOf);
56 FreeString (m_mszMemberOf);
60 void USER::SendDeleteNotifications (void)
62 NOTIFYCALLBACK::SendNotificationToAll (evtDestroy, GetIdentifier());
66 void USER::Close (void)
68 AfsClass_Leave();
72 LPIDENT USER::GetIdentifier (void)
74 if (m_lpiThis == NULL)
76 if ((m_lpiThis = IDENT::FindIdent (this)) == NULL)
77 m_lpiThis = New2 (IDENT,(this));
78 m_lpiThis->m_cRef ++;
81 return m_lpiThis;
85 void USER::Invalidate (void)
87 m_fStatusOutOfDate = TRUE;
91 LPCELL USER::OpenCell (ULONG *pStatus)
93 return m_lpiCell->OpenCell (pStatus);
97 void USER::GetName (LPTSTR pszPrincipal, LPTSTR pszInstance)
99 if (pszPrincipal)
100 lstrcpy (pszPrincipal, m_szPrincipal);
101 if (pszInstance)
102 lstrcpy (pszInstance, m_szInstance);
106 BOOL USER::GetStatus (LPUSERSTATUS lpus, BOOL fNotify, ULONG *pStatus)
108 if (!RefreshStatus (fNotify, pStatus))
109 return FALSE;
111 memcpy (lpus, &m_us, sizeof(USERSTATUS));
112 return TRUE;
116 PVOID USER::GetUserParam (void)
118 return GetIdentifier()->GetUserParam();
122 void USER::SetUserParam (PVOID pUserParam)
124 GetIdentifier()->SetUserParam (pUserParam);
128 BOOL USER::GetOwnerOf (LPTSTR *ppmsz, ULONG *pStatus)
130 if (!RefreshStatus (TRUE, pStatus))
131 return FALSE;
132 *ppmsz = CloneMultiString (m_mszOwnerOf);
133 return TRUE;
137 BOOL USER::GetMemberOf (LPTSTR *ppmsz, ULONG *pStatus)
139 if (!RefreshStatus (TRUE, pStatus))
140 return FALSE;
141 *ppmsz = CloneMultiString (m_mszMemberOf);
142 return TRUE;
146 BOOL USER::RefreshStatus (BOOL fNotify, ULONG *pStatus)
148 BOOL rc = TRUE;
149 DWORD status = 0;
150 DWORD kasStatus = 0;
151 DWORD ptsStatus = 0;
153 if (m_fStatusOutOfDate)
155 m_fStatusOutOfDate = FALSE;
157 if (fNotify)
158 NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusBegin, GetIdentifier());
160 memset (&m_us, 0x00, sizeof(m_us));
162 FreeString (m_mszOwnerOf);
163 m_mszOwnerOf = NULL;
165 FreeString (m_mszMemberOf);
166 m_mszMemberOf = NULL;
168 TCHAR szFullName[ cchNAME ];
169 AfsClass_GenFullUserName (szFullName, m_szPrincipal, m_szInstance);
171 LPCELL lpCell;
172 if ((lpCell = OpenCell (&status)) == NULL)
173 rc = FALSE;
174 else
176 PVOID hCell;
177 if ((hCell = lpCell->GetCellObject (&status)) == NULL)
178 rc = FALSE;
179 else
181 // Try to get KAS information.
183 WORKERPACKET wpGetKas;
184 wpGetKas.wpKasPrincipalGet.hCell = hCell;
185 wpGetKas.wpKasPrincipalGet.hServer = lpCell->GetKasObject (&kasStatus);
186 wpGetKas.wpKasPrincipalGet.pszPrincipal = m_szPrincipal;
187 wpGetKas.wpKasPrincipalGet.pszInstance = m_szInstance;
189 if (Worker_DoTask (wtaskKasPrincipalGet, &wpGetKas, &kasStatus))
191 m_us.fHaveKasInfo = TRUE;
193 TCHAR szLastModPrincipal[ cchNAME ];
194 TCHAR szLastModInstance[ cchNAME ];
195 CopyAnsiToString (szLastModPrincipal, wpGetKas.wpKasPrincipalGet.Data.lastModPrincipal.principal);
196 CopyAnsiToString (szLastModInstance, wpGetKas.wpKasPrincipalGet.Data.lastModPrincipal.instance);
198 m_us.KASINFO.fIsAdmin = (wpGetKas.wpKasPrincipalGet.Data.adminSetting == KAS_ADMIN) ? TRUE : FALSE;
199 m_us.KASINFO.fCanGetTickets = (wpGetKas.wpKasPrincipalGet.Data.tgsSetting == TGS) ? TRUE : FALSE;
200 m_us.KASINFO.fEncrypt = (wpGetKas.wpKasPrincipalGet.Data.encSetting == ENCRYPT) ? TRUE : FALSE;
201 m_us.KASINFO.fCanChangePassword = (wpGetKas.wpKasPrincipalGet.Data.cpwSetting == CHANGE_PASSWORD) ? TRUE : FALSE;
202 m_us.KASINFO.fCanReusePasswords = (wpGetKas.wpKasPrincipalGet.Data.rpwSetting == REUSE_PASSWORD) ? TRUE : FALSE;
203 AfsClass_UnixTimeToSystemTime (&m_us.KASINFO.timeExpires, wpGetKas.wpKasPrincipalGet.Data.userExpiration);
204 AfsClass_UnixTimeToSystemTime (&m_us.KASINFO.timeLastPwChange, wpGetKas.wpKasPrincipalGet.Data.lastChangePasswordTime);
205 AfsClass_UnixTimeToSystemTime (&m_us.KASINFO.timeLastMod, wpGetKas.wpKasPrincipalGet.Data.lastModTime);
206 m_us.KASINFO.lpiLastMod = IDENT::FindUser (m_lpiCell, szLastModPrincipal, szLastModInstance);
207 m_us.KASINFO.csecTicketLifetime = wpGetKas.wpKasPrincipalGet.Data.maxTicketLifetime;
208 m_us.KASINFO.keyVersion = wpGetKas.wpKasPrincipalGet.Data.keyVersion;
209 memcpy (&m_us.KASINFO.key.key, &wpGetKas.wpKasPrincipalGet.Data.key.key, ENCRYPTIONKEY_LEN);
210 m_us.KASINFO.dwKeyChecksum = wpGetKas.wpKasPrincipalGet.Data.keyCheckSum;
211 m_us.KASINFO.cdayPwExpire = wpGetKas.wpKasPrincipalGet.Data.daysToPasswordExpire;
212 m_us.KASINFO.cFailLogin = wpGetKas.wpKasPrincipalGet.Data.failLoginCount;
213 m_us.KASINFO.csecFailLoginLock = wpGetKas.wpKasPrincipalGet.Data.lockTime;
216 // Try to get PTS information.
218 WORKERPACKET wpGetPts;
219 wpGetPts.wpPtsUserGet.hCell = hCell;
220 wpGetPts.wpPtsUserGet.pszUser = szFullName;
221 if (Worker_DoTask (wtaskPtsUserGet, &wpGetPts, &ptsStatus))
223 m_us.fHavePtsInfo = TRUE;
225 m_us.PTSINFO.cgroupCreationQuota = wpGetPts.wpPtsUserGet.Entry.groupCreationQuota;
226 m_us.PTSINFO.cgroupMember = wpGetPts.wpPtsUserGet.Entry.groupMembershipCount;
227 m_us.PTSINFO.uidName = wpGetPts.wpPtsUserGet.Entry.nameUid;
228 m_us.PTSINFO.uidOwner = wpGetPts.wpPtsUserGet.Entry.ownerUid;
229 m_us.PTSINFO.uidCreator = wpGetPts.wpPtsUserGet.Entry.creatorUid;
231 CopyAnsiToString (m_us.PTSINFO.szOwner, wpGetPts.wpPtsUserGet.Entry.owner);
232 CopyAnsiToString (m_us.PTSINFO.szCreator, wpGetPts.wpPtsUserGet.Entry.creator);
234 m_us.PTSINFO.aaListStatus = USERACCESS_TO_ACCOUNTACCESS (wpGetPts.wpPtsUserGet.Entry.listStatus);
235 m_us.PTSINFO.aaGroupsOwned = USERACCESS_TO_ACCOUNTACCESS (wpGetPts.wpPtsUserGet.Entry.listGroupsOwned);
236 m_us.PTSINFO.aaMembership = USERACCESS_TO_ACCOUNTACCESS (wpGetPts.wpPtsUserGet.Entry.listMembership);
239 // Grab the list of groups to which this user belongs
241 WORKERPACKET wpBegin;
242 wpBegin.wpPtsUserMemberListBegin.hCell = hCell;
243 wpBegin.wpPtsUserMemberListBegin.pszUser = szFullName;
244 if (Worker_DoTask (wtaskPtsUserMemberListBegin, &wpBegin, &status))
246 for (;;)
248 TCHAR szGroup[ cchNAME ];
250 WORKERPACKET wpNext;
251 wpNext.wpPtsUserMemberListNext.hEnum = wpBegin.wpPtsUserMemberListBegin.hEnum;
252 wpNext.wpPtsUserMemberListNext.pszGroup = szGroup;
253 if (!Worker_DoTask (wtaskPtsUserMemberListNext, &wpNext))
254 break;
256 FormatMultiString (&m_mszMemberOf, FALSE, TEXT("%1"), TEXT("%s"), szGroup);
259 WORKERPACKET wpDone;
260 wpDone.wpPtsUserMemberListDone.hEnum = wpBegin.wpPtsUserMemberListBegin.hEnum;
261 Worker_DoTask (wtaskPtsUserMemberListDone, &wpDone);
264 // Grab the list of groups which this user owns
266 wpBegin.wpPtsOwnedGroupListBegin.hCell = hCell;
267 wpBegin.wpPtsOwnedGroupListBegin.pszOwner = szFullName;
268 if (Worker_DoTask (wtaskPtsOwnedGroupListBegin, &wpBegin, &status))
270 for (;;)
272 TCHAR szGroup[ cchNAME ];
274 WORKERPACKET wpNext;
275 wpNext.wpPtsOwnedGroupListNext.hEnum = wpBegin.wpPtsOwnedGroupListBegin.hEnum;
276 wpNext.wpPtsOwnedGroupListNext.pszGroup = szGroup;
277 if (!Worker_DoTask (wtaskPtsOwnedGroupListNext, &wpNext))
278 break;
280 FormatMultiString (&m_mszOwnerOf, FALSE, TEXT("%1"), TEXT("%s"), szGroup);
283 WORKERPACKET wpDone;
284 wpDone.wpPtsOwnedGroupListDone.hEnum = wpBegin.wpPtsOwnedGroupListBegin.hEnum;
285 Worker_DoTask (wtaskPtsOwnedGroupListDone, &wpDone);
289 lpCell->Close();
292 if (fNotify)
293 NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusEnd, GetIdentifier(), ((rc) ? 0 : status));
296 if (rc && (!m_us.fHaveKasInfo) && (!status) && kasStatus)
298 status = kasStatus;
299 rc = FALSE;
301 if (rc && (!m_us.fHavePtsInfo) && (!status) && ptsStatus)
303 status = ptsStatus;
304 // not fatal; rc remains TRUE
306 if (pStatus && !rc)
307 *pStatus = status;
308 return TRUE;
312 void USER::SplitUserName (LPCTSTR pszFull, LPTSTR pszName, LPTSTR pszInstance)
314 if (pszName)
315 lstrcpy (pszName, pszFull);
316 if (pszInstance)
317 lstrcpy (pszInstance, TEXT(""));
319 if (!USER::IsMachineAccount (pszFull))
321 if (pszName && pszInstance)
323 LPTSTR pchDot;
324 if ((pchDot = (LPTSTR)lstrchr (pszName, TEXT('.'))) != NULL)
326 *pchDot = TEXT('\0');
327 lstrcpy (pszInstance, &pchDot[1]);
334 BOOL USER::IsMachineAccount (LPCTSTR pszName)
336 for ( ; pszName && *pszName; ++pszName)
338 if (!( (*pszName == TEXT('.')) || ((*pszName >= TEXT('0')) && (*pszName <= TEXT('9'))) ))
339 return FALSE;
341 return TRUE;