xref: /AOO41X/main/sal/qa/osl/security/osl_Security.cxx (revision 79aad27f7f29270c03e208e3d687e8e3850af11d)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sal.hxx"
26 
27 //------------------------------------------------------------------------
28 // header file
29 //------------------------------------------------------------------------
30 #include <osl_Security_Const.h>
31 
32 using namespace osl;
33 using namespace rtl;
34 
35 
36 //------------------------------------------------------------------------
37 // helper functions and classes
38 //------------------------------------------------------------------------
39 
40 /** print Boolean value.
41 */
printBool(sal_Bool bOk)42 inline void printBool( sal_Bool bOk )
43 {
44     //t_print("#printBool# " );
45     ( sal_True == bOk ) ? t_print("TRUE!\n" ): t_print("FALSE!\n" );
46 }
47 
48 /** print a UNI_CODE String.
49 */
printUString(const::rtl::OUString & str)50 inline void printUString( const ::rtl::OUString & str )
51 {
52     rtl::OString aString;
53 
54     //t_print("#printUString_u# " );
55     aString = ::rtl::OUStringToOString( str, RTL_TEXTENCODING_ASCII_US );
56     t_print("%s\n", aString.getStr( ) );
57 }
58 
59 
60 //------------------------------------------------------------------------
61 // test code start here
62 //------------------------------------------------------------------------
63 
64 namespace osl_Security
65 {
66 
67     /** testing the method:
68         Security()
69     */
70     class ctors : public CppUnit::TestFixture
71     {
72     public:
73         sal_Bool bRes, bRes1;
74 
ctors_001()75         void ctors_001( )
76         {
77             ::osl::Security aSec;
78 
79             CPPUNIT_ASSERT_MESSAGE( "#test comment#: create a security  its handle should not be NULL.",
80                                     aSec.getHandle( ) != NULL );
81         }
82 
83         CPPUNIT_TEST_SUITE( ctors );
84         CPPUNIT_TEST( ctors_001 );
85         CPPUNIT_TEST_SUITE_END( );
86     }; // class ctors
87 
88 
89     /** testing the methods:
90         inline sal_Bool SAL_CALL logonUser(const ::rtl::OUString& strName,
91                                        const ::rtl::OUString& strPasswd);
92         inline sal_Bool SAL_CALL logonUser(const ::rtl::OUString & strName,
93                                        const ::rtl::OUString & strPasswd,
94                                        const ::rtl::OUString & strFileServer);
95     */
96     class logonUser : public CppUnit::TestFixture
97     {
98     public:
99         sal_Bool bRes;
100 
logonUser_user_pwd()101         void logonUser_user_pwd( )
102         {
103             ::osl::Security aSec;
104             bRes = aSec.logonUser( aLogonUser, aLogonPasswd );
105 
106             CPPUNIT_ASSERT_MESSAGE( "#test comment#: check logon user through forwarded user name, pwd, passed in (UNX), failed in (W32).",
107                                     ( sal_True == bRes )  );
108         }
109 
logonUser_user_pwd_server()110         void logonUser_user_pwd_server( )
111         {
112             ::osl::Security aSec;
113             bRes = aSec.logonUser( aLogonUser, aLogonPasswd, aFileServer );
114 
115             CPPUNIT_ASSERT_MESSAGE( "#test comment#: check logon user through forwarded user name, pwd and server name, failed in (UNX)(W32).",
116                                     ( sal_True == bRes )  );
117         }
118 
119 
120         CPPUNIT_TEST_SUITE( logonUser );
121         if  ( !aStringForward.equals( aNullURL )  && aStringForward.indexOf( (sal_Unicode)' ' ) != -1 && ( aStringForward.indexOf( ( sal_Unicode ) ' ' ) ==  aStringForward.lastIndexOf( ( sal_Unicode ) ' ' ) ) )
122         /// if user name and passwd are forwarded
123         {
124             CPPUNIT_TEST( logonUser_user_pwd );
125         }
126         if  ( !aStringForward.equals( aNullURL )  && aStringForward.indexOf( (sal_Unicode)' ' ) != -1 && ( aStringForward.indexOf( ( sal_Unicode ) ' ' ) !=  aStringForward.lastIndexOf( ( sal_Unicode ) ' ' ) ) )
127         /// if user name and passwd and file server are forwarded
128         {
129             CPPUNIT_TEST( logonUser_user_pwd_server );
130         }
131         CPPUNIT_TEST_SUITE_END( );
132     }; // class logonUser
133 
134 
135     /** testing the method:
136         inline sal_Bool Security::getUserIdent( rtl::OUString& strIdent) const
137     */
138     class getUserIdent : public CppUnit::TestFixture
139     {
140     public:
141         sal_Bool bRes, bRes1;
142 
getUserIdent_001()143         void getUserIdent_001( )
144         {
145             ::osl::Security aSec;
146             ::rtl::OUString strID;
147             bRes = aSec.getUserIdent( strID );
148 
149             CPPUNIT_ASSERT_MESSAGE( "#test comment#: get UserID and compare it with names got at the beginning of the test.",
150                                      ( sal_True == strUserID.equals( strID ) ) && ( sal_True == bRes ));
151         }
152 
153         CPPUNIT_TEST_SUITE( getUserIdent );
154         CPPUNIT_TEST( getUserIdent_001 );
155         CPPUNIT_TEST_SUITE_END( );
156     }; // class getUserIdent
157 
158 
159     /** testing the method:
160         inline sal_Bool SAL_CALL getUserName( ::rtl::OUString& strName) const;
161     */
162     class getUserName : public CppUnit::TestFixture
163     {
164     public:
165         sal_Bool bRes, bRes1;
166 
getUserName_001()167         void getUserName_001( )
168         {
169             ::osl::Security aSec;
170 #ifdef WNT
171             ::rtl::OUString strName( strUserName ), strGetName;
172 #else
173             ::rtl::OUString strName( strUserName ), strGetName;
174 #endif
175             bRes = aSec.getUserName( strGetName );
176 
177             sal_Int32 nPos = -1;
178             if (strName.getLength() > 0)
179             {
180                 nPos = strGetName.indexOf(strName);
181             }
182             CPPUNIT_ASSERT_MESSAGE( "#test comment#: get UserName and compare it with names got at the beginning of the test.",
183                                     ( nPos >= 0 ) && ( sal_True == bRes ) );
184         }
185 
186         CPPUNIT_TEST_SUITE( getUserName );
187         CPPUNIT_TEST( getUserName_001 );
188         CPPUNIT_TEST_SUITE_END( );
189     }; // class getUserName
190 
191 
192 
193     /** testing the method:
194         inline sal_Bool SAL_CALL getHomeDir( ::rtl::OUString& strDirectory) const;
195     */
196     class getHomeDir : public CppUnit::TestFixture
197     {
198     public:
199         sal_Bool bRes, bRes1;
200 
getHomeDir_001()201         void getHomeDir_001( )
202         {
203             ::osl::Security aSec;
204             ::rtl::OUString strHome;
205             bRes = aSec.getHomeDir( strHome );
206 
207             CPPUNIT_ASSERT_MESSAGE( "#test comment#: getHomeDir and compare it with the info we get at the beginning.",
208                                      ( sal_True == strHomeDirectory.equals( strHome ) ) && ( sal_True == bRes ) );
209         }
210 
211         CPPUNIT_TEST_SUITE( getHomeDir );
212         CPPUNIT_TEST( getHomeDir_001 );
213         CPPUNIT_TEST_SUITE_END( );
214     }; // class getHomeDir
215 
216     /** testing the method:
217         inline sal_Bool Security::getConfigDir( rtl::OUString& strDirectory ) const
218     */
219     class getConfigDir : public CppUnit::TestFixture
220     {
221     public:
222         sal_Bool bRes, bRes1;
223 
getConfigDir_001()224         void getConfigDir_001( )
225         {
226             ::osl::Security aSec;
227             ::rtl::OUString strConfig;
228             bRes = aSec.getConfigDir( strConfig );
229 
230             CPPUNIT_ASSERT_MESSAGE( "#test comment#: getHomeDir and compare it with the info we get at the beginning.",
231                                      ( sal_True == strConfigDirectory.equals( strConfig ) ) && ( sal_True == bRes ) );
232         }
233 
234         CPPUNIT_TEST_SUITE( getConfigDir );
235         CPPUNIT_TEST( getConfigDir_001 );
236         CPPUNIT_TEST_SUITE_END( );
237     }; // class getConfigDir
238 
239     /** testing the method:
240         inline sal_Bool SAL_CALL isAdministrator() const;
241     */
242     class isAdministrator : public CppUnit::TestFixture
243     {
244     public:
245         sal_Bool bRes;
246 
isAdministrator_001()247         void isAdministrator_001( )
248         {
249             ::osl::Security aSec;
250             bRes = aSec.isAdministrator(  );
251 
252             CPPUNIT_ASSERT_MESSAGE( "#test comment#: check if the user is administrator at beginning, compare here.",
253                                      bRes == isAdmin );
254         }
255 
256         CPPUNIT_TEST_SUITE( isAdministrator );
257         CPPUNIT_TEST( isAdministrator_001 );
258         CPPUNIT_TEST_SUITE_END( );
259     }; // class isAdministrator
260 
261     /** testing the method:
262         inline oslSecurity getHandle() const;
263     */
264     class getHandle : public CppUnit::TestFixture
265     {
266     public:
267         sal_Bool bRes;
268 
getHandle_001()269         void getHandle_001( )
270         {
271             ::osl::Security aSec;
272             bRes = aSec.isAdministrator( ) == osl_isAdministrator( aSec.getHandle( ) );
273 
274             CPPUNIT_ASSERT_MESSAGE( "#test comment#: use getHandle function to call C API.",
275                                      bRes == sal_True );
276         }
277 
278         CPPUNIT_TEST_SUITE( getHandle );
279         CPPUNIT_TEST( getHandle_001 );
280         CPPUNIT_TEST_SUITE_END( );
281     }; // class getHandle
282 
283 
284     class UserProfile : public CppUnit::TestFixture
285     {
286     public:
287 
loadUserProfile()288         void loadUserProfile( )
289             {
290                 ::osl::Security aSec;
291                 sal_Bool bValue = osl_loadUserProfile(aSec.getHandle());
292 
293                 CPPUNIT_ASSERT_MESSAGE( "empty function.", bValue == sal_False );
294             }
295 
unloadUserProfile()296         void unloadUserProfile( )
297             {
298                 ::osl::Security aSec;
299                 osl_unloadUserProfile(aSec.getHandle());
300                 CPPUNIT_ASSERT_MESSAGE( "empty function.", sal_True );
301             }
302 
303         CPPUNIT_TEST_SUITE( UserProfile );
304         CPPUNIT_TEST( loadUserProfile );
305         CPPUNIT_TEST( unloadUserProfile );
306         CPPUNIT_TEST_SUITE_END( );
307     }; // class UserProfile
308 
309     class loginUserOnFileServer : public CppUnit::TestFixture
310     {
311     public:
312 
loginUserOnFileServer_001()313         void loginUserOnFileServer_001( )
314             {
315                 rtl::OUString suUserName;
316                 rtl::OUString suPassword;
317                 rtl::OUString suFileServer;
318                 ::osl::Security aSec;
319                 oslSecurity pSec = aSec.getHandle();
320 
321                 oslSecurityError erg = osl_loginUserOnFileServer(suUserName.pData, suPassword.pData, suFileServer.pData, &pSec);
322 
323                 CPPUNIT_ASSERT_MESSAGE( "empty function.", erg == osl_Security_E_UserUnknown );
324             }
325 
326         CPPUNIT_TEST_SUITE( loginUserOnFileServer );
327         CPPUNIT_TEST( loginUserOnFileServer_001 );
328         CPPUNIT_TEST_SUITE_END( );
329     }; // class loginUserOnFileServer
330 
331 // -----------------------------------------------------------------------------
332 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Security::ctors, "osl_Security");
333 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Security::logonUser, "osl_Security");
334 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Security::getUserIdent, "osl_Security");
335 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Security::getUserName, "osl_Security");
336 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Security::getHomeDir, "osl_Security");
337 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Security::getConfigDir, "osl_Security");
338 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Security::isAdministrator, "osl_Security");
339 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Security::getHandle, "osl_Security");
340 
341 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Security::UserProfile, "osl_Security");
342 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Security::loginUserOnFileServer, "osl_Security");
343 
344 // -----------------------------------------------------------------------------
345 
346 } // namespace osl_Security
347 
348 
349 // -----------------------------------------------------------------------------
350 
351 // this macro creates an empty function, which will called by the RegisterAllFunctions()
352 // to let the user the possibility to also register some functions by hand.
353 
354 /** to do some initialized work, we replace the NOADDITIONAL macro with the initialize work which
355       get current user name, .
356 */
357 
RegisterAdditionalFunctions(FktRegFuncPtr)358 void RegisterAdditionalFunctions(FktRegFuncPtr)
359 {
360     /// start message
361     t_print("#Initializing ...\n" );
362     t_print("#\n#logonUser function need root/Administrator account to test.\n" );
363     t_print("#You can test by login with root/Administrator, and excute:\n" );
364     t_print("#testshl2 -forward \"username password\" ../../../wntmsci9/bin/Security.dll\n" );
365     t_print("#      where username and password are forwarded account info.\n" );
366     t_print("#if no text forwarded, this function will be skipped.\n" );
367 
368     /// get system information
369 #if ( defined UNX ) || ( defined OS2 )
370     /// some initialization work for UNIX OS
371 
372 
373     struct passwd* pw;
374     CPPUNIT_ASSERT_MESSAGE( "getpwuid: no password entry\n",( pw = getpwuid( getuid() ) ) != NULL );
375 
376     /// get user ID;
377     strUserID = ::rtl::OUString::valueOf( ( sal_Int32 )getuid( ) );
378 
379     /// get user Name;
380     strUserName = ::rtl::OUString::createFromAscii( pw->pw_name );
381 
382     /// get home directory;
383     CPPUNIT_ASSERT_MESSAGE( "#Convert from system path to URL failed.",
384                             ::osl::File::E_None == ::osl::File::getFileURLFromSystemPath( ::rtl::OUString::createFromAscii( pw->pw_dir ), strHomeDirectory ) );
385 
386     /// get config directory;
387     strConfigDirectory = strHomeDirectory.copy(0);
388 
389     /// is administrator;
390     if( !getuid( ) )
391         isAdmin = sal_True;
392 
393 #endif
394 #if defined ( WNT )
395     /// some initialization work for Windows OS
396 
397 
398     /// Get the user name, computer name, user home directory.
399     LPTSTR lpszSystemInfo;      // pointer to system information string
400     DWORD cchBuff = BUFSIZE;    // size of computer or user name
401     TCHAR tchBuffer[BUFSIZE];   // buffer for string
402 
403     lpszSystemInfo = tchBuffer;
404     cchBuff = BUFSIZE;
405     if( GetUserNameA(lpszSystemInfo, &cchBuff) )
406         strUserName = ::rtl::OUString::createFromAscii( lpszSystemInfo );
407 
408     if( GetComputerName(lpszSystemInfo, &cchBuff) )
409         strComputerName = ::rtl::OUString::createFromAscii( lpszSystemInfo );
410 
411     /// Get user home directory.
412     HKEY hRegKey;
413     sal_Char PathA[_MAX_PATH];
414     ::rtl::OUString strHome;
415     if (RegOpenKey(HKEY_CURRENT_USER,  "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders",  &hRegKey) == ERROR_SUCCESS)
416     {
417         LONG lRet, lSize = sizeof(PathA);
418         DWORD Type;
419 
420         lRet = RegQueryValueEx(hRegKey, "AppData", NULL, &Type, ( unsigned char * )PathA, ( unsigned long * )&lSize);
421         if ( ( lRet == ERROR_SUCCESS ) && ( Type == REG_SZ ) &&  ( _access( PathA, 0 ) == 0 ) )
422         {
423             CPPUNIT_ASSERT_MESSAGE( "#Convert from system path to URL failed.",
424                                     ::osl::File::E_None == ::osl::File::getFileURLFromSystemPath( ::rtl::OUString::createFromAscii( PathA ), strConfigDirectory ) );
425         }
426 
427         lRet = RegQueryValueEx(hRegKey, "Personal", NULL, &Type, ( unsigned char * )PathA, ( unsigned long * )&lSize);
428         if ( ( lRet == ERROR_SUCCESS ) && ( Type == REG_SZ ) &&  ( _access( PathA, 0 ) == 0 ) )
429         {
430             CPPUNIT_ASSERT_MESSAGE( "#Convert from system path to URL failed.",
431                                     ::osl::File::E_None == ::osl::File::getFileURLFromSystemPath( ::rtl::OUString::createFromAscii( PathA ), strHomeDirectory ) );
432         }
433 
434         RegCloseKey(hRegKey);
435     }
436 
437 
438     /// Get user Security ID:
439 
440     // Create buffers that may be large enough. If a buffer is too small, the count parameter will be set to the size needed.
441     const DWORD INITIAL_SIZE = 32;
442     DWORD cbSid = 0;
443     DWORD dwSidBufferSize = INITIAL_SIZE;
444     DWORD cchDomainName = 0;
445     DWORD dwDomainBufferSize = INITIAL_SIZE;
446     WCHAR * wszDomainName = NULL;
447     SID_NAME_USE eSidType;
448     DWORD dwErrorCode = 0;
449 
450     LPCWSTR wszAccName = ( LPWSTR ) strUserName.getStr( );
451 
452     // Create buffers for the SID and the domain name.
453     PSID pSid = (PSID) new WIN_BYTE[dwSidBufferSize];
454     CPPUNIT_ASSERT_MESSAGE("# creating SID buffer failed.\n", pSid!= NULL );
455     memset( pSid, 0, dwSidBufferSize);
456 
457     wszDomainName = new WCHAR[dwDomainBufferSize];
458     CPPUNIT_ASSERT_MESSAGE("# creating Domain name buffer failed.\n", wszDomainName != NULL );
459     memset(wszDomainName, 0, dwDomainBufferSize*sizeof(WCHAR));
460 
461     // Obtain the SID for the account name passed.
462     for ( ; ; )
463     {
464         // Set the count variables to the buffer sizes and retrieve the SID.
465         cbSid = dwSidBufferSize;
466         cchDomainName = dwDomainBufferSize;
467         if (LookupAccountNameW(
468                            NULL,            // Computer name. NULL for the local computer
469                            wszAccName,
470                            pSid,          // Pointer to the SID buffer. Use NULL to get the size needed,
471                            &cbSid,          // Size of the SID buffer needed.
472                            wszDomainName,   // wszDomainName,
473                            &cchDomainName,
474                            &eSidType
475                            ))
476         {
477             if (IsValidSid( pSid) == FALSE)
478                 wprintf(L"# The SID for %s is invalid.\n", wszAccName);
479             break;
480         }
481         dwErrorCode = GetLastError();
482 
483         // Check if one of the buffers was too small.
484         if (dwErrorCode == ERROR_INSUFFICIENT_BUFFER)
485         {
486             if (cbSid > dwSidBufferSize)
487             {
488                 // Reallocate memory for the SID buffer.
489                 wprintf(L"# The SID buffer was too small. It will be reallocated.\n");
490                 FreeSid( pSid);
491                 pSid = (PSID) new WIN_BYTE[cbSid];
492                 CPPUNIT_ASSERT_MESSAGE("# re-creating SID buffer failed.\n",  pSid!= NULL );
493                 memset( pSid, 0, cbSid);
494                 dwSidBufferSize = cbSid;
495             }
496             if (cchDomainName > dwDomainBufferSize)
497             {
498                 // Reallocate memory for the domain name buffer.
499                 wprintf(L"# The domain name buffer was too small. It will be reallocated.\n");
500                 delete [] wszDomainName;
501                 wszDomainName = new WCHAR[cchDomainName];
502                 CPPUNIT_ASSERT_MESSAGE("# re-creating domain name buffer failed.\n", wszDomainName!= NULL );
503                 memset(wszDomainName, 0, cchDomainName*sizeof(WCHAR));
504                 dwDomainBufferSize = cchDomainName;
505             }
506         }
507         else
508         {
509             wprintf(L"# LookupAccountNameW failed. GetLastError returned: %d\n", dwErrorCode);
510             break;
511         }
512     }
513 
514     // now got SID successfully, only need to compare SID, so I copied the rest lines from source to convert SID to OUString.
515     PSID_IDENTIFIER_AUTHORITY psia;
516     DWORD dwSubAuthorities;
517     DWORD dwSidRev=SID_REVISION;
518     DWORD dwCounter;
519     DWORD dwSidSize;
520     sal_Char    *Ident;
521 
522     /* obtain SidIdentifierAuthority */
523     psia=GetSidIdentifierAuthority(pSid);
524 
525     /* obtain sidsubauthority count */
526     dwSubAuthorities=*GetSidSubAuthorityCount(pSid)<=5?*GetSidSubAuthorityCount(pSid):5;
527 
528     /* buffer length: S-SID_REVISION- + identifierauthority- + subauthorities- + NULL */
529     Ident=(sal_Char * )malloc(88*sizeof(sal_Char));
530 
531     /* prepare S-SID_REVISION- */
532     dwSidSize=wsprintf(Ident, TEXT("S-%lu-"), dwSidRev);
533 
534     /* prepare SidIdentifierAuthority */
535     if ((psia->Value[0] != 0) || (psia->Value[1] != 0))
536     {
537         dwSidSize+=wsprintf(Ident + strlen(Ident),
538                     TEXT("0x%02hx%02hx%02hx%02hx%02hx%02hx"),
539                     (USHORT)psia->Value[0],
540                     (USHORT)psia->Value[1],
541                     (USHORT)psia->Value[2],
542                     (USHORT)psia->Value[3],
543                     (USHORT)psia->Value[4],
544                     (USHORT)psia->Value[5]);
545     }
546     else
547     {
548         dwSidSize+=wsprintf(Ident + strlen(Ident),
549                     TEXT("%lu"),
550                     (ULONG)(psia->Value[5]      )   +
551                     (ULONG)(psia->Value[4] <<  8)   +
552                     (ULONG)(psia->Value[3] << 16)   +
553                     (ULONG)(psia->Value[2] << 24)   );
554     }
555 
556     /* loop through SidSubAuthorities */
557     for (dwCounter=0; dwCounter < dwSubAuthorities; dwCounter++)
558     {
559         dwSidSize+=wsprintf(Ident + dwSidSize, TEXT("-%lu"),
560                     *GetSidSubAuthority(pSid, dwCounter) );
561     }
562 
563     strUserID = ::rtl::OUString::createFromAscii( Ident );
564 
565     free(Ident);
566     delete pSid;
567     delete [] wszDomainName;
568 
569 
570     /// check if logged in user is administrator:
571 
572     WIN_BOOL b;
573     SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
574     PSID AdministratorsGroup;
575     b = AllocateAndInitializeSid(
576         &NtAuthority,
577         2,
578         SECURITY_BUILTIN_DOMAIN_RID,
579         DOMAIN_ALIAS_RID_ADMINS,
580         0, 0, 0, 0, 0, 0,
581         &AdministratorsGroup);
582     if(b)
583     {
584         if (!CheckTokenMembership( NULL, AdministratorsGroup, &b))
585         {
586              b = FALSE;
587         }
588         FreeSid(AdministratorsGroup);
589     }
590 
591     isAdmin = ( sal_Bool )b;
592 
593 #endif
594 
595     /// print the information.
596     t_print("#\n#Retrived system information is below:\n");
597 
598     t_print("Computer Name:              ");
599     if ( strComputerName == aNullURL )
600         t_print(" Not retrived\n" );
601     else
602         printUString( strComputerName );
603 
604     t_print("Current User Name:          ");
605     if ( strUserName == aNullURL )
606         t_print(" Not retrived\n" );
607     else
608         printUString( strUserName );
609 
610     t_print("Current User Home Directory:");
611     if ( strHomeDirectory == aNullURL )
612         t_print(" Not retrived\n" );
613     else
614         printUString( strHomeDirectory );
615 
616     t_print("Current Config Directory:   ");
617     if ( strConfigDirectory == aNullURL )
618         t_print(" Not retrived\n" );
619     else
620         printUString( strConfigDirectory );
621 
622     t_print("Current UserID:             ");
623     if ( strUserID == aNullURL )
624         t_print(" Not retrived\n" );
625     else
626         printUString( strUserID );
627 
628     t_print("Current User is");
629     if ( isAdmin == sal_False )
630         t_print(" NOT Administrator.\n" );
631     else
632         t_print(" Administrator.\n" );
633 
634 
635     /// get and display forwarded text if available.
636     aStringForward = ::rtl::OUString::createFromAscii( getForwardString() );
637     if ( !aStringForward.equals( aNullURL ) && aStringForward.indexOf( (sal_Unicode)' ' ) != -1 )
638     {
639         sal_Int32 nFirstSpacePoint = aStringForward.indexOf( (sal_Unicode)' ' );;
640         sal_Int32 nLastSpacePoint = aStringForward.lastIndexOf( (sal_Unicode)' ' );;
641         if ( nFirstSpacePoint == nLastSpacePoint )
642         /// only forwarded two parameters, username and password.
643         {
644             aLogonUser = aStringForward.copy( 0, nFirstSpacePoint );
645             t_print("\n#Forwarded username: ");
646             printUString( aLogonUser);
647 
648             aLogonPasswd = aStringForward.copy( nFirstSpacePoint +1, aStringForward.getLength( ) - 1 );
649             t_print("#Forwarded password: ");
650             for ( int i = nFirstSpacePoint +1; i <= aStringForward.getLength( ) - 1; i++, t_print("*") );
651             t_print("\n" );
652         }
653         else
654         /// forwarded three parameters, username, password and fileserver.
655         {
656             aLogonUser = aStringForward.copy( 0, nFirstSpacePoint );
657             t_print("#Forwarded username: ");
658             printUString( aLogonUser);
659 
660             aLogonPasswd = aStringForward.copy( nFirstSpacePoint +1, nLastSpacePoint );
661             t_print("#Forwarded password: ");
662             for ( int i = nFirstSpacePoint +1; i <= nLastSpacePoint; i++, t_print("*") );
663             t_print("\n" );
664 
665             aFileServer = aStringForward.copy( nLastSpacePoint +1, aStringForward.getLength( ) - 1 );
666             t_print("#Forwarded FileServer: ");
667             printUString( aFileServer );
668 
669         }
670     }
671 
672     t_print("#\n#Initialization Done.\n" );
673 
674 }
675