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
11 #include <afs/param.h>
15 #include <WINNT/afsclass.h>
20 * DEFINITIONS ________________________________________________________________
24 #define USERACCESS_TO_ACCOUNTACCESS(_ua) ( ((_ua) == PTS_USER_OWNER_ACCESS) ? aaOWNER_ONLY : aaANYONE )
28 * ROUTINES ___________________________________________________________________
32 USER::USER (LPCELL lpCellParent, LPTSTR pszPrincipal, LPTSTR pszInstance)
34 m_lpiCell = lpCellParent->GetIdentifier();
35 lstrcpy (m_szPrincipal, pszPrincipal);
36 lstrcpy (m_szInstance, (pszInstance) ? pszInstance : TEXT(""));
39 m_fStatusOutOfDate = TRUE;
42 memset(&m_us, 0, sizeof(m_us));
51 FreeString (m_mszOwnerOf);
52 FreeString (m_mszMemberOf);
56 void USER::SendDeleteNotifications (void)
58 NOTIFYCALLBACK::SendNotificationToAll (evtDestroy, GetIdentifier());
62 void USER::Close (void)
68 LPIDENT USER::GetIdentifier (void)
70 if (m_lpiThis == NULL)
72 if ((m_lpiThis = IDENT::FindIdent (this)) == NULL)
73 m_lpiThis = New2 (IDENT,(this));
81 void USER::Invalidate (void)
83 m_fStatusOutOfDate = TRUE;
87 LPCELL USER::OpenCell (ULONG *pStatus)
89 return m_lpiCell->OpenCell (pStatus);
93 void USER::GetName (LPTSTR pszPrincipal, LPTSTR pszInstance)
96 lstrcpy (pszPrincipal, m_szPrincipal);
98 lstrcpy (pszInstance, m_szInstance);
102 BOOL USER::GetStatus (LPUSERSTATUS lpus, BOOL fNotify, ULONG *pStatus)
104 if (!RefreshStatus (fNotify, pStatus))
107 memcpy (lpus, &m_us, sizeof(USERSTATUS));
112 PVOID USER::GetUserParam (void)
114 return GetIdentifier()->GetUserParam();
118 void USER::SetUserParam (PVOID pUserParam)
120 GetIdentifier()->SetUserParam (pUserParam);
124 BOOL USER::GetOwnerOf (LPTSTR *ppmsz, ULONG *pStatus)
126 if (!RefreshStatus (TRUE, pStatus))
128 *ppmsz = CloneMultiString (m_mszOwnerOf);
133 BOOL USER::GetMemberOf (LPTSTR *ppmsz, ULONG *pStatus)
135 if (!RefreshStatus (TRUE, pStatus))
137 *ppmsz = CloneMultiString (m_mszMemberOf);
142 BOOL USER::RefreshStatus (BOOL fNotify, ULONG *pStatus)
149 if (m_fStatusOutOfDate)
151 m_fStatusOutOfDate = FALSE;
154 NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusBegin, GetIdentifier());
156 memset (&m_us, 0x00, sizeof(m_us));
158 FreeString (m_mszOwnerOf);
161 FreeString (m_mszMemberOf);
162 m_mszMemberOf = NULL;
164 TCHAR szFullName[ cchNAME ];
165 AfsClass_GenFullUserName (szFullName, m_szPrincipal, m_szInstance);
168 if ((lpCell = OpenCell (&status)) == NULL)
173 if ((hCell = lpCell->GetCellObject (&status)) == NULL)
177 // Try to get KAS information.
179 WORKERPACKET wpGetKas;
180 wpGetKas.wpKasPrincipalGet.hCell = hCell;
181 wpGetKas.wpKasPrincipalGet.hServer = lpCell->GetKasObject (&kasStatus);
182 wpGetKas.wpKasPrincipalGet.pszPrincipal = m_szPrincipal;
183 wpGetKas.wpKasPrincipalGet.pszInstance = m_szInstance;
185 if (Worker_DoTask (wtaskKasPrincipalGet, &wpGetKas, &kasStatus))
187 m_us.fHaveKasInfo = TRUE;
189 TCHAR szLastModPrincipal[ cchNAME ];
190 TCHAR szLastModInstance[ cchNAME ];
191 CopyAnsiToString (szLastModPrincipal, wpGetKas.wpKasPrincipalGet.Data.lastModPrincipal.principal);
192 CopyAnsiToString (szLastModInstance, wpGetKas.wpKasPrincipalGet.Data.lastModPrincipal.instance);
194 m_us.KASINFO.fIsAdmin = (wpGetKas.wpKasPrincipalGet.Data.adminSetting == KAS_ADMIN) ? TRUE : FALSE;
195 m_us.KASINFO.fCanGetTickets = (wpGetKas.wpKasPrincipalGet.Data.tgsSetting == TGS) ? TRUE : FALSE;
196 m_us.KASINFO.fEncrypt = (wpGetKas.wpKasPrincipalGet.Data.encSetting == ENCRYPT) ? TRUE : FALSE;
197 m_us.KASINFO.fCanChangePassword = (wpGetKas.wpKasPrincipalGet.Data.cpwSetting == CHANGE_PASSWORD) ? TRUE : FALSE;
198 m_us.KASINFO.fCanReusePasswords = (wpGetKas.wpKasPrincipalGet.Data.rpwSetting == REUSE_PASSWORD) ? TRUE : FALSE;
199 AfsClass_UnixTimeToSystemTime (&m_us.KASINFO.timeExpires, wpGetKas.wpKasPrincipalGet.Data.userExpiration);
200 AfsClass_UnixTimeToSystemTime (&m_us.KASINFO.timeLastPwChange, wpGetKas.wpKasPrincipalGet.Data.lastChangePasswordTime);
201 AfsClass_UnixTimeToSystemTime (&m_us.KASINFO.timeLastMod, wpGetKas.wpKasPrincipalGet.Data.lastModTime);
202 m_us.KASINFO.lpiLastMod = IDENT::FindUser (m_lpiCell, szLastModPrincipal, szLastModInstance);
203 m_us.KASINFO.csecTicketLifetime = wpGetKas.wpKasPrincipalGet.Data.maxTicketLifetime;
204 m_us.KASINFO.keyVersion = wpGetKas.wpKasPrincipalGet.Data.keyVersion;
205 memcpy (&m_us.KASINFO.key.key, &wpGetKas.wpKasPrincipalGet.Data.key.key, ENCRYPTIONKEY_LEN);
206 m_us.KASINFO.dwKeyChecksum = wpGetKas.wpKasPrincipalGet.Data.keyCheckSum;
207 m_us.KASINFO.cdayPwExpire = wpGetKas.wpKasPrincipalGet.Data.daysToPasswordExpire;
208 m_us.KASINFO.cFailLogin = wpGetKas.wpKasPrincipalGet.Data.failLoginCount;
209 m_us.KASINFO.csecFailLoginLock = wpGetKas.wpKasPrincipalGet.Data.lockTime;
212 // Try to get PTS information.
214 WORKERPACKET wpGetPts;
215 wpGetPts.wpPtsUserGet.hCell = hCell;
216 wpGetPts.wpPtsUserGet.pszUser = szFullName;
217 if (Worker_DoTask (wtaskPtsUserGet, &wpGetPts, &ptsStatus))
219 m_us.fHavePtsInfo = TRUE;
221 m_us.PTSINFO.cgroupCreationQuota = wpGetPts.wpPtsUserGet.Entry.groupCreationQuota;
222 m_us.PTSINFO.cgroupMember = wpGetPts.wpPtsUserGet.Entry.groupMembershipCount;
223 m_us.PTSINFO.uidName = wpGetPts.wpPtsUserGet.Entry.nameUid;
224 m_us.PTSINFO.uidOwner = wpGetPts.wpPtsUserGet.Entry.ownerUid;
225 m_us.PTSINFO.uidCreator = wpGetPts.wpPtsUserGet.Entry.creatorUid;
227 CopyAnsiToString (m_us.PTSINFO.szOwner, wpGetPts.wpPtsUserGet.Entry.owner);
228 CopyAnsiToString (m_us.PTSINFO.szCreator, wpGetPts.wpPtsUserGet.Entry.creator);
230 m_us.PTSINFO.aaListStatus = USERACCESS_TO_ACCOUNTACCESS (wpGetPts.wpPtsUserGet.Entry.listStatus);
231 m_us.PTSINFO.aaGroupsOwned = USERACCESS_TO_ACCOUNTACCESS (wpGetPts.wpPtsUserGet.Entry.listGroupsOwned);
232 m_us.PTSINFO.aaMembership = USERACCESS_TO_ACCOUNTACCESS (wpGetPts.wpPtsUserGet.Entry.listMembership);
235 // Grab the list of groups to which this user belongs
237 WORKERPACKET wpBegin;
238 wpBegin.wpPtsUserMemberListBegin.hCell = hCell;
239 wpBegin.wpPtsUserMemberListBegin.pszUser = szFullName;
240 if (Worker_DoTask (wtaskPtsUserMemberListBegin, &wpBegin, &status))
244 TCHAR szGroup[ cchNAME ];
247 wpNext.wpPtsUserMemberListNext.hEnum = wpBegin.wpPtsUserMemberListBegin.hEnum;
248 wpNext.wpPtsUserMemberListNext.pszGroup = szGroup;
249 if (!Worker_DoTask (wtaskPtsUserMemberListNext, &wpNext))
252 FormatMultiString (&m_mszMemberOf, FALSE, TEXT("%1"), TEXT("%s"), szGroup);
256 wpDone.wpPtsUserMemberListDone.hEnum = wpBegin.wpPtsUserMemberListBegin.hEnum;
257 Worker_DoTask (wtaskPtsUserMemberListDone, &wpDone);
260 // Grab the list of groups which this user owns
262 wpBegin.wpPtsOwnedGroupListBegin.hCell = hCell;
263 wpBegin.wpPtsOwnedGroupListBegin.pszOwner = szFullName;
264 if (Worker_DoTask (wtaskPtsOwnedGroupListBegin, &wpBegin, &status))
268 TCHAR szGroup[ cchNAME ];
271 wpNext.wpPtsOwnedGroupListNext.hEnum = wpBegin.wpPtsOwnedGroupListBegin.hEnum;
272 wpNext.wpPtsOwnedGroupListNext.pszGroup = szGroup;
273 if (!Worker_DoTask (wtaskPtsOwnedGroupListNext, &wpNext))
276 FormatMultiString (&m_mszOwnerOf, FALSE, TEXT("%1"), TEXT("%s"), szGroup);
280 wpDone.wpPtsOwnedGroupListDone.hEnum = wpBegin.wpPtsOwnedGroupListBegin.hEnum;
281 Worker_DoTask (wtaskPtsOwnedGroupListDone, &wpDone);
289 NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusEnd, GetIdentifier(), ((rc) ? 0 : status));
292 if (rc && (!m_us.fHaveKasInfo) && (!status) && kasStatus)
297 if (rc && (!m_us.fHavePtsInfo) && (!status) && ptsStatus)
300 // not fatal; rc remains TRUE
308 void USER::SplitUserName (LPCTSTR pszFull, LPTSTR pszName, LPTSTR pszInstance)
311 lstrcpy (pszName, pszFull);
313 lstrcpy (pszInstance, TEXT(""));
315 if (!USER::IsMachineAccount (pszFull))
317 if (pszName && pszInstance)
320 if ((pchDot = (LPTSTR)lstrchr (pszName, TEXT('.'))) != NULL)
322 *pchDot = TEXT('\0');
323 lstrcpy (pszInstance, &pchDot[1]);
330 BOOL USER::IsMachineAccount (LPCTSTR pszName)
332 for ( ; pszName && *pszName; ++pszName)
334 if (!( (*pszName == TEXT('.')) || ((*pszName >= TEXT('0')) && (*pszName <= TEXT('9'))) ))