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