jbuehler-add-missing-extern-c-patch-20031207
[openafs.git] / src / WINNT / afsusrmgr / general.cpp
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  * 
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  */
9
10 extern "C" {
11 #include <afs/param.h>
12 #include <afs/stds.h>
13 }
14
15 #include "TaAfsUsrMgr.h"
16 #include "usr_col.h"
17 #include "grp_col.h"
18
19
20 /*
21  * ROUTINES ___________________________________________________________________
22  *
23  */
24
25 BOOL fIsValidDate (LPSYSTEMTIME pst)
26 {
27    return (pst->wYear >= 1971) ? TRUE : FALSE;
28 }
29
30
31 void FormatElapsedSeconds (LPTSTR pszText, LONG csec)
32 {
33    LPTSTR pszTarget = pszText;
34
35    if (csec >= csec1WEEK)
36       {
37       if (pszTarget != pszText)
38          *pszTarget++ = TEXT(' ');
39       LPTSTR psz = FormatString (IDS_COUNT_WEEKS, TEXT("%lu"), csec / csec1WEEK);
40       csec %= csec1WEEK;
41       lstrcpy (pszTarget, psz);
42       pszTarget += lstrlen(pszTarget);
43       FreeString (psz);
44       }
45
46    if (csec >= csec1DAY)
47       {
48       if (pszTarget != pszText)
49          *pszTarget++ = TEXT(' ');
50       LPTSTR psz = FormatString (IDS_COUNT_DAYS, TEXT("%lu"), csec / csec1DAY);
51       csec %= csec1DAY;
52       lstrcpy (pszTarget, psz);
53       pszTarget += lstrlen(pszTarget);
54       FreeString (psz);
55       }
56
57    if (csec >= csec1HOUR)
58       {
59       if (pszTarget != pszText)
60          *pszTarget++ = TEXT(' ');
61       LPTSTR psz = FormatString (IDS_COUNT_HOURS, TEXT("%lu"), csec / csec1HOUR);
62       csec %= csec1HOUR;
63       lstrcpy (pszTarget, psz);
64       pszTarget += lstrlen(pszTarget);
65       FreeString (psz);
66       }
67
68    if (csec >= csec1MINUTE)
69       {
70       if (pszTarget != pszText)
71          *pszTarget++ = TEXT(' ');
72       LPTSTR psz = FormatString (IDS_COUNT_MINUTES, TEXT("%lu"), csec / csec1MINUTE);
73       csec %= csec1MINUTE;
74       lstrcpy (pszTarget, psz);
75       pszTarget += lstrlen(pszTarget);
76       FreeString (psz);
77       }
78
79    if (csec || (pszTarget == pszText))
80       {
81       if (pszTarget != pszText)
82          *pszTarget++ = TEXT(' ');
83       LPTSTR psz = FormatString (IDS_COUNT_SECONDS, TEXT("%lu"), csec);
84       lstrcpy (pszTarget, psz);
85       pszTarget += lstrlen(pszTarget);
86       FreeString (psz);
87       }
88
89    *pszTarget = TEXT('\0');
90 }
91
92
93 LPTSTR CreateNameList (LPASIDLIST pAsidList, int idsHeader)
94 {
95    LPTSTR pszOut;
96    if (idsHeader)
97       pszOut = FormatString (TEXT("%1"), TEXT("%m"), idsHeader);
98    else
99       pszOut = NULL;
100
101    for (size_t ii = 0; ii < pAsidList->cEntries; ++ii)
102       {
103       ULONG status;
104       TCHAR szName[ cchRESOURCE ];
105       if (!asc_ObjectNameGet_Fast (g.idClient, g.idCell, pAsidList->aEntries[ ii ].idObject, szName, &status))
106          continue;
107
108       static TCHAR szSeparator[ cchRESOURCE ] = TEXT("");
109       if (szSeparator[0] == TEXT('\0'))
110          {
111          if (!GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_SLIST, szSeparator, cchRESOURCE))
112             lstrcpy (szSeparator, TEXT(","));
113          lstrcat (szSeparator, TEXT(" "));
114          }
115
116       ASOBJPROP Properties;
117       if (asc_ObjectPropertiesGet_Fast (g.idClient, g.idCell, pAsidList->aEntries[ ii ].idObject, &Properties, &status))
118          {
119          if (Properties.Type == TYPE_USER)
120             AppendUID (szName, Properties.u.UserProperties.PTSINFO.uidName);
121          else if (Properties.Type == TYPE_GROUP)
122             AppendUID (szName, Properties.u.GroupProperties.uidName);
123          }
124
125       LPTSTR pszNext;
126       if (!pszOut)
127          pszNext = FormatString (TEXT("%1"), TEXT("%s"), szName);
128       else if (ii == 0)
129          pszNext = FormatString (TEXT("%1%2"), TEXT("%s%s"), pszOut, szName);
130       else // (pszOut && ii)
131          pszNext = FormatString (TEXT("%1%2%3"), TEXT("%s%s%s"), pszOut, szSeparator, szName);
132
133       if (pszOut)
134          FreeString (pszOut);
135       pszOut = pszNext;
136       }
137
138    return pszOut;
139 }
140
141
142 void GetLocalSystemTime (LPSYSTEMTIME pst)
143 {
144    SYSTEMTIME st_gmt;
145    GetSystemTime (&st_gmt);
146
147    FILETIME ft_gmt;
148    SystemTimeToFileTime (&st_gmt, &ft_gmt);
149
150    FILETIME ft_local;
151    FileTimeToLocalFileTime (&ft_gmt, &ft_local);
152
153    FileTimeToSystemTime (&ft_local, pst);
154 }
155
156
157 void FormatServerKey (LPTSTR psz, PBYTE pKey)
158 {
159    for (size_t ii = 0; ii < ENCRYPTIONKEYLENGTH; ++ii)
160       {
161       if (pKey[ii])
162          break;
163       }
164    if (ii == ENCRYPTIONKEYLENGTH)
165       {
166       GetString (psz, IDS_USER_KEY_HIDDEN);
167       return;
168       }
169
170    for (ii = 0; ii < ENCRYPTIONKEYLENGTH; ++ii)
171       {
172           WORD ch1 = (WORD)(pKey[ii]) / 64;
173           WORD ch2 = ((WORD)(pKey[ii]) - (ch1 * 64)) / 8;
174           WORD ch3 = ((WORD)(pKey[ii]) - (ch1 * 64) - (ch2 * 8));
175           wsprintf (psz, TEXT("\\%0d%0d%0d"), ch1, ch2, ch3);
176           psz += 4;
177       }
178
179    *psz = TEXT('\0');
180 }
181
182
183 BOOL ScanServerKey (PBYTE pKey, LPTSTR psz)
184 {
185    for (size_t ich = 0; psz && *psz; )
186       {
187       if (ich == ENCRYPTIONKEYLENGTH)
188          return FALSE;
189
190       if (*psz != '\\')
191          {
192          pKey[ ich++ ] = (BYTE)*psz++;
193          continue;
194          }
195
196       if ((lstrlen(psz) < 4) || (!isdigit(*(1+psz))))
197          return FALSE;
198
199       ++psz; // skip the backslash
200       WORD ch1 = (WORD)((*psz++) - TEXT('0'));
201       WORD ch2 = (WORD)((*psz++) - TEXT('0'));
202       WORD ch3 = (WORD)((*psz++) - TEXT('0'));
203       pKey[ ich++ ] = (BYTE)( ch1 * 64 + ch2 * 8 + ch3 );
204       }
205
206    return (ich == ENCRYPTIONKEYLENGTH) ? TRUE : FALSE;
207 }
208
209
210 int CALLBACK General_ListSortFunction (HWND hList, HLISTITEM hItem1, LPARAM lpItem1, HLISTITEM hItem2, LPARAM lpItem2)
211 {
212    // Find out what kind of sort we're performing. To speed things up,
213    // we'll only gather this information when we start a sort
214    //
215    static TABTYPE tt;
216    static int iCol;
217    static BOOL fReverse;
218    static COLUMNTYPE ct;
219    static GetColumnFunction fnGetColumn = NULL;
220    if (!hItem1 || !hItem2)
221       {
222       switch (GetWindowLong (hList, GWL_ID))
223          {
224          case IDC_USERS_LIST:
225             tt = ttUSERS;
226             break;
227          case IDC_GROUPS_LIST:
228             tt = ttGROUPS;
229             break;
230          default:
231             return 0;
232          }
233
234       size_t iColumn;
235       FastList_GetSortStyle (hList, &iColumn, &fReverse);
236
237       switch (tt)
238          {
239          case ttUSERS:
240             iCol = gr.viewUsr.aColumns[ iColumn ];
241             fnGetColumn = (GetColumnFunction)User_GetColumn;
242             break;
243          case ttGROUPS:
244             iCol = gr.viewGrp.aColumns[ iColumn ];
245             fnGetColumn = (GetColumnFunction)Group_GetColumn;
246             break;
247          }
248
249       if (fnGetColumn)
250          (*fnGetColumn)(g.idCell, iCol, NULL, NULL, NULL, &ct);
251       return 0;
252       }
253
254    if (!fnGetColumn)
255       return 0;
256
257    // Perform the sort
258    //
259    TCHAR szTextA[ 1024 ];
260    TCHAR szTextB[ 1024 ];
261    FILETIME ftTextA = { 0, 0 };
262    FILETIME ftTextB = { 0, 0 };
263
264    ASID idItem1 = (ASID)( (fReverse) ? lpItem2 : lpItem1 );
265    ASID idItem2 = (ASID)( (fReverse) ? lpItem1 : lpItem2 );
266
267    switch (ct)
268       {
269       case ctALPHABETIC:
270          (*fnGetColumn)(idItem1, iCol, szTextA, NULL, NULL, NULL);
271          (*fnGetColumn)(idItem2, iCol, szTextB, NULL, NULL, NULL);
272          return lstrcmpi (szTextA, szTextB);
273
274       case ctNUMERIC:
275          (*fnGetColumn)(idItem1, iCol, szTextA, NULL, NULL, NULL);
276          (*fnGetColumn)(idItem2, iCol, szTextB, NULL, NULL, NULL);
277          return atol(szTextA) - atol(szTextB);
278
279       case ctDATE:
280          SYSTEMTIME stTextA;
281          SYSTEMTIME stTextB;
282          (*fnGetColumn)(idItem1, iCol, NULL, &stTextA, NULL, NULL);
283          (*fnGetColumn)(idItem2, iCol, NULL, &stTextB, NULL, NULL);
284          SystemTimeToFileTime (&stTextA, &ftTextA);
285          SystemTimeToFileTime (&stTextB, &ftTextB);
286          return CompareFileTime (&ftTextA, &ftTextB);
287
288       case ctELAPSED:
289          LONG csecTextA;
290          LONG csecTextB;
291          (*fnGetColumn)(idItem1, iCol, NULL, NULL, &csecTextA, NULL);
292          (*fnGetColumn)(idItem2, iCol, NULL, NULL, &csecTextB, NULL);
293          return csecTextA - csecTextB;
294       }
295
296    return 0;
297 }
298
299
300 void AppendUID (LPTSTR psz, int uid)
301 {
302    if (uid != 0)
303       wsprintf (&psz[ lstrlen(psz) ], TEXT(" (%ld)"), uid);
304 }
305
306
307 LPTSTR GetEditText (HWND hEdit)
308 {
309    size_t cch = 1 + SendMessage (hEdit, EM_LINELENGTH, 0, 0);
310    LPTSTR psz = AllocateString (cch);
311    cch = GetWindowText (hEdit, psz, cch);
312    psz[cch] = TEXT('\0');
313    return psz;
314 }
315
316
317 BOOL fIsMachineAccount (ASID idAccount)
318 {
319    TCHAR szName[ cchNAME ];
320    if (!asc_ObjectNameGet_Fast (g.idClient, g.idCell, idAccount, szName))
321       return FALSE;
322    return fIsMachineAccount (szName);
323 }
324
325
326 BOOL fIsMachineAccount (LPTSTR pszName)
327 {
328    for ( ; pszName && *pszName; ++pszName)
329       {
330       if (!( (*pszName == TEXT('.')) || ((*pszName >= TEXT('0')) && (*pszName <= TEXT('9'))) ))
331          return FALSE;
332       }
333
334    return TRUE;
335 }
336