1
0
mirror of https://github.com/wulkanowy/wulkanowy.git synced 2024-09-19 23:29:08 -05:00

Create api package (#4)

Create api package and move login's implementation to it
This commit is contained in:
Mikołaj Pich 2017-07-21 19:59:13 +02:00 committed by GitHub
parent 4b425f9b39
commit 3a7cb3b904
15 changed files with 221 additions and 216 deletions

View File

@ -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;
}
}

View File

@ -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<Void, Void, Void> {
String email;
String password;
String county;
Map<String, String> 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);
}
}
}

View File

@ -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<String, Integer, Integer> {
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<String, String> 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);
}
}
}

View File

@ -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();
}
}
}

View File

@ -0,0 +1,16 @@
package io.github.wulkanowy.api;
import java.util.Map;
public class Cookies {
private Map<String, String> cookies;
public void setItems(Map<String, String> items) {
cookies = items;
}
public Map<String, String> getAll() {
return cookies;
}
}

View File

@ -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<String, String> getJar() {
return cookies.getAll();
}
public void setCookies(Map<String, String> items) {
cookies.setItems(items);
}
}

View File

@ -0,0 +1,4 @@
package io.github.wulkanowy.api.login;
public class AccountPermissionException extends Exception {
}

View File

@ -0,0 +1,4 @@
package io.github.wulkanowy.api.login;
public class BadCredentialsException extends Exception {
}

View File

@ -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();
}
}
}

View File

@ -0,0 +1,4 @@
package io.github.wulkanowy.api.login;
public class LoginErrorException extends Exception {
}

View File

@ -12,6 +12,7 @@
<string name="error_feature_text">Funkcja którą chciałeś uruchomić nie działa</string>
<string name="login_accepted">Pomyślnie zalogowano</string>
<string name="login_bad_credentials">Zła nazwa użytkownika lub hasło</string>
<string name="login_bad_account_permission">Brak uprawnień do otwarcia dziennika. Sprawdź wprowadzoną nazwę powiatu</string>
<string name="login_denied">Logowanie nie powiodło się</string>
<string name="please_wait">Proszę czekać…</string>
<string name="title_activity_dashboard">Aktywność dashboard</string>

View File

@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
<string name="urlStepOneRelease" translatable="false">https://cufs.vulcan.net.pl/Default/Account/LogOn</string>
<string name="urlStepTwoRelease" translatable="false">https://cufs.vulcan.net.pl/{locationID}/FS/LS?wa=wsignin1.0&amp;wtrealm=https://uonetplus.vulcan.net.pl/{locationID}/LoginEndpoint.aspx&amp;wctx=https://uonetplus.vulcan.net.pl/{locationID}/LoginEndpoint.aspx</string>
<string name="urlStepThreeRelease" translatable="false">https://uonetplus.vulcan.net.pl/{locationID}/LoginEndpoint.aspx"</string>
<string name="urlStepOneDebug" translatable="false">https://cufsdemo.vulcan.net.pl/Default/Account/LogOn</string>
<string name="urlStepTwoDebug" translatable="false">https://cufsdemo.vulcan.net.pl/{locationID}/FS/LS?wa=wsignin1.0&amp;wtrealm=https://uonetplusdemo.vulcan.net.pl/{locationID}/LoginEndpoint.aspx&amp;wctx=https://uonetplusdemo.vulcan.net.pl/{locationID}/LoginEndpoint.aspx</string>
<string name="urlStepThreeDebug" translatable="false">https://uonetplusdemo.vulcan.net.pl/{locationID}/LoginEndpoint.aspx"</string>
<string name="countyDebug" translatable="false">demouonetplus</string>
</resources>

View File

@ -12,6 +12,7 @@
<string name="error_feature_text">The function you wanted to run does not work</string>
<string name="login_accepted">Login is successful</string>
<string name="login_bad_credentials">Bad username or password</string>
<string name="login_bad_account_permission">No permission to open log. Check entered county name</string>
<string name="login_denied">Login is failed</string>
<string name="please_wait">Please wait…</string>
<string name="title_activity_dashboard">Dashboard Activity</string>

View File

@ -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 = "<div class='ErrorMessage center'>Zła nazwa użytkownika lub hasło</div>";
Document doc = Jsoup.parse(html);
CheckPass obj = new CheckPass(doc);
assertFalse(obj.isLogged());
}
@Test
public void testSuccessfulLogin() throws Exception {
String html = "<title>Working...</title>";
Document doc = Jsoup.parse(html);
CheckPass check = new CheckPass(doc);
assertTrue(check.isLogged());
}
}

View File

@ -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);
}
}