X-Git-Url: http://git.phpeclipse.com diff --git a/archive/net.sourceforge.phpeclipse.wiki/src/net/sourceforge/phpeclipse/wiki/actions/mediawiki/connect/MediaWikiConnector.java b/archive/net.sourceforge.phpeclipse.wiki/src/net/sourceforge/phpeclipse/wiki/actions/mediawiki/connect/MediaWikiConnector.java index 4c1abb6..efc1fc9 100644 --- a/archive/net.sourceforge.phpeclipse.wiki/src/net/sourceforge/phpeclipse/wiki/actions/mediawiki/connect/MediaWikiConnector.java +++ b/archive/net.sourceforge.phpeclipse.wiki/src/net/sourceforge/phpeclipse/wiki/actions/mediawiki/connect/MediaWikiConnector.java @@ -15,13 +15,13 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import net.sourceforge.phpeclipse.wiki.actions.mediawiki.config.IWikipedia; -import net.sourceforge.phpeclipse.wiki.actions.mediawiki.config.WikipediaDE; import net.sourceforge.phpeclipse.wiki.actions.mediawiki.exceptions.MethodException; import net.sourceforge.phpeclipse.wiki.actions.mediawiki.exceptions.PageNotEditableException; import net.sourceforge.phpeclipse.wiki.actions.mediawiki.exceptions.UnexpectedAnswerException; import net.sourceforge.phpeclipse.wiki.editor.WikiEditorPlugin; import org.apache.commons.httpclient.ConnectMethod; +import org.apache.commons.httpclient.HostConfiguration; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpConnection; import org.apache.commons.httpclient.HttpException; @@ -37,6 +37,7 @@ import org.apache.commons.httpclient.methods.PostMethod; import org.apache.commons.httpclient.protocol.Protocol; import org.apache.commons.httpclient.util.EncodingUtil; import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.Preferences; /** * This class gets the wikitext from a wikipedia edit page @@ -53,6 +54,10 @@ public class MediaWikiConnector { ".*]*\\sid=\"editform\"[^>]*title=(.*?)&[^>]*>" + ".*]*\\sname=\"wpTextbox1\"[^>]*>(.*?)" + ".*]*\\svalue=\"(\\d*)\"[^>]*\\sname=\"wpEdittime\"[^>]*>" + ".*", Pattern.DOTALL); + // + private static final Pattern EDIT_TOKEN = Pattern.compile( + ".*.*", Pattern.DOTALL); + //setup default user agent final static public String userAgent = "plog4u.org/0.0"; @@ -64,7 +69,12 @@ public class MediaWikiConnector { /** * Delay a new store to 1 second */ - private Throttle storeThrottle = new Throttle(1000); + private Throttle loadThrottle = new Throttle(WikiEditorPlugin.HTTP_GET_THROTTLE); + + /** + * Delay a new store to 1 second + */ + private Throttle storeThrottle = new Throttle(WikiEditorPlugin.HTTP_PUT_THROTTLE); class Throttle { private long nextTime = 0; @@ -75,6 +85,12 @@ public class MediaWikiConnector { this.minimumDelay = minimumDelay; } + public Throttle(String key) { + Preferences prefs = WikiEditorPlugin.getDefault().getPluginPreferences(); + String minimumDelay = prefs.getString(key); + this.minimumDelay = Integer.parseInt(minimumDelay); + } + /** this is called from the client */ public synchronized void delay() throws InterruptedException { long delay = nextTime - System.currentTimeMillis(); @@ -92,6 +108,7 @@ public class MediaWikiConnector { manager.setConnectionStaleCheckingEnabled(true); // open the conversation client = new HttpClient(manager); + setHTTPClientParameters(client); //client.State.CookiePolicy = CookiePolicy.COMPATIBILITY; //client.HostConfiguration.setHost(LOGON_SITE, LOGON_PORT, "http"); } @@ -131,6 +148,13 @@ public class MediaWikiConnector { } else if (responseCode == 200 && responseBody.matches(config.getLoginWrongPw()) || responseCode == 200 && responseBody.matches(config.getLoginNoUser())) { result = false; + if (responseBody.matches(config.getLoginNoUser())) { + throw new UnexpectedAnswerException("login not successful: wrong user name: " + user); + } else if (responseBody.matches(config.getLoginWrongPw())) { + throw new UnexpectedAnswerException("login not successful: wrong password for user: " + user); + } else { + throw new UnexpectedAnswerException("logout not successful: responseCode == 200"); + } } else { throw new UnexpectedAnswerException("login not successful: " + method.getStatusLine()); } @@ -171,12 +195,13 @@ public class MediaWikiConnector { // log(method); if (responseCode == 302 && responseBody.length() == 0 || responseCode == 200 - && responseBody.matches(config.getLoginSuccess())) { + && responseBody.matches(config.getLogoutSuccess())) { // config.getloggedIn = false; result = true; } else if (responseCode == 200) { //### should check for a failure message result = false; + throw new UnexpectedAnswerException("logout not successful: responseCode == 200"); } else { throw new UnexpectedAnswerException("logout not successful: " + method.getStatusLine()); } @@ -195,6 +220,58 @@ public class MediaWikiConnector { return result; } + /** parses a returned editform for the sessions wpEditToken */ + private String parseEditToken(String charSet, String responseBody) throws PageNotEditableException { + Matcher matcher = EDIT_TOKEN.matcher(responseBody); + if (!matcher.matches()) { + return null; + } + + return matcher.group(1); + } + + /** + * returns the edit token or null if no token is available + * + * @param actionURL + * @param charSet + * @param title + * @return + * @throws UnexpectedAnswerException + * @throws MethodException + * @throws PageNotEditableException + */ + public String loadEditToken(String actionURL, String charSet, String title) throws UnexpectedAnswerException, MethodException, + PageNotEditableException { + GetMethod method = new GetMethod(actionURL); + method.setFollowRedirects(false); + method.addRequestHeader("User-Agent", userAgent); + NameValuePair[] params = new NameValuePair[] { new NameValuePair("title", title), new NameValuePair("action", "edit") }; + method.setQueryString(EncodingUtil.formUrlEncode(params, charSet)); + + try { + int responseCode = client.executeMethod(method); + String responseBody = method.getResponseBodyAsString(); + // log(method); + + if (responseCode == 200) { + String parsed = parseEditToken(charSet, responseBody); + if (parsed != null && parsed.length() == 0) { + return null; + } + return parsed; + } else { + throw new UnexpectedAnswerException("load not successful: expected 200 OK, got " + method.getStatusLine()); + } + } catch (HttpException e) { + throw new MethodException("method failed", e); + } catch (IOException e) { + throw new MethodException("method failed", e); + } finally { + method.releaseConnection(); + } + } + /** parses a returned editform into a Content object with UNIX-EOLs ("\n") */ private Parsed parseBody(String charSet, String responseBody) throws PageNotEditableException, UnsupportedEncodingException { Matcher matcher = BODY_PATTERN.matcher(responseBody); @@ -204,12 +281,13 @@ public class MediaWikiConnector { String title = matcher.group(1); String body = matcher.group(2); String timestamp = matcher.group(3); - + String tokenEdit = null; + // String tokenEdit = matcher.group(4); title = URLDecoder.decode(title, charSet); body = body.replaceAll(""", "\"").replaceAll("'", "'").replaceAll("<", "<").replaceAll(">", ">").replaceAll( "&", "&").replaceAll("\r\n", "\n").replace('\r', '\n'); - return new Parsed(timestamp, title, body); + return new Parsed(timestamp, title, body, tokenEdit); } /** load a Page Version - returns a Loaded Object */ @@ -244,14 +322,48 @@ public class MediaWikiConnector { return result; } - public ArrayList loadXML(IWikipedia config, String actionURL, String pages) throws UnexpectedAnswerException, MethodException { + public String loadHTMLPage(String actionURL, String charSet) throws UnexpectedAnswerException, MethodException, + PageNotEditableException { + GetMethod method = new GetMethod(actionURL); + method.setFollowRedirects(true); + method.addRequestHeader("User-Agent", userAgent); +// NameValuePair[] params = new NameValuePair[] { new NameValuePair("title", title) }; +// method.setQueryString(EncodingUtil.formUrlEncode(params, charSet)); + + String result = ""; + try { + int responseCode = client.executeMethod(method); + String responseBody = method.getResponseBodyAsString(); + // log(method); + + if (responseCode == 200) { + result = responseBody; +// Parsed parsed = parseBody(charSet, responseBody); +// Content content = new Content(parsed.timestamp, parsed.body); +// result = new Loaded(actionURL, charSet, parsed.title, content); + } else { + throw new UnexpectedAnswerException("load not successful: expected 200 OK, got " + method.getStatusLine()); + } + } catch (HttpException e) { + throw new MethodException("method failed", e); + } catch (IOException e) { + throw new MethodException("method failed", e); + } finally { + method.releaseConnection(); + } + return result; + } + + public ArrayList loadXML(IWikipedia config, String actionURL, String pages) throws UnexpectedAnswerException, MethodException, + InterruptedException { + loadThrottle.delay(); PostMethod method = new PostMethod(actionURL); method.setFollowRedirects(false); method.addRequestHeader("User-Agent", userAgent); method.addRequestHeader("Content-Type", PostMethod.FORM_URL_ENCODED_CONTENT_TYPE + "; charset=" + config.getCharSet()); - - NameValuePair[] params = new NameValuePair[] { - new NameValuePair("pages", pages), + + NameValuePair[] params = new NameValuePair[] { + new NameValuePair("pages", pages), new NameValuePair("curonly", "X"), new NameValuePair("action", "submit") }; method.addParameters(params); @@ -265,7 +377,7 @@ public class MediaWikiConnector { } else { throw new UnexpectedAnswerException("XML load not successful: expected 200 OK, got " + method.getStatusLine()); } - } catch(CoreException e) { + } catch (CoreException e) { throw new UnexpectedAnswerException("XML load method failed" + e.getMessage()); } catch (HttpException e) { throw new MethodException("XML load method failed", e); @@ -293,15 +405,21 @@ public class MediaWikiConnector { * @throws PageNotEditableException * @throws InterruptedException */ - public Stored store(IWikipedia config, String actionUrl, String title, Content content, String summary, boolean minorEdit, - boolean watchThis) throws UnexpectedAnswerException, MethodException, PageNotEditableException, InterruptedException { + public Stored store(IWikipedia config, String editToken, String actionUrl, String title, Content content, String summary, + boolean minorEdit, boolean watchThis) throws UnexpectedAnswerException, MethodException, PageNotEditableException, + InterruptedException { //### workaround: prevent too many stores at a time storeThrottle.delay(); PostMethod method = new PostMethod(actionUrl); + method.setFollowRedirects(false); method.addRequestHeader("User-Agent", userAgent); method.addRequestHeader("Content-Type", PostMethod.FORM_URL_ENCODED_CONTENT_TYPE + "; charset=" + config.getCharSet()); + if (editToken == null) { + // in some versions editToken isn't supported + editToken = " "; + } NameValuePair[] params = new NameValuePair[] { // new NameValuePair("wpSection", ""), // new NameValuePair("wpPreview", "Vorschau zeigen"), @@ -310,6 +428,7 @@ public class MediaWikiConnector { new NameValuePair("wpTextbox1", content.body), new NameValuePair("wpEdittime", content.timestamp), new NameValuePair("wpSummary", summary), + new NameValuePair("wpEditToken", editToken), new NameValuePair("wpSave", "yes"), new NameValuePair("action", "submit") }; method.addParameters(params); @@ -370,22 +489,12 @@ public class MediaWikiConnector { } Protocol protocol = Protocol.getProtocol(schema); - HttpState state = new HttpState(); - method = new GetMethod(uri.toString()); String host = uri.getHost(); int port = uri.getPort(); HttpConnection connection = new HttpConnection(host, port, protocol); - // timeout after 30 seconds - connection.setConnectionTimeout(30000); - connection.setProxyHost(System.getProperty("http.proxyHost")); - connection.setProxyPort(Integer.parseInt(System.getProperty("http.proxyPort", "80"))); - - if (System.getProperty("http.proxyUserName") != null) { - state.setProxyCredentials(null, null, new UsernamePasswordCredentials(System.getProperty("http.proxyUserName"), System - .getProperty("http.proxyPassword"))); - } + HttpState state = setHTTPParameters(connection); if (connection.isProxied() && connection.isSecure()) { method = new ConnectMethod(method); @@ -483,11 +592,74 @@ public class MediaWikiConnector { // } // return null; // no success in getting wiki text // } - + + /** + * @param state + * @param connection + */ + private HttpState setHTTPParameters(HttpConnection connection) { + HttpState state = new HttpState(); + Preferences prefs = WikiEditorPlugin.getDefault().getPluginPreferences(); + String timeout = prefs.getString(WikiEditorPlugin.HTTP_TIMEOUT); + String proxyHost = prefs.getString(WikiEditorPlugin.HTTP_PROXYHOST); + + try { + // timeout after xx seconds + connection.setConnectionTimeout(Integer.parseInt(timeout)); + + if (proxyHost.length() > 0) { + String proxyPort = prefs.getString(WikiEditorPlugin.HTTP_PROXYPORT); + connection.setProxyHost(proxyHost); + connection.setProxyPort(Integer.parseInt(proxyPort)); + + String proxyUserName = prefs.getString(WikiEditorPlugin.HTTP_PROXYUSERNAME); + if (proxyUserName.length() > 0) { + String proxyPassWord = prefs.getString(WikiEditorPlugin.HTTP_PROXYPASSWORD); + state.setProxyCredentials(null, null, new UsernamePasswordCredentials(proxyUserName, proxyPassWord)); + } + } + + } catch (Exception e) { + + } + return state; + } + + private void setHTTPClientParameters(HttpClient client) { + + Preferences prefs = WikiEditorPlugin.getDefault().getPluginPreferences(); + String timeout = prefs.getString(WikiEditorPlugin.HTTP_TIMEOUT); + String proxyHost = prefs.getString(WikiEditorPlugin.HTTP_PROXYHOST); + + try { + // timeout after xx seconds + client.setConnectionTimeout(Integer.parseInt(timeout)); + + if (proxyHost.length() > 0) { + String proxyPort = prefs.getString(WikiEditorPlugin.HTTP_PROXYPORT); + HostConfiguration conf = new HostConfiguration(); + client.setHostConfiguration(conf); + conf.setProxy(proxyHost, Integer.parseInt(proxyPort)); + + String proxyUserName = prefs.getString(WikiEditorPlugin.HTTP_PROXYUSERNAME); + if (proxyUserName.length() > 0) { + HttpState state = new HttpState(); + String proxyPassWord = prefs.getString(WikiEditorPlugin.HTTP_PROXYPASSWORD); + state.setProxyCredentials(null, null, new UsernamePasswordCredentials(proxyUserName, proxyPassWord)); + client.setState(state); + } + } + + } catch (Exception e) { + + } + + } + public static void main(String[] args) { MediaWikiConnector mwc = new MediaWikiConnector(); try { - IWikipedia wp = null; + IWikipedia wp = null; ArrayList list = mwc.loadXML(wp, "http://www.plog4u.de/wiki/index.php/Spezial:Export", "Mechanisches Fernsehen\nSynästhesie"); for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i).toString()); @@ -495,10 +667,10 @@ public class MediaWikiConnector { } catch (UnexpectedAnswerException e) { // TODO Auto-generated catch block e.printStackTrace(); - } catch (MethodException e) { + } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); - } + } } }