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 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 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 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 222 synchronized protected static boolean IsConnectionAllowed() 223 { 224 return m_bAllowConnection; 225 } 226 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 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 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 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 299 protected static Protocol GetOwnHttps( int nPort ) 300 { 301 return new Protocol( "https", new WikiProtocolSocketFactory(), ( ( nPort < 0 ) ? 443 : nPort ) ); 302 } 303 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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