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_framework.hxx"
26 
27 //_________________________________________________________________________________________________________________
28 //	my own includes
29 //_________________________________________________________________________________________________________________
30 
31 #ifndef __FRAMEWORK_SERVICES_LOGINDIALOG_HXX_
32 #include <services/logindialog.hxx>
33 #endif
34 #include <classes/servicemanager.hxx>
35 #include <macros/generic.hxx>
36 #include <macros/debug.hxx>
37 #include <services.h>
38 
39 //_________________________________________________________________________________________________________________
40 //	interface includes
41 //_________________________________________________________________________________________________________________
42 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
43 #include <com/sun/star/awt/XDialog.hpp>
44 #include <com/sun/star/beans/XPropertySet.hpp>
45 
46 //_________________________________________________________________________________________________________________
47 //	other includes
48 //_________________________________________________________________________________________________________________
49 #include <comphelper/processfactory.hxx>
50 #include <com/sun/star/uno/Reference.hxx>
51 #include <vos/process.hxx>
52 #include <rtl/ustring.hxx>
53 #include <rtl/ustrbuf.hxx>
54 #include <vcl/event.hxx>
55 #include <vcl/svapp.hxx>
56 #include <vcl/wrkwin.hxx>
57 #include <vcl/msgbox.hxx>
58 
59 #include <stdio.h>
60 
61 //_________________________________________________________________________________________________________________
62 //	const
63 //_________________________________________________________________________________________________________________
64 
65 #define	TEMPFILE_ENCODING			RTL_TEXTENCODING_UTF8			// encoding of written temp. ascii file
66 #define	LOGIN_RDB					DECLARE_ASCII("login.rdb")		// name of our own registry file - necessary to create own servicemanager
67 #define SEPERATOR                   "\n"                            // used to separate parts in temp. file
68 
69 #define MINARGUMENTCOUNT            1                               // count of min. required arguments
70 #define ARGUMENTFOUND               0                               // OUString::compareTo returns 0 if searched string match given one
71 #define ARGUMENTLENGTH              3                               // length of fixed part of any argument to detect it easier!
72 
73 #define ARGUMENT_TEMPFILE           DECLARE_ASCII("-f=")            // we support "-f=c:\temp\test.txt" to write dialog data in temp. file
74 #define ARGUMENT_DIALOGPARENT       DECLARE_ASCII("-p=")            // we support "-p=36748322" as window handle of parent for vcl dialog
75 
76 //_________________________________________________________________________________________________________________
77 //	namespace
78 //_________________________________________________________________________________________________________________
79 
80 using namespace ::rtl						;
81 using namespace ::vos						;
82 using namespace ::comphelper				;
83 using namespace ::framework					;
84 using namespace ::com::sun::star::uno		;
85 using namespace ::com::sun::star::lang		;
86 using namespace ::com::sun::star::awt		;
87 using namespace ::com::sun::star::beans		;
88 
89 //_________________________________________________________________________________________________________________
90 //	defines
91 //_________________________________________________________________________________________________________________
92 
93 //_________________________________________________________________________________________________________________
94 //	declarations
95 //_________________________________________________________________________________________________________________
96 
97 /*-************************************************************************************************************//**
98 	@short		implement command application to show login dialog and save his information in temp. file!
99 	@descr		We need this temp. file to share informations between our dialog and different processes, which
100 				can't use vcl directly. Caller of this executable give us the file name as an argument - we save
101 				all informations in it - caller can read it and MUST delete temp. file.
102 				This is necessary for example; to hide the password!
103 
104 	@implements	-
105 
106 	@base		Application
107 *//*-*************************************************************************************************************/
108 class LoginApplication : public Application
109 {
110 	//*************************************************************************************************************
111 	//	public methods
112 	//*************************************************************************************************************
113 	public:
114 		void Main();
115 
116 	//*************************************************************************************************************
117 	//	private methods
118 	//*************************************************************************************************************
119 	private:
120 		void impl_parseCommandline();		// search supported arguments on command line
121 
122 	//*************************************************************************************************************
123 	//	private variables
124 	//*************************************************************************************************************
125 	private:
126         OString     m_sTempFile     ;   // name of temp. file in system notation
127         sal_Int32   m_nParentHandle ;   // a parent window handle for used vcl dialog
128 
129 };	//	class LoginApplication
130 
131 //_________________________________________________________________________________________________________________
132 //	global variables
133 //_________________________________________________________________________________________________________________
134 
135 LoginApplication	gLoginApplication;
136 
137 //_________________________________________________________________________________________________________________
138 //	main
139 //_________________________________________________________________________________________________________________
140 
Main()141 void LoginApplication::Main()
142 {
143 	// Init global uno servicemanager.
144 	ServiceManager aManager;
145 	Reference< XMultiServiceFactory > xServiceManager = aManager.getSharedUNOServiceManager( DECLARE_ASCII("login.rdb") );
146 	LOG_ASSERT( !(xServiceManager.is()==sal_False), "LoginApplication::Main()\nCould not create uno service manager!\n" )
147 
148 	// Parse command line and set found arguments on application member.
149 	impl_parseCommandline();
150 	LOG_ASSERT( !(m_sTempFile.getLength()<1), "LoginApplication::Main()\nWrong or missing argument for temp. file detected!\n" )
151 
152 	// Try to get necessary dialog service.
153 	// By the way - cast it to interface XPropertySet too - we need it later.
154 	// (define SERVICENAME... comes from defines.hxx!)
155 	Reference< XDialog >		xLoginDialog( xServiceManager->createInstance( SERVICENAME_LOGINDIALOG ), UNO_QUERY );
156 	Reference< XPropertySet >	xPropertySet( xLoginDialog												, UNO_QUERY );
157 
158 	// Work with valid ressources only!
159 	// Otherwise do nothing ...
160 	if	(
161 			( xLoginDialog.is()			==	sal_True	)	&&
162 			( xPropertySet.is()			==	sal_True	)	&&
163             ( m_sTempFile.getLength()   >   0           )
164 		)
165 	{
166         // Exist a parent window? YES => set right property.
167         if( m_nParentHandle != 0 )
168         {
169             Any aParentWindow;
170             aParentWindow <<= m_nParentHandle;
171             xPropertySet->setPropertyValue( PROPERTYNAME_PARENTWINDOW, aParentWindow );
172         }
173 
174 		Any aConnectionType;
175 		aConnectionType <<= PROPERTYNAME_HTTPS;
176 		xPropertySet->setPropertyValue( PROPERTYNAME_CONNECTIONTYPE, aConnectionType );
177 
178 		// Show login dialog and get decision of user.
179 		sal_Bool bDecision = (sal_Bool)(xLoginDialog->execute());
180 
181 		OUString	sUserName		;
182 		OUString	sPassword		;
183 		OUString	sServer  		;
184 		OUString	sConnectionType	;
185 		sal_Int32	nPort=0			;	// We need this default if follow "if"-statement "failed"!
186 
187 		// If user say "OK" ... get values from dialog.
188 		// If user say "NO" ... leave it. Then we save empty informations later ...
189 		if( bDecision == sal_True )
190 		{
191 			// defines PROPERTYNAME... comes from logindialog.hxx!
192 			xPropertySet->getPropertyValue( PROPERTYNAME_USERNAME		) >>= sUserName 		;
193 			xPropertySet->getPropertyValue( PROPERTYNAME_PASSWORD		) >>= sPassword 		;
194 			xPropertySet->getPropertyValue( PROPERTYNAME_SERVER			) >>= sServer   		;
195 			xPropertySet->getPropertyValue( PROPERTYNAME_CONNECTIONTYPE	) >>= sConnectionType	;
196 			if( sConnectionType.getLength() > 0 )
197 			{
198 				xPropertySet->getPropertyValue( sConnectionType ) >>= nPort;
199 			}
200 		}
201 
202 		// Build string for output.
203 		// At this point it doesn't matter if information exist or not!
204         // Format of output: "<decision>    [0|1]       SEPERATOR
205         //                    <username>    [string]    SEPERATOR
206         //                    <password>    [string]    SEPERATOR
207         //                    <servername>  [string]    SEPERATOR
208         //                    <port>        [int]       SEPERATOR"
209 		OUStringBuffer sBuffer( 1000 );
210 
211 		if( bDecision == sal_True )
212 		{
213 			sBuffer.appendAscii( "1" );
214 		}
215 		else
216 		{
217 			sBuffer.appendAscii( "0" );
218 		}
219         sBuffer.appendAscii ( SEPERATOR         );
220 		sBuffer.append		( sUserName			);
221         sBuffer.appendAscii ( SEPERATOR         );
222 		sBuffer.append		( sPassword			);
223         sBuffer.appendAscii ( SEPERATOR         );
224 		sBuffer.append		( sServer			);
225         sBuffer.appendAscii ( SEPERATOR         );
226 		sBuffer.append		( sConnectionType	);
227         sBuffer.appendAscii ( SEPERATOR         );
228 		sBuffer.append		( nPort				);
229         sBuffer.appendAscii ( SEPERATOR         );
230 
231 		// Write informations in temp. file.
232 		// If given file name isn't valid ... caller will have a problem!!!
233 		// If fil already exist (That's out of specification!!!) we overwrite it every time.
234 		FILE* pFile = fopen( m_sTempFile.getStr(), "w" );
235 		LOG_ASSERT( !(pFile==NULL), "LoginApplication::Main()\nCould not open file!\n" );
236 		if( pFile != NULL )
237 		{
238 			OString sEncodedOut = U2B_ENC( sBuffer.makeStringAndClear(), TEMPFILE_ENCODING );
239 			fprintf( pFile, sEncodedOut.getStr()	);
240 			fclose ( pFile							);
241 		}
242 	}
243 }
244 
245 //*****************************************************************************************************************
246 //	private method
247 //*****************************************************************************************************************
impl_parseCommandline()248 void LoginApplication::impl_parseCommandline()
249 {
250 	// Use vos::OStartupInfo for access to command line.
251 	// Step over all arguments, search for supported ones and try to get his values.
252 	// Set it on our member. Caller of this method must control set values.
253 	OStartupInfo aInfo;
254 
255 	sal_uInt32	nCount		=	aInfo.getCommandArgCount()	;
256 	sal_uInt32	nArgument	=	0							;
257 	OUString	sArgument									;
258     OUString    sValue                                      ;
259 
260 	// Warn programmer if argument count isn't ok!
261     LOG_ASSERT( !(nCount!=MINARGUMENTCOUNT), "LoginApplication::impl_parseCommandline()\nWrong argument count detected!\n" )
262 
263     // Reset all possible argument variables to defaults if someone is missing.
264     m_sTempFile     = OString();
265     m_nParentHandle = 0        ;
266 
267 	// Step over all arguments ...
268 	for( nArgument=0; nArgument<nCount; ++nArgument )
269 	{
270 		// .. but work with valid ones only!
271 		// Don't check values here. Caller of this method must decide between wrong and allowed values!
272 		aInfo.getCommandArg( nArgument, sArgument );
273 
274 		//_____________________________________________________________________________________________________
275         // Look for "-f=<temp. file name>"
276         if( sArgument.compareTo( ARGUMENT_TEMPFILE, ARGUMENTLENGTH ) == ARGUMENTFOUND )
277 		{
278             sValue      = sArgument.copy( ARGUMENTLENGTH );
279             m_sTempFile = U2B(sValue);
280 		}
281         else
282 		//_____________________________________________________________________________________________________
283         // Look for "-p=<parent window handle>"
284         if( sArgument.compareTo( ARGUMENT_DIALOGPARENT, ARGUMENTLENGTH ) == ARGUMENTFOUND )
285 		{
286             sValue          = sArgument.copy( ARGUMENTLENGTH );
287             m_nParentHandle = sValue.toInt32();
288 		}
289 	}
290 
291     // Parent window handle is an optional argument ... but should be used mostly!
292     // Warn programmer.
293     LOG_ASSERT( !(m_nParentHandle==0), "Login.exe\nYou should give me a parent window handle!\n" )
294 }
295