package ctbrec.ui.sites.streamray; import java.io.IOException; import java.util.Collections; import java.util.function.Consumer; import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ctbrec.Config; import ctbrec.sites.streamray.Streamray; import ctbrec.ui.ExternalBrowser; import okhttp3.Cookie; import okhttp3.Cookie.Builder; import okhttp3.CookieJar; import okhttp3.HttpUrl; public class StreamrayElectronLoginDialog { private static final Logger LOG = LoggerFactory.getLogger(StreamrayElectronLoginDialog.class); public static final String DOMAIN = "streamray.com"; public static final String URL = "https://streamray.com/"; private CookieJar cookieJar; private ExternalBrowser browser; private boolean firstCall = true; private final static Streamray site = new Streamray(); public StreamrayElectronLoginDialog(CookieJar cookieJar) throws IOException { this.cookieJar = cookieJar; browser = ExternalBrowser.getInstance(); try { var config = new JSONObject(); config.put("url", URL); config.put("w", 800); config.put("h", 600); config.put("userAgent", Config.getInstance().getSettings().httpUserAgent); var msg = new JSONObject(); msg.put("config", config); browser.run(msg, msgHandler); } catch (InterruptedException e) { Thread.currentThread().interrupt(); throw new IOException("Couldn't wait for login dialog", e); } finally { browser.close(); } } private Consumer msgHandler = line -> { if (!line.startsWith("{")) return; JSONObject json = new JSONObject(line); boolean loginCookie = false; if (json.has("cookies")) { var cookies = json.getJSONArray("cookies"); for (var i = 0; i < cookies.length(); i++) { var cookie = cookies.getJSONObject(i); if (cookie.getString("domain").contains(DOMAIN)) { if (cookie.optString("name").equals("memberToken")) { loginCookie = true; } Builder b = new Cookie.Builder() .path(cookie.getString("path")) .domain(DOMAIN) .name(cookie.optString("name")) .value(cookie.optString("value")) .expiresAt(Double.valueOf(cookie.optDouble("expirationDate")).longValue()); // NOSONAR if (cookie.optBoolean("hostOnly")) { b.hostOnlyDomain(DOMAIN); } if (cookie.optBoolean("httpOnly")) { b.httpOnly(); } if (cookie.optBoolean("secure")) { b.secure(); } Cookie c = b.build(); LOG.trace("Adding cookie {}={}", c.name(), c.value()); cookieJar.saveFromResponse(HttpUrl.parse(URL), Collections.singletonList(c)); } // if } // for } }; }