Fix POST parameters and YiffStar support
authorNiki Roo <niki@nikiroo.be>
Thu, 2 Mar 2017 19:03:23 +0000 (20:03 +0100)
committerNiki Roo <niki@nikiroo.be>
Thu, 2 Mar 2017 19:03:23 +0000 (20:03 +0100)
src/be/nikiroo/fanfix/Cache.java
src/be/nikiroo/fanfix/bundles/Config.java
src/be/nikiroo/fanfix/bundles/config.properties
src/be/nikiroo/fanfix/supported/YiffStar.java

index 8e8392aa12d61795b53ce03d320e591f11b20712..d97a58a66a13a67751ea94f876e9c36c4f1b6a27 100644 (file)
@@ -222,7 +222,7 @@ public class Cache {
                        throws IOException {
 
                URLConnection conn = openConnectionWithCookies(url, support);
-               if (postParams != null) {
+               if (postParams != null && conn instanceof HttpURLConnection) {
                        StringBuilder postData = new StringBuilder();
                        for (Map.Entry<String, String> param : postParams.entrySet()) {
                                if (postData.length() != 0)
@@ -234,6 +234,10 @@ public class Cache {
                        }
 
                        conn.setDoOutput(true);
+                       ((HttpURLConnection) conn).setRequestMethod("POST");
+                       conn.setRequestProperty("Content-Type",
+                                       "application/x-www-form-urlencoded");
+                       conn.setRequestProperty("charset", "utf-8");
 
                        OutputStreamWriter writer = new OutputStreamWriter(
                                        conn.getOutputStream());
index 7cc7bee42134c1054e2938104a6cfd95e4905a6a..b68265e04865870aff23234dfe47a8eb5f1e4e3c 100644 (file)
@@ -44,8 +44,8 @@ public enum Config {
        CHAPTER_EN, //
        @Meta(what = "Chapter identification string", where = "", format = "", info = "used to identify a starting chapter in text mode")
        CHAPTER_FR, //
-       @Meta(what = "Login information", where = "", format = "", info = "used to login on YiffStar to have access to all the stories")
+       @Meta(what = "Login information", where = "", format = "", info = "used to login on YiffStar to have access to all the stories (should not be necessary anymore)")
        LOGIN_YIFFSTAR_USER, //
-       @Meta(what = "Login information", where = "", format = "", info = "used to login on YiffStar to have access to all the stories")
+       @Meta(what = "Login information", where = "", format = "", info = "used to login on YiffStar to have access to all the stories (should not be necessary anymore)")
        LOGIN_YIFFSTAR_PASS, //
 }
index 4148f66e1400d5ed34ff9da6868db9e5ce77782b..3f8345f4f569e2c3a6c3abc2fb6deeea79774698 100644 (file)
@@ -57,8 +57,8 @@ CHAPTER_EN = Chapter
 # used to identify a starting chapter in text mode
 CHAPTER_FR = Chapitre
 # (WHAT: Login information)
-# used to login on YiffStar to have access to all the stories
+# used to login on YiffStar to have access to all the stories (should not be necessary anymore)
 LOGIN_YIFFSTAR_USER = 
 # (WHAT: Login information)
-# used to login on YiffStar to have access to all the stories
+# used to login on YiffStar to have access to all the stories (should not be necessary anymore)
 LOGIN_YIFFSTAR_PASS = 
index 4f4e8d693271814bb645eb9c9a6ae3b81b1b5f7e..0e24714c83cc806fb139bc64243e296229272509 100644 (file)
@@ -3,6 +3,7 @@ package be.nikiroo.fanfix.supported;
 import java.awt.image.BufferedImage;
 import java.io.IOException;
 import java.io.InputStream;
+import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -68,25 +69,32 @@ class YiffStar extends BasicSupport {
 
        @Override
        public void login() throws IOException {
-               Map<String, String> post = new HashMap<String, String>();
-               post.put("LoginForm[sfLoginUsername]",
-                               Instance.getConfig().getString(Config.LOGIN_YIFFSTAR_USER));
-               post.put("LoginForm[sfLoginPassword]",
-                               Instance.getConfig().getString(Config.LOGIN_YIFFSTAR_PASS));
-               post.put("YII_CSRF_TOKEN", "");
-
-               // Cookies will actually be retained by the cache manager once logged in
-               // TODO: not working yet, once fixed can be removed (adding "/guest" to
-               // URLs fix the access problem!):
-               /*
-                * Instance.getCache() .openNoCache(new
-                * URL("https://www.sofurry.com/user/login"), this, post).close();
-                */
+               // Note: this should not be necessary anymore
+               // (the "/guest" trick is enough)
+               String login = Instance.getConfig().getString(
+                               Config.LOGIN_YIFFSTAR_USER);
+               String password = Instance.getConfig().getString(
+                               Config.LOGIN_YIFFSTAR_PASS);
+
+               if (login != null && !login.isEmpty() && password != null
+                               && !password.isEmpty()) {
+                       Map<String, String> post = new HashMap<String, String>();
+                       post.put("sfLoginUsername", login);
+                       post.put("sfLoginPassword", password);
+                       post.put("YII_CSRF_TOKEN", "");
+
+                       // Cookies will actually be retained by the cache manager once
+                       // logged in
+                       Instance.getCache()
+                                       .openNoCache(new URL("https://www.sofurry.com/user/login"),
+                                                       this, post).close();
+               }
        }
 
        @Override
        public URL getCanonicalUrl(URL source) throws IOException {
                if (source.getPath().startsWith("/view")) {
+                       source = new URL(source.toString() + "/guest");
                        InputStream in = Instance.getCache().open(source, this, false);
                        String line = getLine(in, "/browse/folder/", 0);
                        if (line != null) {
@@ -94,7 +102,7 @@ class YiffStar extends BasicSupport {
                                if (tab.length > 1) {
                                        String groupUrl = source.getProtocol() + "://"
                                                        + source.getHost() + tab[1];
-                                       return new URL(groupUrl);
+                                       return guest(groupUrl);
                                }
                        }
                }
@@ -194,7 +202,7 @@ class YiffStar extends BasicSupport {
                                                link = source.getProtocol() + "://" + source.getHost()
                                                                + link;
                                        }
-                                       final URL value = new URL(link);
+                                       final URL value = guest(link);
                                        final String key = StringUtils.unhtml(line).trim();
                                        urls.add(new Entry<String, URL>() {
                                                public URL setValue(URL value) {
@@ -245,4 +253,27 @@ class YiffStar extends BasicSupport {
 
                return builder.toString();
        }
+
+       /**
+        * Return a {@link URL} from the given link, but add the "/guest" part to it
+        * to make sure we don't need to be logged-in to see it.
+        * 
+        * @param link
+        *            the link
+        * 
+        * @return the {@link URL}
+        * 
+        * @throws MalformedURLException
+        */
+       private URL guest(String link) throws MalformedURLException {
+               if (link.contains("?")) {
+                       if (link.contains("/?")) {
+                               return new URL(link.replace("?", "guest?"));
+                       } else {
+                               return new URL(link.replace("?", "/guest?"));
+                       }
+               } else {
+                       return new URL(link + "/guest");
+               }
+       }
 }