diff --git a/build.gradle.kts b/build.gradle.kts index 5b14c43..a051136 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -32,7 +32,7 @@ java { } javafx { - version = "11.0.2" + version = "19.0.2.1" modules = listOf("javafx.controls", "javafx.fxml", "javafx.web", "javafx.swing") } diff --git a/src/main/java/com/xiaomitool/v2/gui/controller/LoginController.java b/src/main/java/com/xiaomitool/v2/gui/controller/LoginController.java index c90bb86..b98bc6d 100644 --- a/src/main/java/com/xiaomitool/v2/gui/controller/LoginController.java +++ b/src/main/java/com/xiaomitool/v2/gui/controller/LoginController.java @@ -8,9 +8,7 @@ import com.xiaomitool.v2.gui.visual.VisiblePane; import com.xiaomitool.v2.language.LRes; import com.xiaomitool.v2.logging.Log; -import com.xiaomitool.v2.utility.Pointer; import com.xiaomitool.v2.utility.WaitSemaphore; -import com.xiaomitool.v2.utility.utils.CookieUtils; import com.xiaomitool.v2.xiaomi.XiaomiKeystore; import javafx.application.Platform; import javafx.concurrent.Worker; @@ -31,12 +29,15 @@ import javafx.stage.Stage; import javafx.stage.WindowEvent; -import java.net.HttpCookie; +import java.net.CookieHandler; import java.net.URI; +import java.util.Collections; +import java.util.List; import java.util.Locale; +import java.util.Map; public class LoginController extends DefaultController { - private static final String LOGIN_URL = "https://account.xiaomi.com/pass/serviceLogin?sid=passport&json=false&passive=true&hidden=false&_snsDefault=facebook&_locale=" + Locale.getDefault().getLanguage().toLowerCase(); + private static final String LOGIN_URL = "https://account.xiaomi.com/pass/serviceLogin?sid=unlockApi&json=false&passive=true&hidden=false&_snsDefault=facebook&checkSafePhone=true&_locale=" + Locale.getDefault().getLanguage().toLowerCase(); private static boolean loggedIn = false; private static Thread loginThread = null; @FXML @@ -90,7 +91,7 @@ public void run() { } public static void logout() { - CookieUtils.clear(); + CookieHandler.setDefault(null); XiaomiKeystore.clear(); setLoginNumber(null); } @@ -203,26 +204,6 @@ private void initBrowser() { BROWSER_AREA.add(LOADING_NODE); ENGINE = BROWSER.getEngine(); ENGINE.load(LOGIN_URL); - Pointer pointer = new Pointer(); - pointer.pointed = new CookieUtils.EventCookieAdd() { - @Override - public boolean run(URI url, HttpCookie cookie) { - String name = cookie.getName(); - if ("passToken".equals(name)) { - passToken = cookie.getValue(); - } else if ("deviceId".equals(name)) { - deviceId = cookie.getValue(); - } else if ("userId".equals(name)) { - userId = cookie.getValue(); - } - if (passToken != null && userId != null && deviceId != null && !passToken.isEmpty() && !userId.isEmpty() && !deviceId.isEmpty()) { - loginDone(); - return false; - } - return true; - } - }; - CookieUtils.addCookieListener((CookieUtils.EventCookieAdd) pointer.pointed); ENGINE.getLoadWorker().stateProperty().addListener((observable, oldValue, newValue) -> { if (loadingLocalContent) { return; @@ -236,10 +217,51 @@ public boolean run(URI url, HttpCookie cookie) { setErrorPage(); } else if (Worker.State.SUCCEEDED.equals(newValue)) { setBrowserPage(); + + scanCookies(); + if (passToken != null && !passToken.isEmpty() + && userId != null && !userId.isEmpty() + && deviceId != null && !deviceId.isEmpty()) { + loginDone(); + } } }); } + private void scanCookies() { + CookieHandler cookies = CookieHandler.getDefault(); + if (cookies == null) { + Log.error("disabled cookie handler"); + return; + } + + Map> headers = Collections.emptyMap(); + try { + headers = cookies.get(new URI(LOGIN_URL), headers); + } catch (java.net.URISyntaxException e) { + assert false; // unreachable + } catch (java.io.IOException e) { + assert false; // unreachable + } + + for (String hdr : headers.getOrDefault("Cookie", Collections.emptyList())) { + for (String pair : hdr.split(";")) { + String[] p = pair.split("=", 2); + if (p.length < 2) continue; + String name = p[0].trim(); + String value = p[1].trim(); + + if ("passToken".equals(name)) { + passToken = value; + } else if ("userId".equals(name)) { + userId = value; + } else if ("deviceId".equals(name)) { + deviceId = value; + } + } + } + } + private void loginDone() { Log.info("Logged in succesfulyl: " + userId); XiaomiKeystore.getInstance().setCredentials(userId, passToken, deviceId); diff --git a/src/main/java/com/xiaomitool/v2/utility/utils/CookieUtils.java b/src/main/java/com/xiaomitool/v2/utility/utils/CookieUtils.java deleted file mode 100644 index 8d0bd13..0000000 --- a/src/main/java/com/xiaomitool/v2/utility/utils/CookieUtils.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.xiaomitool.v2.utility.utils; - -import java.net.*; -import java.util.ArrayList; -import java.util.List; - -public class CookieUtils { - private static CookieStoreModded cookieStoreModded; - - public static void clear() { - if (cookieStoreModded != null) { - cookieStoreModded.clear(); - } - } - - public static void addCookieListener(EventCookieAdd event) { - if (cookieStoreModded == null) { - cookieStoreModded = new CookieStoreModded(); - CookieManager cookieManager = new CookieManager(cookieStoreModded, null); - CookieHandler.setDefault(cookieManager); - } - cookieStoreModded.addListener(event); - } - - public static void removeCookieListener(EventCookieAdd event) { - if (cookieStoreModded == null) { - return; - } - cookieStoreModded.removeListener(event); - } - - public interface EventCookieAdd { - boolean run(URI url, HttpCookie cookie); - } - - private static class CookieStoreModded implements CookieStore { - private List eventCookieAdds = new ArrayList<>(); - private CookieStore cookieStore = (new CookieManager()).getCookieStore(); - - public void clear() { - cookieStore = (new CookieManager()).getCookieStore(); - } - - public void addListener(EventCookieAdd event) { - eventCookieAdds.add(event); - } - - public void removeListener(EventCookieAdd event) { - eventCookieAdds.remove(event); - } - - @Override - public void add(URI url, HttpCookie cookie) { - if (!cookie.hasExpired()) { - List toRemove = new ArrayList<>(); - for (EventCookieAdd event : eventCookieAdds) { - if (!event.run(url, cookie)) { - toRemove.add(event); - } - } - for (EventCookieAdd event : toRemove) { - eventCookieAdds.remove(event); - } - } - cookieStore.add(url, cookie); - } - - @Override - public List get(URI uri) { - return cookieStore.get(uri); - } - - @Override - public List getCookies() { - return cookieStore.getCookies(); - } - - @Override - public List getURIs() { - return cookieStore.getURIs(); - } - - @Override - public boolean remove(URI uri, HttpCookie cookie) { - return cookieStore.remove(uri, cookie); - } - - @Override - public boolean removeAll() { - return cookieStore.removeAll(); - } - } -}