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>
19 #include <WINNT/afsclass.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(""));
43 m_fStatusOutOfDate
= TRUE
;
46 memset(&m_us
, 0, sizeof(m_us
));
55 FreeString (m_mszOwnerOf
);
56 FreeString (m_mszMemberOf
);
60 void USER::SendDeleteNotifications (void)
62 NOTIFYCALLBACK::SendNotificationToAll (evtDestroy
, GetIdentifier());
66 void USER::Close (void)
72 LPIDENT
USER::GetIdentifier (void)
74 if (m_lpiThis
== NULL
)
76 if ((m_lpiThis
= IDENT::FindIdent (this)) == NULL
)
77 m_lpiThis
= New2 (IDENT
,(this));
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
)
100 lstrcpy (pszPrincipal
, m_szPrincipal
);
102 lstrcpy (pszInstance
, m_szInstance
);
106 BOOL
USER::GetStatus (LPUSERSTATUS lpus
, BOOL fNotify
, ULONG
*pStatus
)
108 if (!RefreshStatus (fNotify
, pStatus
))
111 memcpy (lpus
, &m_us
, sizeof(USERSTATUS
));
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
))
132 *ppmsz
= CloneMultiString (m_mszOwnerOf
);
137 BOOL
USER::GetMemberOf (LPTSTR
*ppmsz
, ULONG
*pStatus
)
139 if (!RefreshStatus (TRUE
, pStatus
))
141 *ppmsz
= CloneMultiString (m_mszMemberOf
);
146 BOOL
USER::RefreshStatus (BOOL fNotify
, ULONG
*pStatus
)
153 if (m_fStatusOutOfDate
)
155 m_fStatusOutOfDate
= FALSE
;
158 NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusBegin
, GetIdentifier());
160 memset (&m_us
, 0x00, sizeof(m_us
));
162 FreeString (m_mszOwnerOf
);
165 FreeString (m_mszMemberOf
);
166 m_mszMemberOf
= NULL
;
168 TCHAR szFullName
[ cchNAME
];
169 AfsClass_GenFullUserName (szFullName
, m_szPrincipal
, m_szInstance
);
172 if ((lpCell
= OpenCell (&status
)) == NULL
)
177 if ((hCell
= lpCell
->GetCellObject (&status
)) == NULL
)
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
))
248 TCHAR szGroup
[ cchNAME
];
251 wpNext
.wpPtsUserMemberListNext
.hEnum
= wpBegin
.wpPtsUserMemberListBegin
.hEnum
;
252 wpNext
.wpPtsUserMemberListNext
.pszGroup
= szGroup
;
253 if (!Worker_DoTask (wtaskPtsUserMemberListNext
, &wpNext
))
256 FormatMultiString (&m_mszMemberOf
, FALSE
, TEXT("%1"), TEXT("%s"), szGroup
);
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
))
272 TCHAR szGroup
[ cchNAME
];
275 wpNext
.wpPtsOwnedGroupListNext
.hEnum
= wpBegin
.wpPtsOwnedGroupListBegin
.hEnum
;
276 wpNext
.wpPtsOwnedGroupListNext
.pszGroup
= szGroup
;
277 if (!Worker_DoTask (wtaskPtsOwnedGroupListNext
, &wpNext
))
280 FormatMultiString (&m_mszOwnerOf
, FALSE
, TEXT("%1"), TEXT("%s"), szGroup
);
284 wpDone
.wpPtsOwnedGroupListDone
.hEnum
= wpBegin
.wpPtsOwnedGroupListBegin
.hEnum
;
285 Worker_DoTask (wtaskPtsOwnedGroupListDone
, &wpDone
);
293 NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusEnd
, GetIdentifier(), ((rc
) ? 0 : status
));
296 if (rc
&& (!m_us
.fHaveKasInfo
) && (!status
) && kasStatus
)
301 if (rc
&& (!m_us
.fHavePtsInfo
) && (!status
) && ptsStatus
)
304 // not fatal; rc remains TRUE
312 void USER::SplitUserName (LPCTSTR pszFull
, LPTSTR pszName
, LPTSTR pszInstance
)
315 lstrcpy (pszName
, pszFull
);
317 lstrcpy (pszInstance
, TEXT(""));
319 if (!USER::IsMachineAccount (pszFull
))
321 if (pszName
&& pszInstance
)
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'))) ))