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 package com.sun.star.wiki; 25 26 import com.sun.star.awt.MessageBoxButtons; 27 import com.sun.star.awt.MessageBoxType; 28 import com.sun.star.awt.XControl; 29 import com.sun.star.awt.XControlContainer; 30 import com.sun.star.awt.XDialog; 31 import com.sun.star.awt.XMessageBox; 32 import com.sun.star.awt.XMessageBoxFactory; 33 import com.sun.star.awt.XWindowPeer; 34 import com.sun.star.beans.NamedValue; 35 import com.sun.star.beans.PropertyValue; 36 import com.sun.star.beans.XPropertySet; 37 import com.sun.star.container.XContainerQuery; 38 import com.sun.star.container.XEnumeration; 39 import com.sun.star.container.XNameAccess; 40 import com.sun.star.container.XNameContainer; 41 import com.sun.star.document.XDocumentInfoSupplier; 42 import com.sun.star.frame.XModel; 43 import com.sun.star.frame.XModuleManager; 44 import com.sun.star.io.XInputStream; 45 import com.sun.star.io.XOutputStream; 46 import com.sun.star.io.XSeekable; 47 import com.sun.star.io.XStream; 48 import com.sun.star.lang.XMultiComponentFactory; 49 import com.sun.star.lang.XMultiServiceFactory; 50 import com.sun.star.lang.XComponent; 51 import com.sun.star.system.SystemShellExecuteFlags; 52 import com.sun.star.system.XSystemShellExecute; 53 import com.sun.star.task.UrlRecord; 54 import com.sun.star.task.XInteractionHandler; 55 import com.sun.star.task.XMasterPasswordHandling; 56 import com.sun.star.task.XPasswordContainer; 57 import com.sun.star.uno.AnyConverter; 58 import com.sun.star.uno.UnoRuntime; 59 import com.sun.star.uno.XComponentContext; 60 import com.sun.star.util.XChangesBatch; 61 import java.net.*; 62 import java.io.*; 63 import java.util.Hashtable; 64 import java.util.Random; 65 import javax.net.ssl.SSLException; 66 import javax.swing.text.html.HTMLEditorKit; 67 68 import org.apache.commons.httpclient.HttpClient; 69 import org.apache.commons.httpclient.HostConfiguration; 70 import org.apache.commons.httpclient.HttpMethodBase; 71 import org.apache.commons.httpclient.cookie.CookiePolicy; 72 import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager; 73 import org.apache.commons.httpclient.protocol.Protocol; 74 import org.apache.commons.httpclient.URI; 75 import org.apache.commons.httpclient.methods.GetMethod; 76 import org.apache.commons.httpclient.methods.PostMethod; 77 78 public class Helper 79 { 80 public final static int GENERALSEND_ERROR = 0; 81 public final static int NOWIKIFILTER_ERROR = 1; 82 public final static int NOURLCONNECTION_ERROR = 2; 83 public final static int WRONGLOGIN_ERROR = 3; 84 public final static int INVALIDURL_ERROR = 4; 85 public final static int NOURL_ERROR = 5; 86 87 public final static int DLG_SENDTITLE = 6; 88 public final static int DLG_WIKIARTICLE = 7; 89 public final static int DLG_NO = 8; 90 public final static int DLG_OK = 9; 91 public final static int DLG_YES = 10; 92 // 11 is reserved 93 public final static int DLG_ADDBUTTON = 12; 94 public final static int DLG_EDITBUTTON = 13; 95 public final static int DLG_SENDBUTTON = 14; 96 public final static int DLG_REMOVEBUTTON = 15; 97 98 public final static int DLG_EDITSETTING_URLLABEL = 16; 99 public final static int DLG_EDITSETTING_USERNAMELABEL = 17; 100 public final static int DLG_EDITSETTING_PASSWORDLABEL = 18; 101 public final static int DLG_NEWWIKIPAGE_LABEL1 = 19; 102 public final static int DLG_SENDTOMEDIAWIKI_LABEL1 = 20; 103 public final static int DLG_SENDTOMEDIAWIKI_LABEL2 = 21; 104 public final static int DLG_SENDTOMEDIAWIKI_LABEL3 = 22; 105 public final static int DLG_SENDTOMEDIAWIKI_MINORCHECK = 23; 106 public final static int DLG_SENDTOMEDIAWIKI_BROWSERCHECK = 24; 107 public final static int UNKNOWNCERT_ERROR = 25; 108 public final static int DLG_MEDIAWIKI_TITLE = 26; 109 public final static int DLG_EDITSETTING_ACCOUNTLINE = 27; 110 public final static int DLG_EDITSETTING_WIKILINE = 28; 111 public final static int DLG_EDITSETTING_SAVEBOX = 29; 112 public final static int CANCELSENDING_ERROR = 30; 113 public final static int DLG_MEDIAWIKIEXTENSION_STRING = 31; 114 public final static int DLG_WIKIPAGEEXISTS_LABEL1 = 32; 115 116 public final static int STRINGS_NUM = 33; 117 118 private final static String[] m_pEntryNames = { "GeneralSendError", 119 "NoWikiFilter", 120 "NoConnectionToURL", 121 "WrongLogin", 122 "InvalidURL", 123 "NoURL", 124 "Dlg_SendTitle", 125 "Dlg_WikiArticle", 126 "Dlg_No", 127 "Dlg_OK", 128 "Dlg_Yes", 129 null, // reserved 130 "Dlg_AddButton", 131 "Dlg_EditButton", 132 "Dlg_SendButton", 133 "Dlg_RemoveButton", 134 "Dlg_EditSetting_UrlLabel", 135 "Dlg_EditSetting_UsernameLabel", 136 "Dlg_EditSetting_PasswordLabel", 137 "Dlg_NewWikiPage_Label1", 138 "Dlg_SendToMediaWiki_Label1", 139 "Dlg_SendToMediaWiki_Label2", 140 "Dlg_SendToMediaWiki_Label3", 141 "Dlg_SendToMediaWiki_MinorCheck", 142 "Dlg_SendToMediaWiki_BrowserCheck", 143 "UnknownCert", 144 "Dlg_MediaWiki_Title", 145 "Dlg_EditSetting_AccountLine", 146 "Dlg_EditSetting_WikiLine", 147 "Dlg_EditSetting_SaveBox", 148 "CancelSending", 149 "Dlg_MediaWiki_Extension_String", 150 "Dlg_WikiPageExists_Label1" }; 151 152 private static String[] m_pConfigStrings; 153 154 private static final String sHTMLHeader = "<HTML><HEAD><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" /><TITLE></TITLE></HEAD><BODY>"; 155 private static final String sHTMLFooter = "</BODY></HTML>"; 156 157 private static Random m_aRandom; 158 private static MultiThreadedHttpConnectionManager m_aConnectionManager; 159 private static HttpClient m_aClient; 160 private static boolean m_bAllowConnection = true; 161 private static Hashtable m_aAcceptedUnknownCerts; 162 163 private static Boolean m_bShowInBrowser = null; 164 165 private static XPasswordContainer m_xPasswordContainer; 166 private static XInteractionHandler m_xInteractionHandler; 167 GetLocalizedString( XComponentContext xContext, int nID )168 synchronized protected static String GetLocalizedString( XComponentContext xContext, int nID ) 169 throws com.sun.star.uno.Exception 170 { 171 if ( nID >= STRINGS_NUM ) 172 throw new com.sun.star.uno.RuntimeException(); 173 174 if ( m_pConfigStrings == null ) 175 { 176 XNameAccess xNameAccess = GetConfigNameAccess( xContext, "org.openoffice.Office.Custom.WikiExtension/Strings" ); 177 178 String[] pStrings = new String[STRINGS_NUM]; 179 for ( int nInd = 0; nInd < STRINGS_NUM; nInd++ ) 180 if ( m_pEntryNames[nInd] != null ) 181 pStrings[nInd] = AnyConverter.toString( xNameAccess.getByName( m_pEntryNames[nInd] ) ); 182 else 183 pStrings[nInd] = ""; 184 185 m_pConfigStrings = pStrings; 186 } 187 188 return m_pConfigStrings[nID]; 189 } 190 GetHttpClient()191 synchronized protected static HttpClient GetHttpClient() 192 throws WikiCancelException 193 { 194 if ( !m_bAllowConnection ) 195 throw new WikiCancelException(); 196 197 if ( m_aConnectionManager == null ) 198 m_aConnectionManager = new MultiThreadedHttpConnectionManager(); 199 200 if ( m_aClient == null ) 201 { 202 m_aClient = new HttpClient( m_aConnectionManager ); 203 m_aClient.getParams().setParameter( "http.protocol.cookie-policy", CookiePolicy.BROWSER_COMPATIBILITY ); 204 m_aClient.getParams().setParameter( "http.protocol.single-cookie-header", Boolean.TRUE ); 205 m_aClient.getParams().setParameter( "http.protocol.content-charset", "UTF-8" ); 206 } 207 208 return m_aClient; 209 } 210 AllowConnection( boolean bAllow )211 synchronized protected static void AllowConnection( boolean bAllow ) 212 { 213 m_bAllowConnection = bAllow; 214 if ( !bAllow && m_aConnectionManager != null ) 215 { 216 m_aClient = null; 217 m_aConnectionManager.shutdown(); 218 m_aConnectionManager = null; 219 } 220 } 221 IsConnectionAllowed()222 synchronized protected static boolean IsConnectionAllowed() 223 { 224 return m_bAllowConnection; 225 } 226 GetShowInBrowserByDefault( XComponentContext xContext )227 synchronized protected static boolean GetShowInBrowserByDefault( XComponentContext xContext ) 228 { 229 if ( m_bShowInBrowser == null ) 230 { 231 try 232 { 233 XNameAccess xAccess = Helper.GetConfigNameAccess( xContext, "org.openoffice.Office.Custom.WikiExtension/Settings" ); 234 m_bShowInBrowser = new Boolean( AnyConverter.toBoolean( xAccess.getByName( "PreselectShowBrowser" ) ) ); 235 } 236 catch( com.sun.star.uno.Exception e ) 237 { 238 e.printStackTrace(); 239 } 240 } 241 242 return m_bShowInBrowser.booleanValue(); 243 } 244 SetShowInBrowserByDefault( XComponentContext xContext, boolean bValue )245 synchronized protected static void SetShowInBrowserByDefault( XComponentContext xContext, boolean bValue ) 246 { 247 try 248 { 249 m_bShowInBrowser = new Boolean( bValue ); 250 251 XPropertySet xProps = Helper.GetConfigProps( xContext, "org.openoffice.Office.Custom.WikiExtension/Settings" ); 252 xProps.setPropertyValue( "PreselectShowBrowser", new Boolean( bValue ) ); 253 XChangesBatch xBatch = ( XChangesBatch ) UnoRuntime.queryInterface( XChangesBatch.class, xProps ); 254 if ( xBatch != null ) 255 xBatch.commitChanges(); 256 } 257 catch( Exception e ) 258 { 259 e.printStackTrace(); 260 } 261 } 262 GetPasswordContainer( XComponentContext xContext )263 synchronized protected static XPasswordContainer GetPasswordContainer( XComponentContext xContext ) 264 throws com.sun.star.uno.Exception 265 { 266 if ( m_xPasswordContainer == null && xContext != null ) 267 { 268 XMultiComponentFactory xFactory = xContext.getServiceManager(); 269 if ( xFactory != null ) 270 m_xPasswordContainer = (XPasswordContainer)UnoRuntime.queryInterface( 271 XPasswordContainer.class, 272 xFactory.createInstanceWithContext( "com.sun.star.task.PasswordContainer", xContext ) ); 273 } 274 275 if ( m_xPasswordContainer == null ) 276 throw new com.sun.star.uno.RuntimeException(); 277 278 return m_xPasswordContainer; 279 } 280 GetInteractionHandler( XComponentContext xContext )281 synchronized protected static XInteractionHandler GetInteractionHandler( XComponentContext xContext ) 282 throws com.sun.star.uno.Exception 283 { 284 if ( m_xInteractionHandler == null && xContext != null ) 285 { 286 XMultiComponentFactory xFactory = xContext.getServiceManager(); 287 if ( xFactory != null ) 288 m_xInteractionHandler = ( XInteractionHandler )UnoRuntime.queryInterface( 289 XInteractionHandler.class, 290 xFactory.createInstanceWithContext( "com.sun.star.task.InteractionHandler", xContext ) ); 291 } 292 293 if ( m_xInteractionHandler == null ) 294 throw new com.sun.star.uno.RuntimeException(); 295 296 return m_xInteractionHandler; 297 } 298 GetOwnHttps( int nPort )299 protected static Protocol GetOwnHttps( int nPort ) 300 { 301 return new Protocol( "https", new WikiProtocolSocketFactory(), ( ( nPort < 0 ) ? 443 : nPort ) ); 302 } 303 GetMainURL( String sWebPage, String sVURL )304 protected static String GetMainURL( String sWebPage, String sVURL ) 305 { 306 String sResultURL = ""; 307 try 308 { 309 StringReader aReader = new StringReader( sWebPage ); 310 HTMLEditorKit.Parser aParser = GetHTMLParser(); 311 EditPageParser aCallback = new EditPageParser(); 312 313 aParser.parse( aReader, aCallback, true ); 314 sResultURL = aCallback.m_sMainURL; 315 316 if ( !sResultURL.startsWith( "http" ) ) 317 { 318 // if the url is only relative then complete it 319 URL aURL = new URL( sVURL ); 320 sResultURL = aURL.getProtocol() + "://" + aURL.getHost() + sResultURL; 321 } 322 } 323 catch( Exception e ) 324 { 325 e.printStackTrace(); 326 } 327 328 if ( sResultURL.length() == 0 ) 329 { 330 // usually that should not happen 331 // workaround: try to get index.php from the provided URL 332 int nIndex = sVURL.indexOf( "index.php" ); 333 if ( nIndex >= 0 ) 334 sResultURL = sVURL.substring( 0, nIndex ); 335 } 336 337 return sResultURL; 338 } 339 GetRedirectURL( String sWebPage, String sURL )340 protected static String GetRedirectURL( String sWebPage, String sURL ) 341 { 342 // scrape the HTML source and find the EditURL 343 // TODO/LATER: Use parser in future 344 345 String sResultURL = ""; 346 int nInd = sWebPage.indexOf( "http-equiv=\"refresh\"" ); 347 if ( nInd != -1 ) 348 { 349 int nContent = sWebPage.indexOf( "content=", nInd ); 350 if ( nContent > 0 ) 351 { 352 int nURL = sWebPage.indexOf( "URL=", nContent ); 353 if ( nURL > 0 ) 354 { 355 int nEndURL = sWebPage.indexOf( "\"", nURL ); 356 if ( nEndURL > 0 ) 357 sResultURL = sWebPage.substring( nURL + 4, nEndURL ); 358 } 359 } 360 361 try 362 { 363 URL aURL = new URL( sURL ); 364 if ( !sResultURL.startsWith( aURL.getProtocol() )) 365 { 366 // if the url is only relative then complete it 367 if ( sResultURL.startsWith( "/" ) ) 368 sResultURL = aURL.getProtocol() + "://" + aURL.getHost() + sResultURL; 369 else 370 sResultURL = aURL.getProtocol() + "://" + aURL.getHost() + aURL.getPath() + sResultURL; 371 } 372 } 373 catch ( MalformedURLException ex ) 374 { 375 ex.printStackTrace(); 376 } 377 } 378 379 return sResultURL; 380 381 } 382 SaveHTMLTemp( XComponentContext xContext, String sArticle )383 protected static XInputStream SaveHTMLTemp( XComponentContext xContext, String sArticle ) 384 { 385 XInputStream xResult = null; 386 387 if ( xContext != null ) 388 { 389 try 390 { 391 Object oTempFile = xContext.getServiceManager().createInstanceWithContext( "com.sun.star.io.TempFile", xContext ); 392 XStream xStream = ( XStream ) UnoRuntime.queryInterface( XStream.class, oTempFile ); 393 XSeekable xSeekable = ( XSeekable ) UnoRuntime.queryInterface( XSeekable.class, oTempFile ); 394 if ( xStream != null && xSeekable != null ) 395 { 396 XOutputStream xOutputStream = xStream.getOutputStream(); 397 XInputStream xInputStream = xStream.getInputStream(); 398 if ( xOutputStream != null && xInputStream != null ) 399 { 400 String sHTML = sHTMLHeader.concat( sArticle ); 401 sHTML = sHTML.concat( sHTMLFooter ); 402 xOutputStream.writeBytes( sHTML.getBytes( "UTF-8" ) ); 403 // xOutputStream.closeOutput(); 404 xSeekable.seek( 0 ); 405 406 xResult = xInputStream; 407 } 408 } 409 } 410 catch ( Exception ex ) 411 { 412 ex.printStackTrace(); 413 } 414 } 415 416 return xResult; 417 } 418 419 CreateTempFile( XComponentContext xContext )420 protected static String CreateTempFile( XComponentContext xContext ) 421 { 422 String sURL = ""; 423 try 424 { 425 Object oTempFile = xContext.getServiceManager().createInstanceWithContext( "com.sun.star.io.TempFile", xContext ); 426 XPropertySet xPropertySet = ( XPropertySet ) UnoRuntime.queryInterface( XPropertySet.class, oTempFile ); 427 xPropertySet.setPropertyValue( "RemoveFile", Boolean.FALSE ); 428 sURL = ( String ) xPropertySet.getPropertyValue( "Uri" ); 429 430 XInputStream xInputStream = ( XInputStream ) UnoRuntime.queryInterface( XInputStream.class, oTempFile ); 431 xInputStream.closeInput(); 432 XOutputStream xOutputStream = ( XOutputStream ) UnoRuntime.queryInterface( XOutputStream.class, oTempFile ); 433 xOutputStream.closeOutput(); 434 } catch ( com.sun.star.uno.Exception ex ) 435 { 436 ex.printStackTrace(); 437 } 438 return sURL; 439 } 440 EachLine( String sURL )441 protected static String EachLine( String sURL ) 442 { 443 String sText = ""; 444 try 445 { 446 URL aURL = new URL( sURL ); 447 File aFile = new File( aURL.getFile() ); 448 InputStreamReader aInputReader = new InputStreamReader( new FileInputStream( aFile ), "UTF-8" ); 449 BufferedReader aBufReader = new BufferedReader( aInputReader ); 450 451 StringBuffer aBuf = new StringBuffer(); 452 String sEachLine = aBufReader.readLine(); 453 454 while( sEachLine != null ) 455 { 456 aBuf.append( sEachLine ); 457 aBuf.append( "\n" ); 458 459 sEachLine = aBufReader.readLine(); 460 } 461 sText = aBuf.toString(); 462 } catch ( Exception e ) 463 { 464 e.printStackTrace(); 465 } 466 return sText; 467 } 468 GetDocTitle( XModel xDoc )469 protected static String GetDocTitle( XModel xDoc ) 470 { 471 String sTitle = ""; 472 XDocumentInfoSupplier xDocInfoSup = ( XDocumentInfoSupplier ) UnoRuntime.queryInterface( XDocumentInfoSupplier.class, xDoc ); 473 XPropertySet xPropSet = ( XPropertySet ) UnoRuntime.queryInterface( XPropertySet.class, xDocInfoSup.getDocumentInfo() ); 474 try 475 { 476 sTitle = ( String ) xPropSet.getPropertyValue( "Title" ); 477 } catch ( Exception ex ) 478 { 479 ex.printStackTrace(); 480 } 481 return sTitle; 482 } 483 SetDocTitle( XModel xDoc, String sTitle )484 protected static void SetDocTitle( XModel xDoc, String sTitle ) 485 { 486 XDocumentInfoSupplier xDocInfoSup = ( XDocumentInfoSupplier ) UnoRuntime.queryInterface( XDocumentInfoSupplier.class, xDoc ); 487 if ( xDocInfoSup != null ) 488 { 489 XPropertySet xPropSet = ( XPropertySet ) UnoRuntime.queryInterface( XPropertySet.class, xDocInfoSup.getDocumentInfo() ); 490 if ( xPropSet != null ) 491 { 492 try 493 { 494 xPropSet.setPropertyValue( "Title", sTitle ); 495 } 496 catch ( Exception ex ) 497 { 498 ex.printStackTrace(); 499 } 500 } 501 } 502 } 503 GetDocServiceName( XComponentContext xContext, XModel xModel )504 protected static String GetDocServiceName( XComponentContext xContext, XModel xModel ) 505 { 506 String aDocServiceName = ""; 507 if ( xModel != null && xContext != null ) 508 { 509 try 510 { 511 XMultiComponentFactory xFactory = xContext.getServiceManager(); 512 if ( xFactory == null ) 513 throw new com.sun.star.uno.RuntimeException(); 514 515 Object oModuleManager = xFactory.createInstanceWithContext( "com.sun.star.frame.ModuleManager", xContext ); 516 XModuleManager xModuleManager = ( XModuleManager ) UnoRuntime.queryInterface( XModuleManager.class, oModuleManager ); 517 if ( xModuleManager != null ) 518 aDocServiceName = xModuleManager.identify( xModel ); 519 } 520 catch( java.lang.Exception e ) 521 { 522 e.printStackTrace(); 523 } 524 } 525 526 return aDocServiceName; 527 } 528 GetFilterName( XComponentContext xContext, String aTypeName, String aDocServiceName )529 protected static String GetFilterName( XComponentContext xContext, String aTypeName, String aDocServiceName ) 530 { 531 String aFilterName = ""; 532 if ( xContext != null && aTypeName != null && aTypeName.length() != 0 533 && aDocServiceName != null && aDocServiceName.length() != 0 ) 534 { 535 try 536 { 537 Object oFilterFactory = xContext.getServiceManager().createInstanceWithContext( "com.sun.star.document.FilterFactory", xContext ); 538 XContainerQuery xQuery = ( XContainerQuery )UnoRuntime.queryInterface( XContainerQuery.class, oFilterFactory ); 539 if ( xQuery != null ) 540 { 541 NamedValue[] aRequest = new NamedValue[2]; 542 aRequest[0] = new NamedValue( "Type", aTypeName ); 543 aRequest[1] = new NamedValue( "DocumentService", aDocServiceName ); 544 545 XEnumeration xSet = xQuery.createSubSetEnumerationByProperties( aRequest ); 546 if ( xSet != null ) 547 { 548 boolean bAcceptable = false; 549 while ( xSet.hasMoreElements() && !bAcceptable ) 550 { 551 PropertyValue[] pFilterProps = ( PropertyValue[] )AnyConverter.toArray( xSet.nextElement() ); 552 if ( pFilterProps != null ) 553 { 554 int nLen = pFilterProps.length; 555 String aTmpFilter = null; 556 557 for ( int nInd = 0; nInd < nLen; nInd++ ) 558 { 559 if ( pFilterProps[nInd].Name.equals( "Name" ) ) 560 aTmpFilter = AnyConverter.toString( pFilterProps[nInd].Value ); 561 else if ( pFilterProps[nInd].Name.equals( "Flags" ) ) 562 bAcceptable = ( ( AnyConverter.toInt( pFilterProps[nInd].Value ) & 2 ) == 2 ); // must allow export 563 } 564 565 if ( bAcceptable ) 566 aFilterName = aTmpFilter; 567 } 568 } 569 } 570 } 571 } 572 catch( java.lang.Exception e ) 573 { 574 e.printStackTrace(); 575 } 576 } 577 578 return aFilterName; 579 } 580 GetConfigurationProvider( XComponentContext xContext )581 protected static XMultiServiceFactory GetConfigurationProvider( XComponentContext xContext ) 582 throws com.sun.star.uno.Exception 583 { 584 XMultiServiceFactory xConfigurationProvider = null; 585 if ( xContext != null ) 586 { 587 XMultiComponentFactory xFactory = xContext.getServiceManager(); 588 Object oConfigProvider = xFactory.createInstanceWithContext( "com.sun.star.configuration.ConfigurationProvider", xContext ); 589 xConfigurationProvider = ( XMultiServiceFactory ) UnoRuntime.queryInterface( XMultiServiceFactory.class, oConfigProvider ); 590 } 591 592 if ( xConfigurationProvider == null ) 593 throw new com.sun.star.uno.RuntimeException(); 594 595 return xConfigurationProvider; 596 } 597 GetConfig( XComponentContext xContext, String sNodepath, boolean bWriteAccess )598 protected static Object GetConfig( XComponentContext xContext, String sNodepath, boolean bWriteAccess ) 599 throws com.sun.star.uno.Exception 600 { 601 if ( xContext == null || sNodepath == null ) 602 throw new com.sun.star.uno.RuntimeException(); 603 604 PropertyValue aVal = new PropertyValue(); 605 aVal.Name = "nodepath"; 606 aVal.Value = sNodepath; 607 Object[] aArgs = new Object[1]; 608 aArgs[0] = aVal; 609 610 return GetConfigurationProvider( xContext ).createInstanceWithArguments( 611 ( bWriteAccess ? "com.sun.star.configuration.ConfigurationUpdateAccess" 612 : "com.sun.star.configuration.ConfigurationAccess" ), 613 aArgs ); 614 } 615 GetConfigProps( XComponentContext xContext, String sNodepath )616 protected static XPropertySet GetConfigProps( XComponentContext xContext, String sNodepath ) 617 throws com.sun.star.uno.Exception 618 { 619 XPropertySet xProps = ( XPropertySet ) UnoRuntime.queryInterface( XPropertySet.class, GetConfig( xContext, sNodepath, true ) ); 620 if ( xProps == null ) 621 throw new com.sun.star.uno.RuntimeException(); 622 623 return xProps; 624 } 625 626 GetConfigNameContainer( XComponentContext xContext, String sNodepath )627 protected static XNameContainer GetConfigNameContainer( XComponentContext xContext, String sNodepath ) 628 throws com.sun.star.uno.Exception 629 { 630 XNameContainer xContainer = ( XNameContainer ) UnoRuntime.queryInterface( XNameContainer.class, GetConfig( xContext, sNodepath, true ) ); 631 if ( xContainer == null ) 632 throw new com.sun.star.uno.RuntimeException(); 633 634 return xContainer; 635 } 636 GetConfigNameAccess( XComponentContext xContext, String sNodepath )637 protected static XNameAccess GetConfigNameAccess( XComponentContext xContext, String sNodepath ) 638 throws com.sun.star.uno.Exception 639 { 640 XNameAccess xNameAccess = ( XNameAccess ) UnoRuntime.queryInterface( XNameAccess.class, GetConfig( xContext, sNodepath, false ) ); 641 if ( xNameAccess == null ) 642 throw new com.sun.star.uno.RuntimeException(); 643 644 return xNameAccess; 645 } 646 SetConfigurationProxy( HostConfiguration aHostConfig, XComponentContext xContext )647 protected static void SetConfigurationProxy( HostConfiguration aHostConfig, XComponentContext xContext ) 648 { 649 if ( aHostConfig == null || xContext == null ) 650 return; 651 652 try 653 { 654 XNameAccess xNameAccess = GetConfigNameAccess( xContext, "org.openoffice.Inet/Settings" ); 655 656 int nProxyType = AnyConverter.toInt( xNameAccess.getByName( "ooInetProxyType" ) ); 657 if ( nProxyType == 0 ) 658 aHostConfig.setProxyHost( null ); 659 else 660 { 661 if ( nProxyType == 1 ) 662 { 663 // system proxy 664 } 665 else if ( nProxyType == 2 ) 666 { 667 String aProxyNameProp = "ooInetHTTPProxyName"; 668 String aProxyPortProp = "ooInetHTTPProxyPort"; 669 670 if ( aHostConfig.getProtocol().getScheme().equals( "https" ) ) 671 { 672 aProxyNameProp = "ooInetHTTPSProxyName"; 673 aProxyPortProp = "ooInetHTTPSProxyPort"; 674 } 675 676 String aNoProxyList = AnyConverter.toString( xNameAccess.getByName( "ooInetNoProxy" ) ); 677 String aProxyName = AnyConverter.toString( xNameAccess.getByName( aProxyNameProp ) ); 678 679 int nProxyPort = 80; 680 681 Object aPortNo = xNameAccess.getByName( aProxyPortProp ); 682 if ( !AnyConverter.isVoid( aPortNo ) ) 683 nProxyPort = AnyConverter.toInt( aPortNo ); 684 685 if ( nProxyPort == -1 ) 686 nProxyPort = 80; 687 688 // TODO: check whether the URL is in the NoProxy list 689 aHostConfig.setProxy( aProxyName, nProxyPort ); 690 } 691 } 692 } 693 catch( java.lang.Exception e ) 694 { 695 e.printStackTrace(); 696 } 697 } 698 ShowURLInBrowser( XComponentContext xContext, String sURL )699 protected static void ShowURLInBrowser( XComponentContext xContext, String sURL ) 700 { 701 if ( xContext != null && sURL != null && sURL.length() > 0 ) 702 { 703 try 704 { 705 XSystemShellExecute xSystemShell = com.sun.star.system.SystemShellExecute.create( xContext ); 706 if ( xSystemShell != null ) 707 xSystemShell.execute( sURL, "", SystemShellExecuteFlags.DEFAULTS ); 708 } 709 catch( Exception e ) 710 { 711 e.printStackTrace(); 712 } 713 } 714 } 715 ExecuteMethod( HttpMethodBase aMethod, HostConfiguration aHostConfig, URI aURI, XComponentContext xContext, boolean bSetHost )716 protected static void ExecuteMethod( HttpMethodBase aMethod, HostConfiguration aHostConfig, URI aURI, XComponentContext xContext, boolean bSetHost ) 717 throws WikiCancelException, IOException, SSLException 718 { 719 if ( aMethod != null && aHostConfig != null && aURI != null && xContext != null ) 720 { 721 if ( bSetHost ) 722 { 723 aHostConfig.setHost( aURI ); 724 SetConfigurationProxy( aHostConfig, xContext ); 725 } 726 727 boolean bNoUnknownCertNotification = false; 728 if ( aHostConfig.getProtocol().getScheme().equals( "https" ) 729 && AllowUnknownCert( xContext, aURI.getHost() ) ) 730 { 731 // let unknown certificates be accepted 732 { 733 { 734 aHostConfig.setHost( aHostConfig.getHost(), ( aURI.getPort() < 0 ? 443 : aURI.getPort() ), Helper.GetOwnHttps( aURI.getPort() ) ); 735 Helper.GetHttpClient().executeMethod( aHostConfig, aMethod ); 736 } 737 } 738 } 739 else 740 { 741 Helper.GetHttpClient().executeMethod( aHostConfig, aMethod ); 742 } 743 } 744 } 745 746 static private class HTMLParse extends HTMLEditorKit 747 { 748 749 public HTMLEditorKit.Parser getParser() 750 { 751 return super.getParser(); 752 } 753 } 754 755 static protected HTMLEditorKit.Parser GetHTMLParser() 756 { 757 return new HTMLParse().getParser(); 758 } 759 760 static protected boolean LoginReportsError( String sRespond ) 761 { 762 boolean bResult = true; 763 if ( sRespond != null ) 764 { 765 try 766 { 767 StringReader aReader = new StringReader( sRespond ); 768 HTMLEditorKit.Parser aParser = GetHTMLParser(); 769 EditPageParser aCallback = new EditPageParser(); 770 771 aParser.parse( aReader, aCallback, true ); 772 bResult = ( aCallback.m_nErrorInd >= 0 ); 773 } 774 catch( Exception e ) 775 { 776 e.printStackTrace(); 777 } 778 } 779 780 return bResult; 781 } 782 GetLoginToken( String sLoginPage )783 static protected String GetLoginToken( String sLoginPage ) 784 { 785 String sResult = ""; 786 if ( sLoginPage != null && sLoginPage.length() > 0 ) 787 { 788 try 789 { 790 StringReader aReader = new StringReader( sLoginPage ); 791 HTMLEditorKit.Parser aParser = Helper.GetHTMLParser(); 792 EditPageParser aCallbacks = new EditPageParser(); 793 794 aParser.parse( aReader, aCallbacks, true ); 795 sResult = aCallbacks.m_sLoginToken; 796 } 797 catch( Exception e ) 798 { 799 e.printStackTrace(); 800 } 801 } 802 803 return sResult; 804 } 805 Login( URI aMainURL, String sWikiUser, String sWikiPass, XComponentContext xContext )806 static protected HostConfiguration Login( URI aMainURL, String sWikiUser, String sWikiPass, XComponentContext xContext ) 807 throws com.sun.star.uno.Exception, java.io.IOException, WikiCancelException 808 { 809 HostConfiguration aHostConfig = null; 810 811 if ( sWikiUser != null && sWikiPass != null && xContext != null ) 812 { 813 HostConfiguration aNewHostConfig = new HostConfiguration(); 814 815 URI aURI = new URI( aMainURL.toString() + "index.php?title=Special:Userlogin" ); 816 GetMethod aGetCookie = new GetMethod( aURI.getEscapedPathQuery() ); 817 818 ExecuteMethod( aGetCookie, aNewHostConfig, aURI, xContext, true ); 819 820 int nResultCode = aGetCookie.getStatusCode(); 821 String sLoginPage = null; 822 if ( nResultCode == 200 ) 823 sLoginPage = aGetCookie.getResponseBodyAsString(); 824 825 aGetCookie.releaseConnection(); 826 827 if ( sLoginPage != null ) 828 { 829 String sLoginToken = GetLoginToken( sLoginPage ); 830 831 PostMethod aPost = new PostMethod(); 832 URI aPostURI = new URI( aMainURL.getPath() + "index.php?title=Special:Userlogin&action=submitlogin" ); 833 aPost.setPath( aPostURI.getEscapedPathQuery() ); 834 835 aPost.addParameter( "wpName", sWikiUser ); 836 aPost.addParameter( "wpRemember", "1" ); 837 aPost.addParameter( "wpPassword", sWikiPass ); 838 if ( sLoginToken.length() > 0 ) 839 aPost.addParameter( "wpLoginToken", sLoginToken ); 840 841 String[][] pArgs = GetSpecialArgs( xContext, aMainURL.getHost() ); 842 if ( pArgs != null ) 843 for ( int nArgInd = 0; nArgInd < pArgs.length; nArgInd++ ) 844 if ( pArgs[nArgInd].length == 2 && pArgs[nArgInd][0] != null && pArgs[nArgInd][1] != null ) 845 aPost.addParameter( pArgs[nArgInd][0], pArgs[nArgInd][1] ); 846 847 ExecuteMethod( aPost, aNewHostConfig, aPostURI, xContext, false ); 848 849 nResultCode = aPost.getStatusCode(); 850 851 while( nResultCode >= 301 && nResultCode <= 303 || nResultCode == 307 ) 852 { 853 String sRedirectURL = aPost.getResponseHeader( "Location" ).getValue(); 854 aPost.releaseConnection(); 855 856 aURI = new URI( sRedirectURL ); 857 aPost = new PostMethod(); 858 aPost.setPath( aURI.getEscapedPathQuery() ); 859 ExecuteMethod( aPost, aNewHostConfig, aURI, xContext, false ); 860 861 nResultCode = aPost.getStatusCode(); 862 } 863 864 if ( nResultCode == 200 ) 865 { 866 String sResult = aPost.getResponseBodyAsString(); 867 if ( !LoginReportsError( sResult ) ) 868 aHostConfig = aNewHostConfig; 869 } 870 871 aPost.releaseConnection(); 872 } 873 } 874 875 return aHostConfig; 876 } 877 GetControlFromDialog( XDialog xDialog, String aControlName )878 private static XControl GetControlFromDialog( XDialog xDialog, String aControlName ) 879 { 880 XControl xResult = null; 881 XControlContainer xControlCont = (XControlContainer) UnoRuntime.queryInterface( XControlContainer.class, xDialog ); 882 883 if ( xControlCont != null ) 884 { 885 Object oControl = xControlCont.getControl( aControlName ); 886 xResult = ( XControl ) UnoRuntime.queryInterface( XControl.class, oControl ); 887 } 888 889 return xResult; 890 } 891 GetSubControlPropSet( XDialog xDialog, String aControlName )892 private static XPropertySet GetSubControlPropSet( XDialog xDialog, String aControlName ) 893 { 894 XControl xControl = GetControlFromDialog( xDialog, aControlName ); 895 if ( xControl != null ) 896 return ( XPropertySet ) UnoRuntime.queryInterface( XPropertySet.class, xControl.getModel() ); 897 898 return null; 899 } 900 SetControlPropInDialog( XDialog xDialog, String aControlName, String aPropName, Object aPropValue )901 protected static void SetControlPropInDialog( XDialog xDialog, String aControlName, String aPropName, Object aPropValue ) 902 { 903 if ( xDialog != null && aControlName != null && aPropName != null && aPropValue != null ) 904 { 905 try 906 { 907 XPropertySet xPropSet = GetSubControlPropSet( xDialog, aControlName ); 908 if ( xPropSet != null ) 909 xPropSet.setPropertyValue( aPropName, aPropValue ); 910 } 911 catch ( com.sun.star.uno.Exception e ) 912 { 913 e.printStackTrace(); 914 } 915 } 916 } 917 GetPasswordsForURLAndUser( XComponentContext xContext, String sURL, String sUserName )918 protected static String[] GetPasswordsForURLAndUser( XComponentContext xContext, String sURL, String sUserName ) 919 { 920 String[] aResult = null; 921 922 try 923 { 924 if ( xContext != null && sURL != null && sURL.length() > 0 && sUserName != null && sUserName.length() > 0 ) 925 { 926 UrlRecord aRec = GetPasswordContainer( xContext ).findForName( sURL, sUserName, GetInteractionHandler( xContext ) ); 927 if ( aRec != null && aRec.UserList != null && aRec.UserList.length > 0 928 && aRec.UserList[0].UserName.equals( sUserName ) ) 929 aResult = aRec.UserList[0].Passwords; 930 } 931 } 932 catch( Exception e ) 933 { 934 e.printStackTrace(); 935 } 936 937 return aResult; 938 } 939 PasswordStoringIsAllowed( XComponentContext xContext )940 protected static boolean PasswordStoringIsAllowed( XComponentContext xContext ) 941 { 942 boolean bResult = false; 943 try 944 { 945 XMasterPasswordHandling xMasterHdl = (XMasterPasswordHandling)UnoRuntime.queryInterface( XMasterPasswordHandling.class, GetPasswordContainer( xContext ) ); 946 if ( xMasterHdl != null ) 947 bResult = xMasterHdl.isPersistentStoringAllowed(); 948 } 949 catch( Exception e ) 950 { 951 e.printStackTrace(); 952 } 953 954 return bResult; 955 } 956 ShowError( XComponentContext xContext, XDialog xDialog, int nTitleID, int nErrorID, String sArg, boolean bQuery )957 protected static void ShowError( XComponentContext xContext, XDialog xDialog, int nTitleID, int nErrorID, String sArg, boolean bQuery ) 958 { 959 XWindowPeer xPeer = null; 960 XControl xControl = (XControl)UnoRuntime.queryInterface( XControl.class, xDialog ); 961 if ( xControl != null ) 962 xPeer = xControl.getPeer(); 963 ShowError( xContext, xPeer, nTitleID, nErrorID, sArg, bQuery ); 964 } 965 ShowError( XComponentContext xContext, XWindowPeer xParentPeer, int nTitleID, int nErrorID, String sArg, boolean bQuery )966 protected static boolean ShowError( XComponentContext xContext, XWindowPeer xParentPeer, int nTitleID, int nErrorID, String sArg, boolean bQuery ) 967 { 968 boolean bResult = false; 969 970 if ( xContext != null && nErrorID >= 0 && nErrorID < STRINGS_NUM ) 971 { 972 boolean bShown = false; 973 974 String sError = null; 975 String sTitle = ""; 976 977 try 978 { 979 sError = GetLocalizedString( xContext, nErrorID ); 980 if ( sError != null && sArg != null ) 981 sError = sError.replaceAll( "\\$ARG1", sArg ); 982 983 sTitle = GetLocalizedString( xContext, nTitleID ); 984 } 985 catch( Exception e ) 986 { 987 e.printStackTrace(); 988 } 989 990 if ( sError == null ) 991 sError = "Error: " + nErrorID; 992 993 if ( xParentPeer != null ) 994 { 995 XMessageBoxFactory xMBFactory = null; 996 XMessageBox xMB = null; 997 try 998 { 999 XMultiComponentFactory xFactory = xContext.getServiceManager(); 1000 if ( xFactory != null ) 1001 xMBFactory = (XMessageBoxFactory)UnoRuntime.queryInterface( 1002 XMessageBoxFactory.class, 1003 xFactory.createInstanceWithContext( "com.sun.star.awt.Toolkit", xContext ) ); 1004 1005 if ( xMBFactory != null ) 1006 { 1007 if ( bQuery ) 1008 { 1009 xMB = xMBFactory.createMessageBox( 1010 xParentPeer, 1011 MessageBoxType.QUERYBOX, 1012 MessageBoxButtons.BUTTONS_YES_NO | MessageBoxButtons.DEFAULT_BUTTON_NO, 1013 sTitle, 1014 sError ); 1015 } 1016 else 1017 { 1018 xMB = xMBFactory.createMessageBox( 1019 xParentPeer, 1020 MessageBoxType.ERRORBOX, 1021 MessageBoxButtons.BUTTONS_OK, 1022 sTitle, 1023 sError ); 1024 } 1025 if ( xMB != null ) 1026 { 1027 bResult = MainThreadDialogExecutor.Execute( xContext, xMB ); 1028 bShown = true; 1029 } 1030 } 1031 } 1032 catch( Exception e ) 1033 { 1034 e.printStackTrace(); 1035 } 1036 finally 1037 { 1038 if ( xMB != null ) 1039 Dispose( xMB ); 1040 } 1041 } 1042 } 1043 1044 return bResult; 1045 } 1046 AllowUnknownCert( XComponentContext xContext, String aURL )1047 private static boolean AllowUnknownCert( XComponentContext xContext, String aURL ) 1048 { 1049 try 1050 { 1051 XNameAccess xNameAccess = GetConfigNameAccess( xContext, "org.openoffice.Office.Custom.WikiExtension/SpecialData" ); 1052 if ( xNameAccess.hasByName( aURL ) ) 1053 { 1054 XNameAccess xEntry = (XNameAccess)UnoRuntime.queryInterface( XNameAccess.class, xNameAccess.getByName( aURL ) ); 1055 if ( xEntry != null && xEntry.hasByName( "AllowUnknownCertificate" ) ) 1056 return AnyConverter.toBoolean( xEntry.getByName( "AllowUnknownCertificate" ) ); 1057 } 1058 } 1059 catch( Exception e ) 1060 { 1061 e.printStackTrace(); 1062 } 1063 1064 return false; 1065 } 1066 GetSpecialArgs( XComponentContext xContext, String aURL )1067 private static String[][] GetSpecialArgs( XComponentContext xContext, String aURL ) 1068 { 1069 try 1070 { 1071 XNameAccess xNameAccess = GetConfigNameAccess( xContext, "org.openoffice.Office.Custom.WikiExtension/SpecialData" ); 1072 if ( xNameAccess.hasByName( aURL ) ) 1073 { 1074 XNameAccess xEntry = (XNameAccess)UnoRuntime.queryInterface( XNameAccess.class, xNameAccess.getByName( aURL ) ); 1075 if ( xEntry != null ) 1076 { 1077 XNameAccess xArgs = (XNameAccess)UnoRuntime.queryInterface( XNameAccess.class, xEntry.getByName( "AdditionalLoginArguments" ) ); 1078 if ( xArgs != null ) 1079 { 1080 String[] pNames = xArgs.getElementNames(); 1081 if ( pNames != null && pNames.length > 0 ) 1082 { 1083 String[][] pResult = new String[pNames.length][2]; 1084 for ( int nInd = 0; nInd < pNames.length; nInd++ ) 1085 { 1086 XNameAccess xArgument = (XNameAccess)UnoRuntime.queryInterface( XNameAccess.class, xArgs.getByName( pNames[nInd] ) ); 1087 if ( xArgument == null ) 1088 throw new com.sun.star.uno.RuntimeException(); 1089 1090 pResult[nInd][0] = pNames[nInd]; 1091 pResult[nInd][1] = AnyConverter.toString( xArgument.getByName( "Value" ) ); 1092 } 1093 1094 return pResult; 1095 } 1096 } 1097 } 1098 } 1099 } 1100 catch( Exception e ) 1101 { 1102 e.printStackTrace(); 1103 } 1104 1105 return null; 1106 } 1107 AllowThreadUsage( XComponentContext xContext )1108 protected static boolean AllowThreadUsage( XComponentContext xContext ) 1109 { 1110 if ( xContext != null ) 1111 { 1112 try 1113 { 1114 XMultiComponentFactory xFactory = xContext.getServiceManager(); 1115 if ( xFactory == null ) 1116 throw new com.sun.star.uno.RuntimeException(); 1117 1118 Object oCheckCallback = xFactory.createInstanceWithContext( "com.sun.star.awt.AsyncCallback", xContext ); 1119 return ( oCheckCallback != null ); 1120 } 1121 catch( Exception e ) 1122 { 1123 e.printStackTrace(); 1124 } 1125 } 1126 1127 return false; 1128 } 1129 Dispose( Object oObject )1130 public static void Dispose( Object oObject ) 1131 { 1132 if ( oObject != null ) 1133 { 1134 try 1135 { 1136 XComponent xComp = (XComponent)UnoRuntime.queryInterface( XComponent.class, oObject ); 1137 if ( xComp != null ) 1138 xComp.dispose(); 1139 } 1140 catch( Exception e ) 1141 { 1142 e.printStackTrace(); 1143 } 1144 } 1145 } 1146 } 1147 1148