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