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;
50 FreeString (m_mszOwnerOf);
51 FreeString (m_mszMemberOf);
55 void USER::SendDeleteNotifications (void)
57 NOTIFYCALLBACK::SendNotificationToAll (evtDestroy, GetIdentifier());
61 void USER::Close (void)
67 LPIDENT USER::GetIdentifier (void)
69 if (m_lpiThis == NULL)
71 if ((m_lpiThis = IDENT::FindIdent (this)) == NULL)
72 m_lpiThis = New2 (IDENT,(this));
80 void USER::Invalidate (void)
82 m_fStatusOutOfDate = TRUE;
86 LPCELL USER::OpenCell (ULONG *pStatus)
88 return m_lpiCell->OpenCell (pStatus);
92 void USER::GetName (LPTSTR pszPrincipal, LPTSTR pszInstance)
95 lstrcpy (pszPrincipal, m_szPrincipal);
97 lstrcpy (pszInstance, m_szInstance);
101 BOOL USER::GetStatus (LPUSERSTATUS lpus, BOOL fNotify, ULONG *pStatus)
103 if (!RefreshStatus (fNotify, pStatus))
106 memcpy (lpus, &m_us, sizeof(USERSTATUS));
111 PVOID USER::GetUserParam (void)
113 return GetIdentifier()->GetUserParam();
117 void USER::SetUserParam (PVOID pUserParam)
119 GetIdentifier()->SetUserParam (pUserParam);
123 BOOL USER::GetOwnerOf (LPTSTR *ppmsz, ULONG *pStatus)
125 if (!RefreshStatus (TRUE, pStatus))
127 *ppmsz = CloneMultiString (m_mszOwnerOf);
132 BOOL USER::GetMemberOf (LPTSTR *ppmsz, ULONG *pStatus)
134 if (!RefreshStatus (TRUE, pStatus))
136 *ppmsz = CloneMultiString (m_mszMemberOf);
141 BOOL USER::RefreshStatus (BOOL fNotify, ULONG *pStatus)
148 if (m_fStatusOutOfDate)
150 m_fStatusOutOfDate = FALSE;
153 NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusBegin, GetIdentifier());
155 memset (&m_us, 0x00, sizeof(m_us));
157 FreeString (m_mszOwnerOf);
160 FreeString (m_mszMemberOf);
161 m_mszMemberOf = NULL;
163 TCHAR szFullName[ cchNAME ];
164 AfsClass_GenFullUserName (szFullName, m_szPrincipal, m_szInstance);
167 if ((lpCell = OpenCell (&status)) == NULL)
172 if ((hCell = lpCell->GetCellObject (&status)) == NULL)
176 // Try to get KAS information.
178 WORKERPACKET wpGetKas;
179 wpGetKas.wpKasPrincipalGet.hCell = hCell;
180 wpGetKas.wpKasPrincipalGet.hServer = lpCell->GetKasObject (&kasStatus);
181 wpGetKas.wpKasPrincipalGet.pszPrincipal = m_szPrincipal;
182 wpGetKas.wpKasPrincipalGet.pszInstance = m_szInstance;
184 if (Worker_DoTask (wtaskKasPrincipalGet, &wpGetKas, &kasStatus))
186 m_us.fHaveKasInfo = TRUE;
188 TCHAR szLastModPrincipal[ cchNAME ];
189 TCHAR szLastModInstance[ cchNAME ];
190 CopyAnsiToString (szLastModPrincipal, wpGetKas.wpKasPrincipalGet.Data.lastModPrincipal.principal);
191 CopyAnsiToString (szLastModInstance, wpGetKas.wpKasPrincipalGet.Data.lastModPrincipal.instance);
193 m_us.KASINFO.fIsAdmin = (wpGetKas.wpKasPrincipalGet.Data.adminSetting == ADMIN) ? TRUE : FALSE;
194 m_us.KASINFO.fCanGetTickets = (wpGetKas.wpKasPrincipalGet.Data.tgsSetting == TGS) ? TRUE : FALSE;
195 m_us.KASINFO.fEncrypt = (wpGetKas.wpKasPrincipalGet.Data.encSetting == ENCRYPT) ? TRUE : FALSE;
196 m_us.KASINFO.fCanChangePassword = (wpGetKas.wpKasPrincipalGet.Data.cpwSetting == CHANGE_PASSWORD) ? TRUE : FALSE;
197 m_us.KASINFO.fCanReusePasswords = (wpGetKas.wpKasPrincipalGet.Data.rpwSetting == REUSE_PASSWORD) ? TRUE : FALSE;
198 AfsClass_UnixTimeToSystemTime (&m_us.KASINFO.timeExpires, wpGetKas.wpKasPrincipalGet.Data.userExpiration);
199 AfsClass_UnixTimeToSystemTime (&m_us.KASINFO.timeLastPwChange, wpGetKas.wpKasPrincipalGet.Data.lastChangePasswordTime);
200 AfsClass_UnixTimeToSystemTime (&m_us.KASINFO.timeLastMod, wpGetKas.wpKasPrincipalGet.Data.lastModTime);
201 m_us.KASINFO.lpiLastMod = IDENT::FindUser (m_lpiCell, szLastModPrincipal, szLastModInstance);
202 m_us.KASINFO.csecTicketLifetime = wpGetKas.wpKasPrincipalGet.Data.maxTicketLifetime;
203 m_us.KASINFO.keyVersion = wpGetKas.wpKasPrincipalGet.Data.keyVersion;
204 memcpy (&m_us.KASINFO.key.key, &wpGetKas.wpKasPrincipalGet.Data.key.key, ENCRYPTIONKEY_LEN);
205 m_us.KASINFO.dwKeyChecksum = wpGetKas.wpKasPrincipalGet.Data.keyCheckSum;
206 m_us.KASINFO.cdayPwExpire = wpGetKas.wpKasPrincipalGet.Data.daysToPasswordExpire;
207 m_us.KASINFO.cFailLogin = wpGetKas.wpKasPrincipalGet.Data.failLoginCount;
208 m_us.KASINFO.csecFailLoginLock = wpGetKas.wpKasPrincipalGet.Data.lockTime;
211 // Try to get PTS information.
213 WORKERPACKET wpGetPts;
214 wpGetPts.wpPtsUserGet.hCell = hCell;
215 wpGetPts.wpPtsUserGet.pszUser = szFullName;
216 if (Worker_DoTask (wtaskPtsUserGet, &wpGetPts, &ptsStatus))
218 m_us.fHavePtsInfo = TRUE;
220 m_us.PTSINFO.cgroupCreationQuota = wpGetPts.wpPtsUserGet.Entry.groupCreationQuota;
221 m_us.PTSINFO.cgroupMember = wpGetPts.wpPtsUserGet.Entry.groupMembershipCount;
222 m_us.PTSINFO.uidName = wpGetPts.wpPtsUserGet.Entry.nameUid;
223 m_us.PTSINFO.uidOwner = wpGetPts.wpPtsUserGet.Entry.ownerUid;
224 m_us.PTSINFO.uidCreator = wpGetPts.wpPtsUserGet.Entry.creatorUid;
226 CopyAnsiToString (m_us.PTSINFO.szOwner, wpGetPts.wpPtsUserGet.Entry.owner);
227 CopyAnsiToString (m_us.PTSINFO.szCreator, wpGetPts.wpPtsUserGet.Entry.creator);
229 m_us.PTSINFO.aaListStatus = USERACCESS_TO_ACCOUNTACCESS (wpGetPts.wpPtsUserGet.Entry.listStatus);
230 m_us.PTSINFO.aaGroupsOwned = USERACCESS_TO_ACCOUNTACCESS (wpGetPts.wpPtsUserGet.Entry.listGroupsOwned);
231 m_us.PTSINFO.aaMembership = USERACCESS_TO_ACCOUNTACCESS (wpGetPts.wpPtsUserGet.Entry.listMembership);
234 // Grab the list of groups to which this user belongs
236 WORKERPACKET wpBegin;
237 wpBegin.wpPtsUserMemberListBegin.hCell = hCell;
238 wpBegin.wpPtsUserMemberListBegin.pszUser = szFullName;
239 if (Worker_DoTask (wtaskPtsUserMemberListBegin, &wpBegin, &status))
243 TCHAR szGroup[ cchNAME ];
246 wpNext.wpPtsUserMemberListNext.hEnum = wpBegin.wpPtsUserMemberListBegin.hEnum;
247 wpNext.wpPtsUserMemberListNext.pszGroup = szGroup;
248 if (!Worker_DoTask (wtaskPtsUserMemberListNext, &wpNext))
251 FormatMultiString (&m_mszMemberOf, FALSE, TEXT("%1"), TEXT("%s"), szGroup);
255 wpDone.wpPtsUserMemberListDone.hEnum = wpBegin.wpPtsUserMemberListBegin.hEnum;
256 Worker_DoTask (wtaskPtsUserMemberListDone, &wpDone);
259 // Grab the list of groups which this user owns
261 wpBegin.wpPtsOwnedGroupListBegin.hCell = hCell;
262 wpBegin.wpPtsOwnedGroupListBegin.pszOwner = szFullName;
263 if (Worker_DoTask (wtaskPtsOwnedGroupListBegin, &wpBegin, &status))
267 TCHAR szGroup[ cchNAME ];
270 wpNext.wpPtsOwnedGroupListNext.hEnum = wpBegin.wpPtsOwnedGroupListBegin.hEnum;
271 wpNext.wpPtsOwnedGroupListNext.pszGroup = szGroup;
272 if (!Worker_DoTask (wtaskPtsOwnedGroupListNext, &wpNext))
275 FormatMultiString (&m_mszOwnerOf, FALSE, TEXT("%1"), TEXT("%s"), szGroup);
279 wpDone.wpPtsOwnedGroupListDone.hEnum = wpBegin.wpPtsOwnedGroupListBegin.hEnum;
280 Worker_DoTask (wtaskPtsOwnedGroupListDone, &wpDone);
288 NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusEnd, GetIdentifier(), ((rc) ? 0 : status));
291 if (rc && (!m_us.fHaveKasInfo) && (!status) && kasStatus)
296 if (rc && (!m_us.fHavePtsInfo) && (!status) && ptsStatus)
299 // not fatal; rc remains TRUE
307 void USER::SplitUserName (LPCTSTR pszFull, LPTSTR pszName, LPTSTR pszInstance)
310 lstrcpy (pszName, pszFull);
312 lstrcpy (pszInstance, TEXT(""));
314 if (!USER::IsMachineAccount (pszFull))
316 if (pszName && pszInstance)
319 if ((pchDot = (LPTSTR)lstrchr (pszName, TEXT('.'))) != NULL)
321 *pchDot = TEXT('\0');
322 lstrcpy (pszInstance, &pchDot[1]);
329 BOOL USER::IsMachineAccount (LPCTSTR pszName)
331 for ( ; pszName && *pszName; ++pszName)
333 if (!( (*pszName == TEXT('.')) || ((*pszName >= TEXT('0')) && (*pszName <= TEXT('9'))) ))