From 3a7cb3b904227dd806ebe840776da4228ed496c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Fri, 21 Jul 2017 19:59:13 +0200 Subject: [PATCH] Create api package (#4) Create api package and move login's implementation to it --- .../wulkanowy/activity/main/CheckPass.java | 19 --- .../github/wulkanowy/activity/main/Login.java | 154 ------------------ .../wulkanowy/activity/main/LoginTask.java | 67 ++++++++ .../wulkanowy/activity/main/MainActivity.java | 8 +- .../java/io/github/wulkanowy/api/Cookies.java | 16 ++ .../java/io/github/wulkanowy/api/Vulcan.java | 20 +++ .../api/login/AccountPermissionException.java | 4 + .../api/login/BadCredentialsException.java | 4 + .../io/github/wulkanowy/api/login/Login.java | 88 ++++++++++ .../api/login/LoginErrorException.java | 4 + app/src/main/res/values-pl/strings.xml | 1 + app/src/main/res/values/loginData.xml | 10 -- app/src/main/res/values/strings.xml | 1 + .../activity/main/CheckPassTest.java | 28 ---- .../github/wulkanowy/api/login/LoginTest.java | 13 ++ 15 files changed, 221 insertions(+), 216 deletions(-) delete mode 100644 app/src/main/java/io/github/wulkanowy/activity/main/CheckPass.java delete mode 100644 app/src/main/java/io/github/wulkanowy/activity/main/Login.java create mode 100644 app/src/main/java/io/github/wulkanowy/activity/main/LoginTask.java create mode 100644 app/src/main/java/io/github/wulkanowy/api/Cookies.java create mode 100644 app/src/main/java/io/github/wulkanowy/api/Vulcan.java create mode 100644 app/src/main/java/io/github/wulkanowy/api/login/AccountPermissionException.java create mode 100644 app/src/main/java/io/github/wulkanowy/api/login/BadCredentialsException.java create mode 100644 app/src/main/java/io/github/wulkanowy/api/login/Login.java create mode 100644 app/src/main/java/io/github/wulkanowy/api/login/LoginErrorException.java delete mode 100644 app/src/main/res/values/loginData.xml delete mode 100644 app/src/test/java/io/github/wulkanowy/activity/main/CheckPassTest.java create mode 100644 app/src/test/java/io/github/wulkanowy/api/login/LoginTest.java diff --git a/app/src/main/java/io/github/wulkanowy/activity/main/CheckPass.java b/app/src/main/java/io/github/wulkanowy/activity/main/CheckPass.java deleted file mode 100644 index ace010f80..000000000 --- a/app/src/main/java/io/github/wulkanowy/activity/main/CheckPass.java +++ /dev/null @@ -1,19 +0,0 @@ -package io.github.wulkanowy.activity.main; - -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; - -class CheckPass { - - private Document document; - - CheckPass(Document doc) { - document = doc; - } - - boolean isLogged() { - Element messageAlert = document.select(".ErrorMessage").first(); - - return null == messageAlert; - } -} diff --git a/app/src/main/java/io/github/wulkanowy/activity/main/Login.java b/app/src/main/java/io/github/wulkanowy/activity/main/Login.java deleted file mode 100644 index fe0acd936..000000000 --- a/app/src/main/java/io/github/wulkanowy/activity/main/Login.java +++ /dev/null @@ -1,154 +0,0 @@ -package io.github.wulkanowy.activity.main; - -import android.app.Activity; -import android.app.ProgressDialog; -import android.content.Intent; -import android.os.AsyncTask; -import android.widget.Toast; - -import org.jsoup.Connection; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.select.Elements; - -import java.io.IOException; -import java.util.Map; - -import io.github.wulkanowy.R; -import io.github.wulkanowy.activity.dashboard.DashboardActivity; - -public class Login extends AsyncTask { - - String email; - String password; - String county; - - Map loginCookies; - - Activity activity; - String userMesage; - - String urlForStepOne; - String urlForStepTwo; - String urlForStepThree; - - ProgressDialog progress; - - public Login(String emailT, String passwordT, String countyT, Activity mainAC){ - - activity = mainAC; - progress = new ProgressDialog(activity); - - if (countyT.equals("Debug")){ - urlForStepOne = activity.getString(R.string.urlStepOneDebug); - urlForStepTwo = activity.getString(R.string.urlStepTwoDebug); - urlForStepThree = activity.getString(R.string.urlStepThreeDebug); - county = activity.getString(R.string.countyDebug); - email = emailT; - password = passwordT; - } - else{ - urlForStepOne = activity.getString(R.string.urlStepOneRelease); - urlForStepTwo = activity.getString(R.string.urlStepTwoRelease); - urlForStepThree = activity.getString(R.string.urlStepThreeRelease); - county = countyT; - email = emailT; - password = passwordT; - } - } - - @Override - protected void onPreExecute() { - super.onPreExecute(); - - progress.setTitle(activity.getText(R.string.login_title)); - progress.setMessage(activity.getText(R.string.please_wait)); - progress.setCancelable(false); - progress.show(); - } - - @Override - protected Void doInBackground(Void... params) { - - try { - if (!stepOne()) { - userMesage = activity.getString(R.string.login_bad_credentials); - return null; - } - - Document certificate = stepTwo(); - - Connection.Response step3 = stepThree(certificate); - Document dashboardHtml = step3.parse(); - - String helloText = dashboardHtml.getElementsByClass("welcome").text(); - - if (helloText.equals("Dzień dobry!")) { - userMesage = activity.getString(R.string.login_accepted); - } - else { - userMesage = activity.getString(R.string.login_denied); - } - } - catch (IOException e){ - userMesage = e.toString(); - } - - return null; - } - - private boolean stepOne() throws IOException { - Connection.Response initial = Jsoup - .connect(urlForStepOne) - .data("LoginName", email) - .data("Password", password) - .method(Connection.Method.POST) - .execute(); - - loginCookies = initial.cookies(); - - Document document = initial.parse(); - - return new CheckPass(document).isLogged(); - } - - private Document stepTwo() throws IOException { - urlForStepTwo = urlForStepTwo.replace("{locationID}", county); - - return Jsoup.connect(urlForStepTwo) - .cookies(loginCookies) - .get(); - } - - private Connection.Response stepThree(Document certificate) throws IOException { - Elements wresultsInput = certificate.select("input[name=wresult]"); - String wresults = wresultsInput.attr("value"); - - Elements waInput = certificate.select("input[name=wa]"); - String wa = waInput.attr("value"); - - urlForStepThree = urlForStepThree.replace("{locationID}", county); - - return Jsoup.connect(urlForStepThree) - .data("wa", wa) - .data("wresult", wresults) - .cookies(loginCookies) - .followRedirects(true) - .method(Connection.Method.POST) - .execute(); - } - - protected void onPostExecute(Void result) { - super.onPostExecute(result); - progress.dismiss(); - if (!userMesage.isEmpty()){ - Toast.makeText(activity, userMesage , Toast.LENGTH_LONG).show(); - } - - if (userMesage.equals(activity.getString(R.string.login_accepted))){ - Intent intent = new Intent(activity,DashboardActivity.class); - activity.startActivity(intent); - } - - } -} diff --git a/app/src/main/java/io/github/wulkanowy/activity/main/LoginTask.java b/app/src/main/java/io/github/wulkanowy/activity/main/LoginTask.java new file mode 100644 index 000000000..76b35f297 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/activity/main/LoginTask.java @@ -0,0 +1,67 @@ +package io.github.wulkanowy.activity.main; + +import android.app.Activity; +import android.app.ProgressDialog; +import android.content.Intent; +import android.os.AsyncTask; +import android.widget.Toast; + +import io.github.wulkanowy.R; +import io.github.wulkanowy.activity.dashboard.DashboardActivity; +import io.github.wulkanowy.api.Cookies; +import io.github.wulkanowy.api.login.*; + +public class LoginTask extends AsyncTask { + + private Activity activity; + + private ProgressDialog progress; + + public LoginTask(Activity context) { + activity = context; + progress = new ProgressDialog(activity); + } + + @Override + protected void onPreExecute() { + super.onPreExecute(); + + progress.setTitle(activity.getText(R.string.login_title)); + progress.setMessage(activity.getText(R.string.please_wait)); + progress.setCancelable(false); + progress.show(); + } + + @Override + protected Integer doInBackground(String... credentials) { + Cookies cookies = new Cookies(); + Login login = new Login(cookies); + + try { + login.login(credentials[0], credentials[1], credentials[2]); + } catch (BadCredentialsException e) { + return R.string.login_bad_credentials; + } catch (AccountPermissionException e) { + return R.string.login_bad_account_permission; + } catch (LoginErrorException e) { + return R.string.login_denied; + } + + //Map cookiesList = login.getJar(); + + return R.string.login_accepted; + } + + protected void onPostExecute(Integer messageID) { + super.onPostExecute(messageID); + + progress.dismiss(); + + Toast.makeText(activity, activity.getString(messageID), Toast.LENGTH_LONG).show(); + + if (messageID == R.string.login_accepted){ + Intent intent = new Intent(activity, DashboardActivity.class); + activity.startActivity(intent); + } + } +} diff --git a/app/src/main/java/io/github/wulkanowy/activity/main/MainActivity.java b/app/src/main/java/io/github/wulkanowy/activity/main/MainActivity.java index f63c0840d..0636bbf7a 100644 --- a/app/src/main/java/io/github/wulkanowy/activity/main/MainActivity.java +++ b/app/src/main/java/io/github/wulkanowy/activity/main/MainActivity.java @@ -65,12 +65,10 @@ public class MainActivity extends Activity { county = map.get(county); } - if (!email.isEmpty() || !password.isEmpty() || !county.isEmpty()){ - new Login(email, password, county, this).execute(); - } - else if (password.isEmpty() || email.isEmpty() || county.isEmpty()) { + if (!email.isEmpty() && !password.isEmpty() && !county.isEmpty()){ + new LoginTask(this).execute(email, password, county); + } else { Toast.makeText(this, R.string.data_text, Toast.LENGTH_SHORT).show(); - } } } diff --git a/app/src/main/java/io/github/wulkanowy/api/Cookies.java b/app/src/main/java/io/github/wulkanowy/api/Cookies.java new file mode 100644 index 000000000..189ef02b7 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/api/Cookies.java @@ -0,0 +1,16 @@ +package io.github.wulkanowy.api; + +import java.util.Map; + +public class Cookies { + + private Map cookies; + + public void setItems(Map items) { + cookies = items; + } + + public Map getAll() { + return cookies; + } +} diff --git a/app/src/main/java/io/github/wulkanowy/api/Vulcan.java b/app/src/main/java/io/github/wulkanowy/api/Vulcan.java new file mode 100644 index 000000000..f6d987cff --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/api/Vulcan.java @@ -0,0 +1,20 @@ +package io.github.wulkanowy.api; + +import java.util.Map; + +public abstract class Vulcan { + + private Cookies cookies; + + public Vulcan(Cookies cookies) { + this.cookies = cookies; + } + + public Map getJar() { + return cookies.getAll(); + } + + public void setCookies(Map items) { + cookies.setItems(items); + } +} diff --git a/app/src/main/java/io/github/wulkanowy/api/login/AccountPermissionException.java b/app/src/main/java/io/github/wulkanowy/api/login/AccountPermissionException.java new file mode 100644 index 000000000..15be359c2 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/api/login/AccountPermissionException.java @@ -0,0 +1,4 @@ +package io.github.wulkanowy.api.login; + +public class AccountPermissionException extends Exception { +} diff --git a/app/src/main/java/io/github/wulkanowy/api/login/BadCredentialsException.java b/app/src/main/java/io/github/wulkanowy/api/login/BadCredentialsException.java new file mode 100644 index 000000000..4502bb157 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/api/login/BadCredentialsException.java @@ -0,0 +1,4 @@ +package io.github.wulkanowy.api.login; + +public class BadCredentialsException extends Exception { +} diff --git a/app/src/main/java/io/github/wulkanowy/api/login/Login.java b/app/src/main/java/io/github/wulkanowy/api/login/Login.java new file mode 100644 index 000000000..2720e117a --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/api/login/Login.java @@ -0,0 +1,88 @@ +package io.github.wulkanowy.api.login; + +import org.jsoup.Connection; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; + +import java.io.IOException; + +import io.github.wulkanowy.api.Cookies; +import io.github.wulkanowy.api.Vulcan; + +public class Login extends Vulcan { + + private String loginPageUrl = "https://cufs.vulcan.net.pl/{locationID}/Account/LogOn"; + + private String certificatePageUrl = "https://cufs.vulcan.net.pl/{locationID}/FS/LS?wa=wsignin1.0&wtrealm=https://uonetplus.vulcan.net.pl/{locationID}/LoginEndpoint.aspx&wctx=https://uonetplus.vulcan.net.pl/{locationID}/LoginEndpoint.aspx"; + + private String loginEndpointPageUrl = "https://uonetplus.vulcan.net.pl/{locationID}/LoginEndpoint.aspx"; + + public Login(Cookies cookies) { + super(cookies); + } + + public boolean login(String email, String password, String county) throws BadCredentialsException, LoginErrorException, AccountPermissionException { + try { + sendCredentials(email, password, county); + String[] certificate = getCertificateData(county); + sendCertificate(certificate[0], certificate[1], county); + } catch (IOException e) { + throw new LoginErrorException(); + } + + return true; + } + + private void sendCredentials(String email, String password, String county) throws IOException, BadCredentialsException { + loginPageUrl = loginPageUrl.replace("{locationID}", county); + + Connection.Response response = Jsoup.connect(loginPageUrl) + .data("LoginName", email) + .data("Password", password) + .method(Connection.Method.POST) + .execute(); + + setCookies(response.cookies()); + Document document = response.parse(); + + if (null != document.select(".ErrorMessage").first()) { + throw new BadCredentialsException(); + } + } + + private String[] getCertificateData(String county) throws IOException { + certificatePageUrl = certificatePageUrl.replace("{locationID}", county); + + Document certificatePage = Jsoup.connect(certificatePageUrl) + .cookies(getJar()) + .get(); + + return new String[] { + certificatePage.select("input[name=wa]").attr("value"), + certificatePage.select("input[name=wresult]").attr("value") + }; + } + + private void sendCertificate(String protocolVersion, String certificate, String county) throws IOException, LoginErrorException, AccountPermissionException { + loginEndpointPageUrl = loginEndpointPageUrl.replace("{locationID}", county); + + Connection.Response response = Jsoup.connect(loginEndpointPageUrl) + .data("wa", protocolVersion) + .data("wresult", certificate) + .cookies(getJar()) + .followRedirects(true) + .method(Connection.Method.POST) + .execute(); + + setCookies(response.cookies()); + Document html = response.parse(); + + if(html.getElementsByTag("title").text().equals("Logowanie")) { + throw new AccountPermissionException(); + } + + if (!html.select(".welcome").text().equals("Dzień dobry!")) { + throw new LoginErrorException(); + } + } +} diff --git a/app/src/main/java/io/github/wulkanowy/api/login/LoginErrorException.java b/app/src/main/java/io/github/wulkanowy/api/login/LoginErrorException.java new file mode 100644 index 000000000..89596090c --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/api/login/LoginErrorException.java @@ -0,0 +1,4 @@ +package io.github.wulkanowy.api.login; + +public class LoginErrorException extends Exception { +} diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index f32c6b7ed..1df70d20a 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -12,6 +12,7 @@ Funkcja którą chciałeś uruchomić nie działa Pomyślnie zalogowano Zła nazwa użytkownika lub hasło + Brak uprawnień do otwarcia dziennika. Sprawdź wprowadzoną nazwę powiatu Logowanie nie powiodło się Proszę czekać… Aktywność dashboard diff --git a/app/src/main/res/values/loginData.xml b/app/src/main/res/values/loginData.xml deleted file mode 100644 index f4390b33b..000000000 --- a/app/src/main/res/values/loginData.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - https://cufs.vulcan.net.pl/Default/Account/LogOn - https://cufs.vulcan.net.pl/{locationID}/FS/LS?wa=wsignin1.0&wtrealm=https://uonetplus.vulcan.net.pl/{locationID}/LoginEndpoint.aspx&wctx=https://uonetplus.vulcan.net.pl/{locationID}/LoginEndpoint.aspx - https://uonetplus.vulcan.net.pl/{locationID}/LoginEndpoint.aspx" - https://cufsdemo.vulcan.net.pl/Default/Account/LogOn - https://cufsdemo.vulcan.net.pl/{locationID}/FS/LS?wa=wsignin1.0&wtrealm=https://uonetplusdemo.vulcan.net.pl/{locationID}/LoginEndpoint.aspx&wctx=https://uonetplusdemo.vulcan.net.pl/{locationID}/LoginEndpoint.aspx - https://uonetplusdemo.vulcan.net.pl/{locationID}/LoginEndpoint.aspx" - demouonetplus - diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index decc6b078..349121589 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -12,6 +12,7 @@ The function you wanted to run does not work Login is successful Bad username or password + No permission to open log. Check entered county name Login is failed Please wait… Dashboard Activity diff --git a/app/src/test/java/io/github/wulkanowy/activity/main/CheckPassTest.java b/app/src/test/java/io/github/wulkanowy/activity/main/CheckPassTest.java deleted file mode 100644 index 089b8e414..000000000 --- a/app/src/test/java/io/github/wulkanowy/activity/main/CheckPassTest.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.github.wulkanowy.activity.main; - -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.junit.Test; - -import static org.junit.Assert.*; - -public class CheckPassTest { - - @Test - public void testFailureLogin() throws Exception { - String html = "
Zła nazwa użytkownika lub hasło
"; - Document doc = Jsoup.parse(html); - CheckPass obj = new CheckPass(doc); - - assertFalse(obj.isLogged()); - } - - @Test - public void testSuccessfulLogin() throws Exception { - String html = "Working..."; - Document doc = Jsoup.parse(html); - CheckPass check = new CheckPass(doc); - - assertTrue(check.isLogged()); - } -} diff --git a/app/src/test/java/io/github/wulkanowy/api/login/LoginTest.java b/app/src/test/java/io/github/wulkanowy/api/login/LoginTest.java new file mode 100644 index 000000000..5bbfc27c4 --- /dev/null +++ b/app/src/test/java/io/github/wulkanowy/api/login/LoginTest.java @@ -0,0 +1,13 @@ +package io.github.wulkanowy.api.login; + +import org.junit.Test; + +import static org.junit.Assert.*; + +public class LoginTest { + + @Test + public void login() throws Exception { + assertEquals(4, 2 + 2); + } +}