Windows: remove trailing whitespace
[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    size_t ii;
160    for (ii = 0; ii < ENCRYPTIONKEYLENGTH; ++ii)
161       {
162       if (pKey[ii])
163          break;
164       }
165    if (ii == ENCRYPTIONKEYLENGTH)
166       {
167       GetString (psz, IDS_USER_KEY_HIDDEN);
168       return;
169       }
170
171    for (ii = 0; ii < ENCRYPTIONKEYLENGTH; ++ii)
172       {
173           WORD ch1 = (WORD)(pKey[ii]) / 64;
174           WORD ch2 = ((WORD)(pKey[ii]) - (ch1 * 64)) / 8;
175           WORD ch3 = ((WORD)(pKey[ii]) - (ch1 * 64) - (ch2 * 8));
176           wsprintf (psz, TEXT("\\%0d%0d%0d"), ch1, ch2, ch3);
177           psz += 4;
178       }
179
180    *psz = TEXT('\0');
181 }
182
183
184 BOOL ScanServerKey (PBYTE pKey, LPTSTR psz)
185 {
186    size_t ich;
187    for (ich = 0; psz && *psz; )
188       {
189       if (ich == ENCRYPTIONKEYLENGTH)
190          return FALSE;
191
192       if (*psz != '\\')
193          {
194          pKey[ ich++ ] = (BYTE)*psz++;
195          continue;
196          }
197
198       if ((lstrlen(psz) < 4) || (!isdigit(*(1+psz))))
199          return FALSE;
200
201       ++psz; // skip the backslash
202       WORD ch1 = (WORD)((*psz++) - TEXT('0'));
203       WORD ch2 = (WORD)((*psz++) - TEXT('0'));
204       WORD ch3 = (WORD)((*psz++) - TEXT('0'));
205       pKey[ ich++ ] = (BYTE)( ch1 * 64 + ch2 * 8 + ch3 );
206       }
207
208    return (ich == ENCRYPTIONKEYLENGTH) ? TRUE : FALSE;
209 }
210
211
212 int CALLBACK General_ListSortFunction (HWND hList, HLISTITEM hItem1, LPARAM lpItem1, HLISTITEM hItem2, LPARAM lpItem2)
213 {
214    // Find out what kind of sort we're performing. To speed things up,
215    // we'll only gather this information when we start a sort
216    //
217    static TABTYPE tt;
218    static LONG iCol;
219    static BOOL fReverse;
220    static COLUMNTYPE ct;
221    static GetColumnFunction fnGetColumn = NULL;
222    if (!hItem1 || !hItem2)
223       {
224       switch (GetWindowLong (hList, GWL_ID))
225          {
226          case IDC_USERS_LIST:
227             tt = ttUSERS;
228             break;
229          case IDC_GROUPS_LIST:
230             tt = ttGROUPS;
231             break;
232          default:
233             return 0;
234          }
235
236       size_t iColumn;
237       FastList_GetSortStyle (hList, &iColumn, &fReverse);
238
239       switch (tt)
240          {
241          case ttUSERS:
242             iCol = (LONG) gr.viewUsr.aColumns[ iColumn ];
243             fnGetColumn = (GetColumnFunction)User_GetColumn;
244             break;
245          case ttGROUPS:
246             iCol = (LONG) gr.viewGrp.aColumns[ iColumn ];
247             fnGetColumn = (GetColumnFunction)Group_GetColumn;
248             break;
249          }
250
251       if (fnGetColumn)
252          (*fnGetColumn)(g.idCell, iCol, NULL, NULL, NULL, &ct);
253       return 0;
254       }
255
256    if (!fnGetColumn)
257       return 0;
258
259    // Perform the sort
260    //
261    TCHAR szTextA[ 1024 ];
262    TCHAR szTextB[ 1024 ];
263    FILETIME ftTextA = { 0, 0 };
264    FILETIME ftTextB = { 0, 0 };
265
266    ASID idItem1 = (ASID)( (fReverse) ? lpItem2 : lpItem1 );
267    ASID idItem2 = (ASID)( (fReverse) ? lpItem1 : lpItem2 );
268
269    switch (ct)
270       {
271       case ctALPHABETIC:
272          (*fnGetColumn)(idItem1, iCol, szTextA, NULL, NULL, NULL);
273          (*fnGetColumn)(idItem2, iCol, szTextB, NULL, NULL, NULL);
274          return lstrcmpi (szTextA, szTextB);
275
276       case ctNUMERIC:
277          (*fnGetColumn)(idItem1, iCol, szTextA, NULL, NULL, NULL);
278          (*fnGetColumn)(idItem2, iCol, szTextB, NULL, NULL, NULL);
279          return atol(szTextA) - atol(szTextB);
280
281       case ctDATE:
282          SYSTEMTIME stTextA;
283          SYSTEMTIME stTextB;
284          (*fnGetColumn)(idItem1, iCol, NULL, &stTextA, NULL, NULL);
285          (*fnGetColumn)(idItem2, iCol, NULL, &stTextB, NULL, NULL);
286          SystemTimeToFileTime (&stTextA, &ftTextA);
287          SystemTimeToFileTime (&stTextB, &ftTextB);
288          return CompareFileTime (&ftTextA, &ftTextB);
289
290       case ctELAPSED:
291          LONG csecTextA;
292          LONG csecTextB;
293          (*fnGetColumn)(idItem1, iCol, NULL, NULL, &csecTextA, NULL);
294          (*fnGetColumn)(idItem2, iCol, NULL, NULL, &csecTextB, NULL);
295          return csecTextA - csecTextB;
296       }
297
298    return 0;
299 }
300
301
302 void AppendUID (LPTSTR psz, int uid)
303 {
304    if (uid != 0)
305       wsprintf (&psz[ lstrlen(psz) ], TEXT(" (%ld)"), uid);
306 }
307
308
309 LPTSTR GetEditText (HWND hEdit)
310 {
311    size_t cch = 1 + SendMessage (hEdit, EM_LINELENGTH, 0, 0);
312    LPTSTR psz = AllocateString (cch);
313    cch = GetWindowText (hEdit, psz, (int)cch);
314    psz[cch] = TEXT('\0');
315    return psz;
316 }
317
318
319 BOOL fIsMachineAccount (ASID idAccount)
320 {
321    TCHAR szName[ cchNAME ];
322    if (!asc_ObjectNameGet_Fast (g.idClient, g.idCell, idAccount, szName))
323       return FALSE;
324    return fIsMachineAccount (szName);
325 }
326
327
328 BOOL fIsMachineAccount (LPTSTR pszName)
329 {
330    for ( ; pszName && *pszName; ++pszName)
331       {
332       if (!( (*pszName == TEXT('.')) || ((*pszName >= TEXT('0')) && (*pszName <= TEXT('9'))) ))
333          return FALSE;
334       }
335
336    return TRUE;
337 }
338