diff options
Diffstat (limited to 'swext/mediawiki/src/com/sun/star/wiki/Helper.java')
-rw-r--r-- | swext/mediawiki/src/com/sun/star/wiki/Helper.java | 1057 |
1 files changed, 1057 insertions, 0 deletions
diff --git a/swext/mediawiki/src/com/sun/star/wiki/Helper.java b/swext/mediawiki/src/com/sun/star/wiki/Helper.java new file mode 100644 index 000000000..4a5ec943a --- /dev/null +++ b/swext/mediawiki/src/com/sun/star/wiki/Helper.java @@ -0,0 +1,1057 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +package com.sun.star.wiki; + +import com.sun.star.awt.MessageBoxButtons; +import com.sun.star.awt.MessageBoxType; +import com.sun.star.awt.XControl; +import com.sun.star.awt.XDialog; +import com.sun.star.awt.XMessageBox; +import com.sun.star.awt.XMessageBoxFactory; +import com.sun.star.awt.XWindowPeer; +import com.sun.star.beans.NamedValue; +import com.sun.star.beans.PropertyValue; +import com.sun.star.beans.XPropertySet; +import com.sun.star.container.XContainerQuery; +import com.sun.star.container.XEnumeration; +import com.sun.star.container.XNameAccess; +import com.sun.star.container.XNameContainer; +import com.sun.star.document.XDocumentPropertiesSupplier; +import com.sun.star.document.XDocumentProperties; +import com.sun.star.frame.XModel; +import com.sun.star.frame.XModuleManager; +import com.sun.star.io.XInputStream; +import com.sun.star.io.XOutputStream; +import com.sun.star.lang.XMultiComponentFactory; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.lang.XComponent; +import com.sun.star.system.SystemShellExecuteFlags; +import com.sun.star.system.XSystemShellExecute; +import com.sun.star.task.UrlRecord; +import com.sun.star.task.XInteractionHandler; +import com.sun.star.task.XMasterPasswordHandling; +import com.sun.star.task.XPasswordContainer; +import com.sun.star.uno.AnyConverter; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.uno.XComponentContext; +import com.sun.star.util.XChangesBatch; +import java.net.*; +import java.io.*; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLException; +import javax.swing.text.html.HTMLEditorKit; + + +public class Helper +{ + public static final int GENERALSEND_ERROR = 0; + public static final int NOWIKIFILTER_ERROR = 1; + public static final int NOURLCONNECTION_ERROR = 2; + public static final int WRONGLOGIN_ERROR = 3; + public static final int INVALIDURL_ERROR = 4; + public static final int NOURL_ERROR = 5; + + public static final int DLG_SENDTITLE = 6; + public static final int DLG_WIKIARTICLE = 7; + + public static final int DLG_OK = 9; + + // 11 is reserved + public static final int DLG_ADDBUTTON = 12; + public static final int DLG_EDITBUTTON = 13; + public static final int DLG_SENDBUTTON = 14; + public static final int DLG_REMOVEBUTTON = 15; + + public static final int DLG_EDITSETTING_URLLABEL = 16; + public static final int DLG_EDITSETTING_USERNAMELABEL = 17; + public static final int DLG_EDITSETTING_PASSWORDLABEL = 18; + + public static final int DLG_SENDTOMEDIAWIKI_LABEL1 = 20; + public static final int DLG_SENDTOMEDIAWIKI_LABEL2 = 21; + public static final int DLG_SENDTOMEDIAWIKI_LABEL3 = 22; + public static final int DLG_SENDTOMEDIAWIKI_MINORCHECK = 23; + public static final int DLG_SENDTOMEDIAWIKI_BROWSERCHECK = 24; + public static final int UNKNOWNCERT_ERROR = 25; + public static final int DLG_MEDIAWIKI_TITLE = 26; + public static final int DLG_EDITSETTING_ACCOUNTLINE = 27; + public static final int DLG_EDITSETTING_WIKILINE = 28; + public static final int DLG_EDITSETTING_SAVEBOX = 29; + public static final int CANCELSENDING_ERROR = 30; + public static final int DLG_MEDIAWIKIEXTENSION_STRING = 31; + public static final int DLG_WIKIPAGEEXISTS_LABEL1 = 32; + + private static final int STRINGS_NUM = 33; + + private static final String[] m_pEntryNames = { "GeneralSendError", + "NoWikiFilter", + "NoConnectionToURL", + "WrongLogin", + "InvalidURL", + "NoURL", + "Dlg_SendTitle", + "Dlg_WikiArticle", + "Dlg_No", + "Dlg_OK", + "Dlg_Yes", + null, // reserved + "Dlg_AddButton", + "Dlg_EditButton", + "Dlg_SendButton", + "Dlg_RemoveButton", + "Dlg_EditSetting_UrlLabel", + "Dlg_EditSetting_UsernameLabel", + "Dlg_EditSetting_PasswordLabel", + "Dlg_NewWikiPage_Label1", + "Dlg_SendToMediaWiki_Label1", + "Dlg_SendToMediaWiki_Label2", + "Dlg_SendToMediaWiki_Label3", + "Dlg_SendToMediaWiki_MinorCheck", + "Dlg_SendToMediaWiki_BrowserCheck", + "UnknownCert", + "Dlg_MediaWiki_Title", + "Dlg_EditSetting_AccountLine", + "Dlg_EditSetting_WikiLine", + "Dlg_EditSetting_SaveBox", + "CancelSending", + "Dlg_MediaWiki_Extension_String", + "Dlg_WikiPageExists_Label1" }; + + private static String[] m_pConfigStrings; + + private static boolean m_bAllowConnection = true; + + private static Boolean m_bShowInBrowser = null; + + private static XPasswordContainer m_xPasswordContainer; + private static XInteractionHandler m_xInteractionHandler; + + synchronized protected static String GetLocalizedString( XComponentContext xContext, int nID ) + throws com.sun.star.uno.Exception + { + if ( nID >= STRINGS_NUM ) + throw new com.sun.star.uno.RuntimeException(); + + if ( m_pConfigStrings == null ) + { + XNameAccess xNameAccess = GetConfigNameAccess( xContext, "org.openoffice.Office.Custom.WikiExtension/Strings" ); + + String[] pStrings = new String[STRINGS_NUM]; + for ( int nInd = 0; nInd < STRINGS_NUM; nInd++ ) + if ( m_pEntryNames[nInd] != null ) + pStrings[nInd] = AnyConverter.toString( xNameAccess.getByName( m_pEntryNames[nInd] ) ); + else + pStrings[nInd] = ""; + + m_pConfigStrings = pStrings; + } + + return m_pConfigStrings[nID]; + } + + synchronized protected static void AllowConnection( boolean bAllow ) + { + m_bAllowConnection = bAllow; + // TODO: how to shut down any pending connections? + // hope it doesn't matter? + } + + synchronized protected static boolean IsConnectionAllowed() + { + return m_bAllowConnection; + } + + synchronized protected static boolean GetShowInBrowserByDefault( XComponentContext xContext ) + { + if ( m_bShowInBrowser == null ) + { + try + { + XNameAccess xAccess = Helper.GetConfigNameAccess( xContext, "org.openoffice.Office.Custom.WikiExtension/Settings" ); + m_bShowInBrowser = Boolean.valueOf( AnyConverter.toBoolean( xAccess.getByName( "PreselectShowBrowser" ) ) ); + } + catch( com.sun.star.uno.Exception e ) + { + e.printStackTrace(); + } + } + + return m_bShowInBrowser != null ? m_bShowInBrowser.booleanValue() : false; + } + + synchronized protected static void SetShowInBrowserByDefault( XComponentContext xContext, boolean bValue ) + { + try + { + m_bShowInBrowser = Boolean.valueOf( bValue ); + + XPropertySet xProps = Helper.GetConfigProps( xContext, "org.openoffice.Office.Custom.WikiExtension/Settings" ); + xProps.setPropertyValue( "PreselectShowBrowser", Boolean.valueOf( bValue ) ); + XChangesBatch xBatch = UnoRuntime.queryInterface( XChangesBatch.class, xProps ); + if ( xBatch != null ) + xBatch.commitChanges(); + } + catch( Exception e ) + { + e.printStackTrace(); + } + } + + synchronized protected static XPasswordContainer GetPasswordContainer( XComponentContext xContext ) + throws com.sun.star.uno.Exception + { + if ( m_xPasswordContainer == null && xContext != null ) + { + XMultiComponentFactory xFactory = xContext.getServiceManager(); + if ( xFactory != null ) + m_xPasswordContainer = UnoRuntime.queryInterface( + XPasswordContainer.class, + xFactory.createInstanceWithContext( "com.sun.star.task.PasswordContainer", xContext ) ); + } + + if ( m_xPasswordContainer == null ) + throw new com.sun.star.uno.RuntimeException(); + + return m_xPasswordContainer; + } + + synchronized protected static XInteractionHandler GetInteractionHandler( XComponentContext xContext ) + throws com.sun.star.uno.Exception + { + if ( m_xInteractionHandler == null && xContext != null ) + { + XMultiComponentFactory xFactory = xContext.getServiceManager(); + if ( xFactory != null ) + m_xInteractionHandler = UnoRuntime.queryInterface( + XInteractionHandler.class, + xFactory.createInstanceWithContext( "com.sun.star.task.InteractionHandler", xContext ) ); + } + + if ( m_xInteractionHandler == null ) + throw new com.sun.star.uno.RuntimeException(); + + return m_xInteractionHandler; + } + + protected static String GetMainURL( String sWebPage, String sVURL ) + { + String sResultURL = ""; + try + { + StringReader aReader = new StringReader( sWebPage ); + HTMLEditorKit.Parser aParser = GetHTMLParser(); + EditPageParser aCallback = new EditPageParser(); + + aParser.parse( aReader, aCallback, true ); + sResultURL = aCallback.m_sMainURL; + + if ( !sResultURL.startsWith( "http" ) ) + { + //if the url is only relative then complete it + URL aURL = new URL( sVURL ); + sResultURL = aURL.getProtocol() + "://" + aURL.getHost() + sResultURL; + } + } + catch( Exception e ) + { + e.printStackTrace(); + } + + if ( sResultURL.length() == 0 ) + { + // usually that should not happen + // workaround: try to get index.php from the provided URL + int nIndex = sVURL.indexOf( "index.php" ); + if ( nIndex >= 0 ) + sResultURL = sVURL.substring( 0, nIndex ); + } + + return sResultURL; + } + + protected static String GetRedirectURL( String sWebPage, String sURL ) + { + //scrape the HTML source and find the EditURL + // TODO/LATER: Use parser in future + + int nInd = sWebPage.indexOf( "http-equiv=\"refresh\"" ); + if ( nInd == -1 ) + return ""; + + String sResultURL = ""; + int nContent = sWebPage.indexOf( "content=", nInd ); + if ( nContent > 0 ) + { + int nURL = sWebPage.indexOf( "URL=", nContent ); + if ( nURL > 0 ) + { + int nEndURL = sWebPage.indexOf('"', nURL ); + if ( nEndURL > 0 ) + sResultURL = sWebPage.substring( nURL + 4, nEndURL ); + } + } + + try + { + URL aURL = new URL( sURL ); + if ( !sResultURL.startsWith( aURL.getProtocol() )) + { + //if the url is only relative then complete it + if ( sResultURL.startsWith( "/" ) ) + sResultURL = aURL.getProtocol() + "://" + aURL.getHost() + sResultURL; + else + sResultURL = aURL.getProtocol() + "://" + aURL.getHost() + aURL.getPath() + sResultURL; + } + } + catch ( MalformedURLException ex ) + { + ex.printStackTrace(); + } + + return sResultURL; + + } + + protected static String CreateTempFile( XComponentContext xContext ) + { + String sURL = ""; + try + { + Object oTempFile = xContext.getServiceManager().createInstanceWithContext( "com.sun.star.io.TempFile", xContext ); + XPropertySet xPropertySet = UnoRuntime.queryInterface( XPropertySet.class, oTempFile ); + xPropertySet.setPropertyValue( "RemoveFile", Boolean.FALSE ); + sURL = ( String ) xPropertySet.getPropertyValue( "Uri" ); + + XInputStream xInputStream = UnoRuntime.queryInterface( XInputStream.class, oTempFile ); + xInputStream.closeInput(); + XOutputStream xOutputStream = UnoRuntime.queryInterface( XOutputStream.class, oTempFile ); + xOutputStream.closeOutput(); + } catch ( com.sun.star.uno.Exception ex ) + { + ex.printStackTrace(); + } + return sURL; + } + + private static void close(BufferedReader c) { + if (c == null) return; + try { + c.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + protected static String EachLine( String sURL ) + { + String sText = ""; + BufferedReader aBufReader = null; + try + { + URL aURL = new URL( sURL ); + File aFile = new File( aURL.getFile() ); + InputStreamReader aInputReader = new InputStreamReader( new FileInputStream( aFile ), "UTF-8" ); + aBufReader = new BufferedReader( aInputReader ); + + StringBuffer aBuf = new StringBuffer(); + String sEachLine = aBufReader.readLine(); + + while( sEachLine != null ) + { + aBuf.append( sEachLine ); + aBuf.append( "\n" ); + + sEachLine = aBufReader.readLine(); + } + sText = aBuf.toString(); + + aBufReader.close(); + } catch ( Exception e ) { + e.printStackTrace(); + } + finally { + close(aBufReader); + } + return sText; + } + + protected static String GetDocTitle( XModel xDoc ) + { + XDocumentPropertiesSupplier xDocPropSup = + UnoRuntime.queryInterface(XDocumentPropertiesSupplier.class, xDoc); + XDocumentProperties xDocProps = xDocPropSup.getDocumentProperties(); + return xDocProps.getTitle(); + } + + protected static void SetDocTitle( XModel xDoc, String sTitle ) + { + XDocumentPropertiesSupplier xDocPropSup = + UnoRuntime.queryInterface(XDocumentPropertiesSupplier.class, xDoc); + XDocumentProperties xDocProps = xDocPropSup.getDocumentProperties(); + xDocProps.setTitle(sTitle); + } + + protected static String GetDocServiceName( XComponentContext xContext, XModel xModel ) + { + String aDocServiceName = ""; + if ( xModel != null && xContext != null ) + { + try + { + XMultiComponentFactory xFactory = xContext.getServiceManager(); + if ( xFactory == null ) + throw new com.sun.star.uno.RuntimeException(); + + Object oModuleManager = xFactory.createInstanceWithContext( "com.sun.star.frame.ModuleManager", xContext ); + XModuleManager xModuleManager = UnoRuntime.queryInterface( XModuleManager.class, oModuleManager ); + if ( xModuleManager != null ) + aDocServiceName = xModuleManager.identify( xModel ); + } + catch( java.lang.Exception e ) + { + e.printStackTrace(); + } + } + + return aDocServiceName; + } + + protected static String GetFilterName( XComponentContext xContext, String aTypeName, String aDocServiceName ) + { + if ( xContext == null || aTypeName == null || aTypeName.length() == 0 + || aDocServiceName == null || aDocServiceName.length() == 0 ) { + return ""; + } + String aFilterName = ""; + try + { + Object oFilterFactory = xContext.getServiceManager().createInstanceWithContext( "com.sun.star.document.FilterFactory", xContext ); + XContainerQuery xQuery = UnoRuntime.queryInterface( XContainerQuery.class, oFilterFactory ); + if ( xQuery != null ) + { + NamedValue[] aRequest = new NamedValue[2]; + aRequest[0] = new NamedValue( "Type", aTypeName ); + aRequest[1] = new NamedValue( "DocumentService", aDocServiceName ); + + XEnumeration xSet = xQuery.createSubSetEnumerationByProperties( aRequest ); + if ( xSet != null ) + { + boolean bAcceptable = false; + while ( xSet.hasMoreElements() && !bAcceptable ) + { + PropertyValue[] pFilterProps = ( PropertyValue[] )AnyConverter.toArray( xSet.nextElement() ); + if ( pFilterProps != null ) + { + int nLen = pFilterProps.length; + String aTmpFilter = null; + + for ( int nInd = 0; nInd < nLen; nInd++ ) + { + if ( pFilterProps[nInd].Name.equals( "Name" ) ) + aTmpFilter = AnyConverter.toString( pFilterProps[nInd].Value ); + else if ( pFilterProps[nInd].Name.equals( "Flags" ) ) + bAcceptable = ( ( AnyConverter.toInt( pFilterProps[nInd].Value ) & 2 ) == 2 ); // must allow export + } + + if ( bAcceptable ) + aFilterName = aTmpFilter; + } + } + } + } + } + catch( java.lang.Exception e ) + { + e.printStackTrace(); + } + + return aFilterName; + } + + private static XMultiServiceFactory GetConfigurationProvider( XComponentContext xContext ) + throws com.sun.star.uno.Exception + { + XMultiServiceFactory xConfigurationProvider = null; + if ( xContext != null ) + { + XMultiComponentFactory xFactory = xContext.getServiceManager(); + Object oConfigProvider = xFactory.createInstanceWithContext( "com.sun.star.configuration.ConfigurationProvider", xContext ); + xConfigurationProvider = UnoRuntime.queryInterface( XMultiServiceFactory.class, oConfigProvider ); + } + + if ( xConfigurationProvider == null ) + throw new com.sun.star.uno.RuntimeException(); + + return xConfigurationProvider; + } + + private static Object GetConfig( XComponentContext xContext, String sNodepath, boolean bWriteAccess ) + throws com.sun.star.uno.Exception + { + if ( xContext == null || sNodepath == null ) + throw new com.sun.star.uno.RuntimeException(); + + PropertyValue aVal = new PropertyValue(); + aVal.Name = "nodepath"; + aVal.Value = sNodepath; + Object[] aArgs = new Object[1]; + aArgs[0] = aVal; + + return GetConfigurationProvider( xContext ).createInstanceWithArguments( + ( bWriteAccess ? "com.sun.star.configuration.ConfigurationUpdateAccess" + : "com.sun.star.configuration.ConfigurationAccess" ), + aArgs ); + } + + private static XPropertySet GetConfigProps( XComponentContext xContext, String sNodepath ) + throws com.sun.star.uno.Exception + { + XPropertySet xProps = UnoRuntime.queryInterface( XPropertySet.class, GetConfig( xContext, sNodepath, true ) ); + if ( xProps == null ) + throw new com.sun.star.uno.RuntimeException(); + + return xProps; + } + + + protected static XNameContainer GetConfigNameContainer( XComponentContext xContext, String sNodepath ) + throws com.sun.star.uno.Exception + { + XNameContainer xContainer = UnoRuntime.queryInterface( XNameContainer.class, GetConfig( xContext, sNodepath, true ) ); + if ( xContainer == null ) + throw new com.sun.star.uno.RuntimeException(); + + return xContainer; + } + + protected static XNameAccess GetConfigNameAccess( XComponentContext xContext, String sNodepath ) + throws com.sun.star.uno.Exception + { + XNameAccess xNameAccess = UnoRuntime.queryInterface( XNameAccess.class, GetConfig( xContext, sNodepath, false ) ); + if ( xNameAccess == null ) + throw new com.sun.star.uno.RuntimeException(); + + return xNameAccess; + } + + private static Proxy GetConfigurationProxy(URI uri, XComponentContext xContext) + { + assert(uri != null); + assert(xContext != null); + + try + { + XNameAccess xNameAccess = GetConfigNameAccess( xContext, "org.openoffice.Inet/Settings" ); + + int nProxyType = AnyConverter.toInt( xNameAccess.getByName( "ooInetProxyType" ) ); + if ( nProxyType == 0 ) { + return Proxy.NO_PROXY; + } else { + if ( nProxyType == 1 ) + { + // system proxy + return null; + } + else if ( nProxyType == 2 ) + { + String aProxyNameProp = "ooInetHTTPProxyName"; + String aProxyPortProp = "ooInetHTTPProxyPort"; + + if (uri.getScheme().equals("https")) + { + aProxyNameProp = "ooInetHTTPSProxyName"; + aProxyPortProp = "ooInetHTTPSProxyPort"; + } + + String aProxyName = AnyConverter.toString( xNameAccess.getByName( aProxyNameProp ) ); + + int nProxyPort = 80; + + Object aPortNo = xNameAccess.getByName( aProxyPortProp ); + if ( !AnyConverter.isVoid( aPortNo ) ) + nProxyPort = AnyConverter.toInt( aPortNo ); + + if ( nProxyPort == -1 ) + nProxyPort = 80; + + // TODO: check whether the URL is in the NoProxy list + InetSocketAddress address = new InetSocketAddress(aProxyName, nProxyPort); + return new Proxy(Proxy.Type.HTTP, address); + } + } + } + catch( java.lang.Exception e ) + { + e.printStackTrace(); + } + return null; // invalid configuration value? + } + + protected static void ShowURLInBrowser( XComponentContext xContext, String sURL ) + { + if ( xContext != null && sURL != null && sURL.length() > 0 ) + { + try + { + Object oSystemShell = xContext.getServiceManager().createInstanceWithContext( "com.sun.star.system.SystemShellExecute", xContext ); + XSystemShellExecute xSystemShell = UnoRuntime.queryInterface( XSystemShellExecute.class, oSystemShell ); + if ( xSystemShell != null ) + xSystemShell.execute( sURL, "", SystemShellExecuteFlags.URIS_ONLY ); + } + catch( Exception e ) + { + e.printStackTrace(); + } + } + } + + protected static HttpURLConnection PrepareMethod(String method, URI uri, XComponentContext xContext) + throws WikiCancelException, IOException, SSLException + { + assert(method != null); + assert(uri != null); + assert(xContext != null); + + if (!IsConnectionAllowed()) { + throw new WikiCancelException(); + } + + if (java.net.CookieHandler.getDefault() == null) { + // set a cookie manager so cookies don't get lost + // apparently it's not possible to do that on a per-connection + // basis but only globally? + java.net.CookieHandler.setDefault(new java.net.CookieManager()); + } + + Proxy proxy = GetConfigurationProxy(uri, xContext); + HttpURLConnection conn = null; + if (proxy != null) { + conn = (HttpURLConnection) uri.toURL().openConnection(proxy); + } else { + conn = (HttpURLConnection) uri.toURL().openConnection(); + } + if (uri.getScheme().equals("https") && AllowUnknownCert(xContext, uri.getHost())) + { + // let unknown certificates be accepted + ((HttpsURLConnection) conn).setSSLSocketFactory(new WikiProtocolSocketFactory()); + } + +// enable this to help debug connections where TLS gets in the way +// ((HttpsURLConnection) conn).setSSLSocketFactory(new LoggingProtocolSocketFactory()); + + conn.setRequestMethod(method); + // TODO: is it possible to read the version from the extension metadata? + conn.setRequestProperty("User-Agent", "LibreOffice Wiki Publisher 1.2.0"); + // note: don't connect yet so that the caller can do some further setup + + return conn; + } + + protected static String ReadResponseBody(HttpURLConnection conn) + throws IOException + { + String ret = null; + InputStream stream = conn.getInputStream(); + try { + // there doesn't seem to be an easier way get the content encoding + String type = conn.getContentType(); + String charset = "ISO-8859-1"; // default in RFC2616 + for (String param : type.split(";")) { + if (param.trim().toLowerCase().startsWith("charset=")) { + charset = param.trim().substring("charset=".length()); + break; + } + } + BufferedReader br = + new BufferedReader(new InputStreamReader(stream, charset)); + StringBuilder buf = new StringBuilder(); + String line; + while ((line = br.readLine()) != null) { + buf.append(line); + } + ret = buf.toString(); + } finally { + stream.close(); + } + return ret; + } + + private static class HTMLParse extends HTMLEditorKit + { + + @Override + public HTMLEditorKit.Parser getParser() + { + return super.getParser(); + } + } + + protected static HTMLEditorKit.Parser GetHTMLParser() + { + return new HTMLParse().getParser(); + } + + private static boolean LoginReportsError( String sRespond ) + { + boolean bResult = true; + if ( sRespond != null ) + { + try + { + StringReader aReader = new StringReader( sRespond ); + HTMLEditorKit.Parser aParser = GetHTMLParser(); + EditPageParser aCallback = new EditPageParser(); + + aParser.parse( aReader, aCallback, true ); + bResult = ( aCallback.m_nErrorInd >= 0 ); + } + catch( Exception e ) + { + e.printStackTrace(); + } + } + + return bResult; + } + + private static String GetLoginToken( String sLoginPage ) + { + String sResult = ""; + if ( sLoginPage != null && sLoginPage.length() > 0 ) + { + try + { + StringReader aReader = new StringReader( sLoginPage ); + HTMLEditorKit.Parser aParser = Helper.GetHTMLParser(); + EditPageParser aCallbacks = new EditPageParser(); + + aParser.parse( aReader, aCallbacks, true ); + sResult = aCallbacks.m_sLoginToken; + } + catch( Exception e ) + { + e.printStackTrace(); + } + } + + return sResult; + } + + protected static boolean Login(URI aMainURL, String sWikiUser, String sWikiPass, XComponentContext xContext) + throws java.io.IOException, WikiCancelException, URISyntaxException + { + boolean success = false; + + if ( sWikiUser != null && sWikiPass != null && xContext != null ) + { + String sLoginPage = null; + URI aURI = new URI(aMainURL.toString() + "index.php?title=Special:Userlogin"); + HttpURLConnection connGet = PrepareMethod("GET", aURI, xContext); + connGet.setInstanceFollowRedirects(true); + + connGet.connect(); + int nResultCode = connGet.getResponseCode(); + if (nResultCode == 200) { + sLoginPage = ReadResponseBody(connGet); + } + + if ( sLoginPage != null ) + { + String sLoginToken = GetLoginToken( sLoginPage ); + + URI aPostURI = new URI(aMainURL.toString() + "index.php?title=Special:Userlogin&action=submitlogin"); + + HttpURLConnection connPost = PrepareMethod("POST", aPostURI, xContext); + connPost.setInstanceFollowRedirects(true); + connPost.setDoInput(true); + connPost.setDoOutput(true); + connPost.connect(); + + OutputStreamWriter post = new OutputStreamWriter(connPost.getOutputStream(), "UTF-8"); + try + { + post.write("wpName="); + post.write(URLEncoder.encode(sWikiUser, "UTF-8")); + post.write("&wpRemember=1"); + post.write("&wpPassword="); + post.write(URLEncoder.encode(sWikiPass, "UTF-8")); + + if (sLoginToken.length() > 0) { + post.write("&wpLoginToken="); + post.write(URLEncoder.encode(sLoginToken, "UTF-8")); + } + + String[][] pArgs = GetSpecialArgs( xContext, aMainURL.getHost() ); + if ( pArgs != null ) + for ( int nArgInd = 0; nArgInd < pArgs.length; nArgInd++ ) + if ( pArgs[nArgInd].length == 2 && pArgs[nArgInd][0] != null && pArgs[nArgInd][1] != null ) + { + post.write("&"); + post.write(URLEncoder.encode(pArgs[nArgInd][0], "UTF-8")); + post.write("="); + post.write(URLEncoder.encode(pArgs[nArgInd][0], "UTF-8")); + } + + post.flush(); + } + finally + { + post.close(); + } + + nResultCode = connPost.getResponseCode(); + + if ( nResultCode == 200 ) + { + String sResult = ReadResponseBody(connPost); + if ( !LoginReportsError( sResult ) ) + success = true; + } + } + } + + return success; + } + + protected static String[] GetPasswordsForURLAndUser( XComponentContext xContext, String sURL, String sUserName ) + { + String[] aResult = null; + + try + { + if ( xContext != null && sURL != null && sURL.length() > 0 && sUserName != null && sUserName.length() > 0 ) + { + UrlRecord aRec = GetPasswordContainer( xContext ).findForName( sURL, sUserName, GetInteractionHandler( xContext ) ); + if ( aRec != null && aRec.UserList != null && aRec.UserList.length > 0 + && aRec.UserList[0].UserName.equals( sUserName ) ) + aResult = aRec.UserList[0].Passwords; + } + } + catch( Exception e ) + { + e.printStackTrace(); + } + + return aResult; + } + + protected static boolean PasswordStoringIsAllowed( XComponentContext xContext ) + { + boolean bResult = false; + try + { + XMasterPasswordHandling xMasterHdl = UnoRuntime.queryInterface( XMasterPasswordHandling.class, GetPasswordContainer( xContext ) ); + if ( xMasterHdl != null ) + bResult = xMasterHdl.isPersistentStoringAllowed(); + } + catch( Exception e ) + { + e.printStackTrace(); + } + + return bResult; + } + + protected static void ShowError( XComponentContext xContext, XDialog xDialog, int nTitleID, int nErrorID, String sArg, boolean bQuery ) + { + XWindowPeer xPeer = null; + XControl xControl = UnoRuntime.queryInterface( XControl.class, xDialog ); + if ( xControl != null ) + xPeer = xControl.getPeer(); + ShowError( xContext, xPeer, nTitleID, nErrorID, sArg, bQuery ); + } + + protected static boolean ShowError( XComponentContext xContext, XWindowPeer xParentPeer, int nTitleID, int nErrorID, String sArg, boolean bQuery ) + { + boolean bResult = false; + + if ( xContext != null && nErrorID >= 0 && nErrorID < STRINGS_NUM ) + { + String sError = null; + String sTitle = ""; + + try + { + sError = GetLocalizedString( xContext, nErrorID ); + if ( sError != null && sArg != null ) + sError = sError.replaceAll( "\\$ARG1", sArg ); + + sTitle = GetLocalizedString( xContext, nTitleID ); + } + catch( Exception e ) + { + e.printStackTrace(); + } + + if ( sError == null ) + sError = "Error: " + nErrorID; + + if ( xParentPeer != null ) + { + XMessageBoxFactory xMBFactory = null; + XMessageBox xMB = null; + try + { + XMultiComponentFactory xFactory = xContext.getServiceManager(); + if ( xFactory != null ) + xMBFactory = UnoRuntime.queryInterface( + XMessageBoxFactory.class, + xFactory.createInstanceWithContext( "com.sun.star.awt.Toolkit", xContext ) ); + + if ( xMBFactory != null ) + { + if ( bQuery ) + { + xMB = xMBFactory.createMessageBox( + xParentPeer, + MessageBoxType.QUERYBOX, + MessageBoxButtons.BUTTONS_YES_NO | MessageBoxButtons.DEFAULT_BUTTON_NO, + sTitle, + sError ); + } + else + { + xMB = xMBFactory.createMessageBox( + xParentPeer, + MessageBoxType.ERRORBOX, + MessageBoxButtons.BUTTONS_OK, + sTitle, + sError ); + } + if ( xMB != null ) + { + bResult = MainThreadDialogExecutor.Execute( xContext, xMB ); + } + } + } + catch( Exception e ) + { + e.printStackTrace(); + } + finally + { + if ( xMB != null ) + Dispose( xMB ); + } + } + } + + return bResult; + } + + private static boolean AllowUnknownCert( XComponentContext xContext, String aURL ) + { + try + { + XNameAccess xNameAccess = GetConfigNameAccess( xContext, "org.openoffice.Office.Custom.WikiExtension/SpecialData" ); + if ( xNameAccess.hasByName( aURL ) ) + { + XNameAccess xEntry = UnoRuntime.queryInterface( XNameAccess.class, xNameAccess.getByName( aURL ) ); + if ( xEntry != null && xEntry.hasByName( "AllowUnknownCertificate" ) ) + return AnyConverter.toBoolean( xEntry.getByName( "AllowUnknownCertificate" ) ); + } + } + catch( Exception e ) + { + e.printStackTrace(); + } + + return false; + } + + private static String[][] GetSpecialArgs( XComponentContext xContext, String aURL ) + { + try + { + XNameAccess xNameAccess = GetConfigNameAccess( xContext, "org.openoffice.Office.Custom.WikiExtension/SpecialData" ); + if ( xNameAccess.hasByName( aURL ) ) + { + XNameAccess xEntry = UnoRuntime.queryInterface( XNameAccess.class, xNameAccess.getByName( aURL ) ); + if ( xEntry != null ) + { + XNameAccess xArgs = UnoRuntime.queryInterface( XNameAccess.class, xEntry.getByName( "AdditionalLoginArguments" ) ); + if ( xArgs != null ) + { + String[] pNames = xArgs.getElementNames(); + if ( pNames != null && pNames.length > 0 ) + { + String[][] pResult = new String[pNames.length][2]; + for ( int nInd = 0; nInd < pNames.length; nInd++ ) + { + XNameAccess xArgument = UnoRuntime.queryInterface( XNameAccess.class, xArgs.getByName( pNames[nInd] ) ); + if ( xArgument == null ) + throw new com.sun.star.uno.RuntimeException(); + + pResult[nInd][0] = pNames[nInd]; + pResult[nInd][1] = AnyConverter.toString( xArgument.getByName( "Value" ) ); + } + + return pResult; + } + } + } + } + } + catch( Exception e ) + { + e.printStackTrace(); + } + + return null; + } + + protected static boolean AllowThreadUsage( XComponentContext xContext ) + { + if ( xContext != null ) + { + try + { + XMultiComponentFactory xFactory = xContext.getServiceManager(); + if ( xFactory == null ) + throw new com.sun.star.uno.RuntimeException(); + + Object oCheckCallback = xFactory.createInstanceWithContext( "com.sun.star.awt.AsyncCallback", xContext ); + return ( oCheckCallback != null ); + } + catch( Exception e ) + { + e.printStackTrace(); + } + } + + return false; + } + + public static void Dispose( Object oObject ) + { + if ( oObject != null ) + { + try + { + XComponent xComp = UnoRuntime.queryInterface( XComponent.class, oObject ); + if ( xComp != null ) + xComp.dispose(); + } + catch( Exception e ) + { + e.printStackTrace(); + } + } + } +} + |