2 * Copyright 2000, International Business Machines Corporation and others.
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
14 #include <afsconfig.h>
15 #include <afs/param.h>
20 #include <WINNT/afsclass.h>
25 * DEFINITIONS ________________________________________________________________
29 #define USERACCESS_TO_ACCOUNTACCESS(_ua) ( ((_ua) == PTS_USER_OWNER_ACCESS) ? aaOWNER_ONLY : aaANYONE )
33 * ROUTINES ___________________________________________________________________
37 USER::USER (LPCELL lpCellParent, LPTSTR pszPrincipal, LPTSTR pszInstance)
39 m_lpiCell = lpCellParent->GetIdentifier();
40 lstrcpy (m_szPrincipal, pszPrincipal);
41 lstrcpy (m_szInstance, (pszInstance) ? pszInstance : TEXT(""));
44 m_fStatusOutOfDate = TRUE;
47 memset(&m_us, 0, sizeof(m_us));
56 FreeString (m_mszOwnerOf);
57 FreeString (m_mszMemberOf);
61 void USER::SendDeleteNotifications (void)
63 NOTIFYCALLBACK::SendNotificationToAll (evtDestroy, GetIdentifier());
67 void USER::Close (void)
73 LPIDENT USER::GetIdentifier (void)
75 if (m_lpiThis == NULL)
77 if ((m_lpiThis = IDENT::FindIdent (this)) == NULL)
78 m_lpiThis = New2 (IDENT,(this));
86 void USER::Invalidate (void)
88 m_fStatusOutOfDate = TRUE;
92 LPCELL USER::OpenCell (ULONG *pStatus)
94 return m_lpiCell->OpenCell (pStatus);
98 void USER::GetName (LPTSTR pszPrincipal, LPTSTR pszInstance)
101 lstrcpy (pszPrincipal, m_szPrincipal);
103 lstrcpy (pszInstance, m_szInstance);
107 BOOL USER::GetStatus (LPUSERSTATUS lpus, BOOL fNotify, ULONG *pStatus)
109 if (!RefreshStatus (fNotify, pStatus))
112 memcpy (lpus, &m_us, sizeof(USERSTATUS));
117 PVOID USER::GetUserParam (void)
119 return GetIdentifier()->GetUserParam();
123 void USER::SetUserParam (PVOID pUserParam)
125 GetIdentifier()->SetUserParam (pUserParam);
129 BOOL USER::GetOwnerOf (LPTSTR *ppmsz, ULONG *pStatus)
131 if (!RefreshStatus (TRUE, pStatus))
133 *ppmsz = CloneMultiString (m_mszOwnerOf);
138 BOOL USER::GetMemberOf (LPTSTR *ppmsz, ULONG *pStatus)
140 if (!RefreshStatus (TRUE, pStatus))
142 *ppmsz = CloneMultiString (m_mszMemberOf);
147 BOOL USER::RefreshStatus (BOOL fNotify, ULONG *pStatus)
154 if (m_fStatusOutOfDate)
156 m_fStatusOutOfDate = FALSE;
159 NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusBegin, GetIdentifier());
161 memset (&m_us, 0x00, sizeof(m_us));
163 FreeString (m_mszOwnerOf);
166 FreeString (m_mszMemberOf);
167 m_mszMemberOf = NULL;
169 TCHAR szFullName[ cchNAME ];
170 AfsClass_GenFullUserName (szFullName, m_szPrincipal, m_szInstance);
173 if ((lpCell = OpenCell (&status)) == NULL)
178 if ((hCell = lpCell->GetCellObject (&status)) == NULL)
182 // Try to get KAS information.
184 WORKERPACKET wpGetKas;
185 wpGetKas.wpKasPrincipalGet.hCell = hCell;
186 wpGetKas.wpKasPrincipalGet.hServer = lpCell->GetKasObject (&kasStatus);
187 wpGetKas.wpKasPrincipalGet.pszPrincipal = m_szPrincipal;
188 wpGetKas.wpKasPrincipalGet.pszInstance = m_szInstance;
190 if (Worker_DoTask (wtaskKasPrincipalGet, &wpGetKas, &kasStatus))
192 m_us.fHaveKasInfo = TRUE;
194 TCHAR szLastModPrincipal[ cchNAME ];
195 TCHAR szLastModInstance[ cchNAME ];
196 CopyAnsiToString (szLastModPrincipal, wpGetKas.wpKasPrincipalGet.Data.lastModPrincipal.principal);
197 CopyAnsiToString (szLastModInstance, wpGetKas.wpKasPrincipalGet.Data.lastModPrincipal.instance);
199 m_us.KASINFO.fIsAdmin = (wpGetKas.wpKasPrincipalGet.Data.adminSetting == KAS_ADMIN) ? TRUE : FALSE;
200 m_us.KASINFO.fCanGetTickets = (wpGetKas.wpKasPrincipalGet.Data.tgsSetting == TGS) ? TRUE : FALSE;
201 m_us.KASINFO.fEncrypt = (wpGetKas.wpKasPrincipalGet.Data.encSetting == ENCRYPT) ? TRUE : FALSE;
202 m_us.KASINFO.fCanChangePassword = (wpGetKas.wpKasPrincipalGet.Data.cpwSetting == CHANGE_PASSWORD) ? TRUE : FALSE;
203 m_us.KASINFO.fCanReusePasswords = (wpGetKas.wpKasPrincipalGet.Data.rpwSetting == REUSE_PASSWORD) ? TRUE : FALSE;
204 AfsClass_UnixTimeToSystemTime (&m_us.KASINFO.timeExpires, wpGetKas.wpKasPrincipalGet.Data.userExpiration);
205 AfsClass_UnixTimeToSystemTime (&m_us.KASINFO.timeLastPwChange, wpGetKas.wpKasPrincipalGet.Data.lastChangePasswordTime);
206 AfsClass_UnixTimeToSystemTime (&m_us.KASINFO.timeLastMod, wpGetKas.wpKasPrincipalGet.Data.lastModTime);
207 m_us.KASINFO.lpiLastMod = IDENT::FindUser (m_lpiCell, szLastModPrincipal, szLastModInstance);
208 m_us.KASINFO.csecTicketLifetime = wpGetKas.wpKasPrincipalGet.Data.maxTicketLifetime;
209 m_us.KASINFO.keyVersion = wpGetKas.wpKasPrincipalGet.Data.keyVersion;
210 memcpy (&m_us.KASINFO.key.key, &wpGetKas.wpKasPrincipalGet.Data.key.key, ENCRYPTIONKEY_LEN);
211 m_us.KASINFO.dwKeyChecksum = wpGetKas.wpKasPrincipalGet.Data.keyCheckSum;
212 m_us.KASINFO.cdayPwExpire = wpGetKas.wpKasPrincipalGet.Data.daysToPasswordExpire;
213 m_us.KASINFO.cFailLogin = wpGetKas.wpKasPrincipalGet.Data.failLoginCount;
214 m_us.KASINFO.csecFailLoginLock = wpGetKas.wpKasPrincipalGet.Data.lockTime;
217 // Try to get PTS information.
219 WORKERPACKET wpGetPts;
220 wpGetPts.wpPtsUserGet.hCell = hCell;
221 wpGetPts.wpPtsUserGet.pszUser = szFullName;
222 if (Worker_DoTask (wtaskPtsUserGet, &wpGetPts, &ptsStatus))
224 m_us.fHavePtsInfo = TRUE;
226 m_us.PTSINFO.cgroupCreationQuota = wpGetPts.wpPtsUserGet.Entry.groupCreationQuota;
227 m_us.PTSINFO.cgroupMember = wpGetPts.wpPtsUserGet.Entry.groupMembershipCount;
228 m_us.PTSINFO.uidName = wpGetPts.wpPtsUserGet.Entry.nameUid;
229 m_us.PTSINFO.uidOwner = wpGetPts.wpPtsUserGet.Entry.ownerUid;
230 m_us.PTSINFO.uidCreator = wpGetPts.wpPtsUserGet.Entry.creatorUid;
232 CopyAnsiToString (m_us.PTSINFO.szOwner, wpGetPts.wpPtsUserGet.Entry.owner);
233 CopyAnsiToString (m_us.PTSINFO.szCreator, wpGetPts.wpPtsUserGet.Entry.creator);
235 m_us.PTSINFO.aaListStatus = USERACCESS_TO_ACCOUNTACCESS (wpGetPts.wpPtsUserGet.Entry.listStatus);
236 m_us.PTSINFO.aaGroupsOwned = USERACCESS_TO_ACCOUNTACCESS (wpGetPts.wpPtsUserGet.Entry.listGroupsOwned);
237 m_us.PTSINFO.aaMembership = USERACCESS_TO_ACCOUNTACCESS (wpGetPts.wpPtsUserGet.Entry.listMembership);
240 // Grab the list of groups to which this user belongs
242 WORKERPACKET wpBegin;
243 wpBegin.wpPtsUserMemberListBegin.hCell = hCell;
244 wpBegin.wpPtsUserMemberListBegin.pszUser = szFullName;
245 if (Worker_DoTask (wtaskPtsUserMemberListBegin, &wpBegin, &status))
249 TCHAR szGroup[ cchNAME ];
252 wpNext.wpPtsUserMemberListNext.hEnum = wpBegin.wpPtsUserMemberListBegin.hEnum;
253 wpNext.wpPtsUserMemberListNext.pszGroup = szGroup;
254 if (!Worker_DoTask (wtaskPtsUserMemberListNext, &wpNext))
257 FormatMultiString (&m_mszMemberOf, FALSE, TEXT("%1"), TEXT("%s"), szGroup);
261 wpDone.wpPtsUserMemberListDone.hEnum = wpBegin.wpPtsUserMemberListBegin.hEnum;
262 Worker_DoTask (wtaskPtsUserMemberListDone, &wpDone);
265 // Grab the list of groups which this user owns
267 wpBegin.wpPtsOwnedGroupListBegin.hCell = hCell;
268 wpBegin.wpPtsOwnedGroupListBegin.pszOwner = szFullName;
269 if (Worker_DoTask (wtaskPtsOwnedGroupListBegin, &wpBegin, &status))
273 TCHAR szGroup[ cchNAME ];
276 wpNext.wpPtsOwnedGroupListNext.hEnum = wpBegin.wpPtsOwnedGroupListBegin.hEnum;
277 wpNext.wpPtsOwnedGroupListNext.pszGroup = szGroup;
278 if (!Worker_DoTask (wtaskPtsOwnedGroupListNext, &wpNext))
281 FormatMultiString (&m_mszOwnerOf, FALSE, TEXT("%1"), TEXT("%s"), szGroup);
285 wpDone.wpPtsOwnedGroupListDone.hEnum = wpBegin.wpPtsOwnedGroupListBegin.hEnum;
286 Worker_DoTask (wtaskPtsOwnedGroupListDone, &wpDone);
294 NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusEnd, GetIdentifier(), ((rc) ? 0 : status));
297 if (rc && (!m_us.fHaveKasInfo) && (!status) && kasStatus)
302 if (rc && (!m_us.fHavePtsInfo) && (!status) && ptsStatus)
305 // not fatal; rc remains TRUE
313 void USER::SplitUserName (LPCTSTR pszFull, LPTSTR pszName, LPTSTR pszInstance)
316 lstrcpy (pszName, pszFull);
318 lstrcpy (pszInstance, TEXT(""));
320 if (!USER::IsMachineAccount (pszFull))
322 if (pszName && pszInstance)
325 if ((pchDot = (LPTSTR)lstrchr (pszName, TEXT('.'))) != NULL)
327 *pchDot = TEXT('\0');
328 lstrcpy (pszInstance, &pchDot[1]);
335 BOOL USER::IsMachineAccount (LPCTSTR pszName)
337 for ( ; pszName && *pszName; ++pszName)
339 if (!( (*pszName == TEXT('.')) || ((*pszName >= TEXT('0')) && (*pszName <= TEXT('9'))) ))