package ctbrec.ui.sites.bonga; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.Collections; import java.util.Objects; import java.util.function.Consumer; import org.json.JSONArray; import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ctbrec.Config; import ctbrec.sites.bonga.BongaCams; import ctbrec.ui.ExternalBrowser; import okhttp3.Cookie; import okhttp3.Cookie.Builder; import okhttp3.CookieJar; import okhttp3.HttpUrl; public class BongaCamsElectronLoginDialog { private static final transient Logger LOG = LoggerFactory.getLogger(BongaCamsElectronLoginDialog.class); public static final String DOMAIN = "bongacams.com"; public static final String URL = BongaCams.baseUrl + "/login"; private CookieJar cookieJar; private ExternalBrowser browser; public BongaCamsElectronLoginDialog(CookieJar cookieJar) throws IOException { this.cookieJar = cookieJar; browser = ExternalBrowser.getInstance(); try { JSONObject config = new JSONObject(); config.put("url", URL); config.put("w", 640); config.put("h", 480); JSONObject msg = new JSONObject(); msg.put("config", config); browser.run(msg, msgHandler); } catch (InterruptedException e) { throw new IOException("Couldn't wait for login dialog", e); } finally { browser.close(); } } private Consumer msgHandler = (line) -> { if(!line.startsWith("{")) { System.err.println(line); } else { JSONObject json = new JSONObject(line); //LOG.debug("Browser: {}", json.toString(2)); if(json.has("url")) { String url = json.getString("url"); if(url.endsWith("/login")) { try { Thread.sleep(500); String username = Config.getInstance().getSettings().bongaUsername; if (username != null && !username.trim().isEmpty()) { browser.executeJavaScript("document.getElementById('log_in_username').value = '" + username + "';"); } String password = Config.getInstance().getSettings().bongaPassword; if (password != null && !password.trim().isEmpty()) { password = password.replace("'", "\\'"); browser.executeJavaScript("document.getElementById('log_in_password').value = '" + password + "';"); } String[] simplify = new String[] { "$('div[class~=\"page_header\"]').css('display','none');", "$('div[class~=\"header_bar\"]').css('display','none')", "$('footer').css('display','none');", "$('div[class~=\"footer_copy\"]').css('display','none')", "$('div[class~=\"fancybox-overlay\"]').css('display','none');" }; for (String js : simplify) { browser.executeJavaScript(js); } } catch(Exception e) { LOG.warn("Couldn't auto fill username and password for BongaCams", e); } } if(json.has("cookies")) { JSONArray _cookies = json.getJSONArray("cookies"); for (int i = 0; i < _cookies.length(); i++) { JSONObject cookie = _cookies.getJSONObject(i); if(cookie.getString("domain").contains(DOMAIN)) { Builder b = new Cookie.Builder() .path(cookie.getString("path")) .domain(DOMAIN) .name(cookie.getString("name")) .value(cookie.getString("value")) .expiresAt(Double.valueOf(cookie.optDouble("expirationDate")).longValue()); if(cookie.optBoolean("hostOnly")) { b.hostOnlyDomain(DOMAIN); } if(cookie.optBoolean("httpOnly")) { b.httpOnly(); } if(cookie.optBoolean("secure")) { b.secure(); } Cookie c = b.build(); cookieJar.saveFromResponse(HttpUrl.parse(BongaCams.baseUrl), Collections.singletonList(c)); } } } try { URL _url = new URL(url); if (Objects.equals(_url.getPath(), "/")) { browser.close(); } } catch (MalformedURLException e) { LOG.error("Couldn't parse new url {}", url, e); } catch (IOException e) { LOG.error("Couldn't send shutdown request to external browser", e); } } } }; }