From 593fb78ef238544c038a3d45486bf4c8512df247 Mon Sep 17 00:00:00 2001 From: Caesar2011 Date: Sun, 3 Feb 2019 19:41:40 +0100 Subject: [PATCH] Reuse FU identity session --- .../java/de/sebse/fuplanner/MainActivity.java | 2 +- .../fuplanner/fragments/PrefsFragment.java | 2 +- .../fragments/canteen/MealAdapter.java | 2 +- .../services/fulogin/UserLoginTask.java | 6 +- .../sebse/fuplanner/services/kvv/Login.java | 6 +- .../services/kvv/ModulesAnnouncements.java | 2 +- .../fuplanner/services/kvv/sync/BBLogin.java | 138 ++--------------- .../fuplanner/services/kvv/sync/FULogin.java | 143 ++++++++++++++++++ .../fuplanner/services/kvv/sync/KVVLogin.java | 138 ++--------------- .../de/sebse/fuplanner/tools/Preferences.java | 14 +- .../fuplanner/tools/network/HTTPService.java | 22 +++ app/src/main/res/values/preferences.xml | 2 + 12 files changed, 215 insertions(+), 262 deletions(-) create mode 100644 app/src/main/java/de/sebse/fuplanner/services/kvv/sync/FULogin.java diff --git a/app/src/main/java/de/sebse/fuplanner/MainActivity.java b/app/src/main/java/de/sebse/fuplanner/MainActivity.java index f074cb9..8043adc 100644 --- a/app/src/main/java/de/sebse/fuplanner/MainActivity.java +++ b/app/src/main/java/de/sebse/fuplanner/MainActivity.java @@ -370,7 +370,7 @@ public class MainActivity extends AppCompatActivity accountByType, KVVContentProvider.PROVIDER_NAME, Bundle.EMPTY, - Long.parseLong(Preferences.getString(this, R.array.pref_sync_frequency))); + Long.parseLong(Preferences.getStringArray(this, R.array.pref_sync_frequency))); } } diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/PrefsFragment.java b/app/src/main/java/de/sebse/fuplanner/fragments/PrefsFragment.java index 1b715e6..119f6ff 100644 --- a/app/src/main/java/de/sebse/fuplanner/fragments/PrefsFragment.java +++ b/app/src/main/java/de/sebse/fuplanner/fragments/PrefsFragment.java @@ -63,7 +63,7 @@ public class PrefsFragment extends PreferenceFragmentCompat implements SharedPre accountByType, KVVContentProvider.PROVIDER_NAME, Bundle.EMPTY, - Long.parseLong(Preferences.getString(getActivity(), R.array.pref_sync_frequency))); + Long.parseLong(Preferences.getStringArray(getActivity(), R.array.pref_sync_frequency))); } } } diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/canteen/MealAdapter.java b/app/src/main/java/de/sebse/fuplanner/fragments/canteen/MealAdapter.java index 21fee6b..23a0cfc 100644 --- a/app/src/main/java/de/sebse/fuplanner/fragments/canteen/MealAdapter.java +++ b/app/src/main/java/de/sebse/fuplanner/fragments/canteen/MealAdapter.java @@ -56,7 +56,7 @@ class MealAdapter extends RecyclerView.Adapter { Meal meal = getMeal(position); viewHolder.mTitle.setText(meal.getName()); String value; - switch (Preferences.getString(mContext, R.array.pref_price_group)) { + switch (Preferences.getStringArray(mContext, R.array.pref_price_group)) { case "student": if (meal.getPriceStdnt() < 0) value = mContext.getResources().getString(R.string.no_price_available); diff --git a/app/src/main/java/de/sebse/fuplanner/services/fulogin/UserLoginTask.java b/app/src/main/java/de/sebse/fuplanner/services/fulogin/UserLoginTask.java index 01fcb0e..7172e4e 100644 --- a/app/src/main/java/de/sebse/fuplanner/services/fulogin/UserLoginTask.java +++ b/app/src/main/java/de/sebse/fuplanner/services/fulogin/UserLoginTask.java @@ -15,6 +15,7 @@ import java.util.concurrent.atomic.AtomicReference; import androidx.annotation.Nullable; import de.sebse.fuplanner.R; import de.sebse.fuplanner.services.kvv.sync.BBLogin; +import de.sebse.fuplanner.services.kvv.sync.FULogin; import de.sebse.fuplanner.services.kvv.sync.KVVLogin; import de.sebse.fuplanner.tools.logging.Logger; import de.sebse.fuplanner.tools.network.NetworkErrorCallback; @@ -49,8 +50,9 @@ public class UserLoginTask extends AsyncTask { mUsername = username; mPassword = password; mTokenType = tokenType; - mKVVLogin = new KVVLogin(context); - mBBLogin = new BBLogin(context); + FULogin mFULogin = new FULogin(context); + mKVVLogin = new KVVLogin(context, mFULogin); + mBBLogin = new BBLogin(context, mFULogin); if (context instanceof FUAuthenticatorActivity) mActivity = (FUAuthenticatorActivity) context; } diff --git a/app/src/main/java/de/sebse/fuplanner/services/kvv/Login.java b/app/src/main/java/de/sebse/fuplanner/services/kvv/Login.java index 6923fa3..ebf9241 100644 --- a/app/src/main/java/de/sebse/fuplanner/services/kvv/Login.java +++ b/app/src/main/java/de/sebse/fuplanner/services/kvv/Login.java @@ -8,6 +8,7 @@ import org.jetbrains.annotations.NotNull; import androidx.annotation.Nullable; import de.sebse.fuplanner.services.fulogin.AccountGeneral; import de.sebse.fuplanner.services.kvv.sync.BBLogin; +import de.sebse.fuplanner.services.kvv.sync.FULogin; import de.sebse.fuplanner.services.kvv.sync.KVVLogin; import de.sebse.fuplanner.services.kvv.types.LoginTokenBB; import de.sebse.fuplanner.services.kvv.types.LoginTokenKVV; @@ -100,8 +101,9 @@ public class Login extends HTTPService { } private void testLoginToken(@NotNull LoginTokenKVV tokenKVV, @NotNull LoginTokenBB tokenBB, @NotNull NetworkCallback> callback, @NotNull NetworkErrorCallback errorCallback) { - new KVVLogin(getContext()).testLoginToken(tokenKVV, tokenKVV1 -> { - new BBLogin(getContext()).testLoginToken(tokenBB, tokenBB1 -> { + FULogin mFULogin = new FULogin(getContext()); + new KVVLogin(getContext(), mFULogin).testLoginToken(tokenKVV, tokenKVV1 -> { + new BBLogin(getContext(), mFULogin).testLoginToken(tokenBB, tokenBB1 -> { callback.onResponse(new Pair<>(tokenKVV1, tokenBB1)); }, errorCallback); }, errorCallback); diff --git a/app/src/main/java/de/sebse/fuplanner/services/kvv/ModulesAnnouncements.java b/app/src/main/java/de/sebse/fuplanner/services/kvv/ModulesAnnouncements.java index cb5c26f..0c00d14 100644 --- a/app/src/main/java/de/sebse/fuplanner/services/kvv/ModulesAnnouncements.java +++ b/app/src/main/java/de/sebse/fuplanner/services/kvv/ModulesAnnouncements.java @@ -120,7 +120,7 @@ public class ModulesAnnouncements extends PartModules> { String title = site.getString("title"); String text = site.getJSONObject("body").getString("rawText"); text = String.valueOf(fromHtml(text)); - String createdBy = "";//site.getString("createdByDisplayName"); + String createdBy = "";//site.getStringArray("createdByDisplayName"); long createdOn = UtilsDate.stringToMillis(site.getString("startDateRestriction"), "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); ArrayList urls = new ArrayList<>(); diff --git a/app/src/main/java/de/sebse/fuplanner/services/kvv/sync/BBLogin.java b/app/src/main/java/de/sebse/fuplanner/services/kvv/sync/BBLogin.java index d2d2956..fe156b2 100644 --- a/app/src/main/java/de/sebse/fuplanner/services/kvv/sync/BBLogin.java +++ b/app/src/main/java/de/sebse/fuplanner/services/kvv/sync/BBLogin.java @@ -17,8 +17,11 @@ import de.sebse.fuplanner.tools.network.NetworkError; import de.sebse.fuplanner.tools.network.NetworkErrorCallback; public class BBLogin extends HTTPService { - public BBLogin(Context context) { + private final FULogin mFULogin; + + public BBLogin(Context context, FULogin fuLogin) { super(context); + this.mFULogin = fuLogin; } public void testLoginToken(@NotNull LoginTokenBB token, @NotNull NetworkCallback callback, @NotNull NetworkErrorCallback errorCallback) { @@ -58,21 +61,15 @@ public class BBLogin extends HTTPService { public void doLogin(String username, String password, NetworkCallback callback, NetworkErrorCallback error) { step1(success1 -> { String samlLocation = success1.get("Location"); - step2(samlLocation, success2 -> { - String fuJSESSIONID = success2.get("JSESSIONID"); - step3(fuJSESSIONID, success3 -> { - step4(username, password, fuJSESSIONID, success4 -> { - String samlResponse = success4.get("SAMLResponse"); - step5(samlResponse, success5 -> { - String shibsessionKey = success5.get("shibsessionKey"); - String shibsessionName = success5.get("shibsessionName"); - step6(shibsessionKey, shibsessionName, success6 -> { - String s_session_id = success6.get("s_session_id"); - String session_id = success6.get("session_id"); - LoginTokenBB token = new LoginTokenBB(username, s_session_id, session_id); - callback.onResponse(token); - }, error); - }, error); + mFULogin.fulogin(samlLocation, username, password, samlResponse -> { + step5(samlResponse, success5 -> { + String shibsessionKey = success5.get("shibsessionKey"); + String shibsessionName = success5.get("shibsessionName"); + step6(shibsessionKey, shibsessionName, success6 -> { + String s_session_id = success6.get("s_session_id"); + String session_id = success6.get("session_id"); + LoginTokenBB token = new LoginTokenBB(username, s_session_id, session_id); + callback.onResponse(token); }, error); }, error); }, error); @@ -96,86 +93,7 @@ public class BBLogin extends HTTPService { }, error -> errorCallback.onError(new NetworkError(100210, error.networkResponse.statusCode, "Error on getting SAML request!"))); } - /* - 2= GET [Location-Header 1] - -> Set-Cookie: JSESSIONID=[JSESSION-FU] - -> Location: /idp-fub/profile/SAML2/Redirect/SSO?execution=e1s1 - */ - private void step2(String url, final NetworkCallback> callback, final NetworkErrorCallback errorCallback) { - get(url, null, response -> { - String cookies = response.getHeaders().get("Set-Cookie"); - if (cookies==null) { - errorCallback.onError(new NetworkError(100221, -1, "Error on starting FU session!")); - return; - } - HashMap object; - try { - object = getCookie(cookies, new String[]{"JSESSIONID"}); - } catch (NoSuchFieldException e) { - errorCallback.onError(new NetworkError(100222, -1, "Error on starting FU session!")); - return; - } - callback.onResponse(object); - }, error -> errorCallback.onError(new NetworkError(100220, error.networkResponse.statusCode, "Error on starting FU session!"))); - } - /* - 3= GET [Location-Header 2] - + Cookie: JSESSIONID=[JSESSION-FU] - */ - private void step3(String JSESSIONID_FU, final NetworkCallback callback, final NetworkErrorCallback errorCallback) { - HashMap cookies = new HashMap<>(); - cookies.put("JSESSIONID", JSESSIONID_FU); - head("https://identity.fu-berlin.de/idp-fub/profile/SAML2/Redirect/SSO?execution=e1s1", cookies, response -> { - callback.onResponse(true); - }, error -> errorCallback.onError(new NetworkError(100230, error.networkResponse.statusCode, "Error starting login page!"))); - } - - /* - 4= POST [Location-Header 2] - + Body: j_username=[USERNAME]&j_password=[PASSWORD]&_eventId_proceed= - + Header: Content-Type: application/x-www-form-urlencoded - + Header: Referer: [Location-Header 2] - + Cookie: JSESSIONID=[JSESSION-FU] - -> Set-Cookie: shib_idp_session=[SHIB-IDP-SESSION] - -> Body SAMLResponse-Input-value - */ - private void step4(String username, String password, String JSESSIONID_FU, final NetworkCallback> callback, final NetworkErrorCallback errorCallback) { - HashMap cookies = new HashMap<>(); - cookies.put("JSESSIONID", JSESSIONID_FU); - HashMap body = new HashMap<>(); - body.put("j_username", username); - body.put("j_password", password); - body.put("_eventId_proceed", ""); - post("https://identity.fu-berlin.de/idp-fub/profile/SAML2/Redirect/SSO?execution=e1s1", cookies, body, response -> { - String content = response.getParsed(); - if (content == null) { - errorCallback.onError(new NetworkError(100243, -1, "Error on getting SAML response!")); - return; - } - - String cookies1 = response.getHeaders().get("Set-Cookie"); - if (cookies1 ==null) { - errorCallback.onError(new NetworkError(100241, -1, "Error on logging in to FU Identity Server!")); - return; - } - HashMap object; - try { - object = getCookie(cookies1, new String[]{"shib_idp_session"}); - } catch (NoSuchFieldException e) { - errorCallback.onError(new NetworkError(100242, -1, "Error on logging in to FU Identity Server!")); - return; - } - Pattern pattern = Pattern.compile("name=\"SAMLResponse\" value=\"([0-9a-zA-Z+]+=*)"); - Matcher matcher = pattern.matcher(content); - if (!matcher.find()) { - errorCallback.onError(new NetworkError(100244, -1, "Error on getting SAML response!")); - return; - } - object.put("SAMLResponse", matcher.group(1)); - callback.onResponse(object); - }, error -> errorCallback.onError(new NetworkError(100245, error.networkResponse.statusCode, "Error on logging in to FU Identity Server!"))); - } /* 5= POST https://lms.fu-berlin.de/Shibboleth.sso/SAML2/POST @@ -233,34 +151,4 @@ public class BBLogin extends HTTPService { callback.onResponse(object); }, error -> errorCallback.onError(new NetworkError(100260, error.networkResponse.statusCode, "Cannot finish login process!"))); } - - - - - - - - - - - - - private String getCookie(String cookies, String name) throws NoSuchFieldException { - Pattern pattern = Pattern.compile(name+"=([^;]+);"); - Matcher matcher = pattern.matcher(cookies); - if (!matcher.find()) { - log.e("GETcookie failed", name); - log.e("GETcookie failed", cookies); - throw new NoSuchFieldException(); - } - return matcher.group(1); - } - - private HashMap getCookie(String cookies, String[] names) throws NoSuchFieldException { - HashMap result = new HashMap<>(); - for (String name: names) { - result.put(name,this.getCookie(cookies, name)); - } - return result; - } } diff --git a/app/src/main/java/de/sebse/fuplanner/services/kvv/sync/FULogin.java b/app/src/main/java/de/sebse/fuplanner/services/kvv/sync/FULogin.java new file mode 100644 index 0000000..220a230 --- /dev/null +++ b/app/src/main/java/de/sebse/fuplanner/services/kvv/sync/FULogin.java @@ -0,0 +1,143 @@ +package de.sebse.fuplanner.services.kvv.sync; + +import android.content.Context; + +import java.util.HashMap; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import androidx.annotation.Nullable; +import de.sebse.fuplanner.R; +import de.sebse.fuplanner.tools.Preferences; +import de.sebse.fuplanner.tools.network.HTTPService; +import de.sebse.fuplanner.tools.network.NetworkCallback; +import de.sebse.fuplanner.tools.network.NetworkError; +import de.sebse.fuplanner.tools.network.NetworkErrorCallback; + +public class FULogin extends HTTPService { + public FULogin(Context context) { + super(context); + } + + public void fulogin(String requestURI, String username, String password, final NetworkCallback callback, final NetworkErrorCallback errorCallback) { + String old_shib_idp_session = Preferences.getString(getContext(), R.string.pref_shib_idp_session); + step2(requestURI, old_shib_idp_session, success2 -> { + String samlResp = success2.get("SAMLResponse"); + if (samlResp != null) { + callback.onResponse(samlResp); + return; + } + String fuJSESSIONID = success2.get("JSESSIONID"); + step3(fuJSESSIONID, success3 -> { + step4(username, password, fuJSESSIONID, success4 -> { + String shib_idp_session = success4.get("shib_idp_session"); + Preferences.setString(getContext(), R.string.pref_shib_idp_session, shib_idp_session); + String samlResponse = success4.get("SAMLResponse"); + if (samlResponse != null) + callback.onResponse(samlResponse); + else + errorCallback.onError(new NetworkError(100300, -1, "Cannot get SAML Response!")); + }, errorCallback); + }, errorCallback); + }, errorCallback); + } + + /* + 2= GET [Location-Header 1] + -> Set-Cookie: JSESSIONID=[JSESSION-FU] + -> Location: /idp-fub/profile/SAML2/Redirect/SSO?execution=e1s1 + */ + private void step2(String url, @Nullable String shib_idp_session, final NetworkCallback> callback, final NetworkErrorCallback errorCallback) { + HashMap cookiesReq = null; + if (shib_idp_session != null) { + cookiesReq = new HashMap<>(); + cookiesReq.put("shib_idp_session", shib_idp_session); + } + get(url, cookiesReq, response -> { + String body = response.getParsed(); + if (body != null) { + Pattern pattern = Pattern.compile("name=\"SAMLResponse\" value=\"([0-9a-zA-Z+]+=*)"); + Matcher matcher = pattern.matcher(body); + if (!matcher.find()) { + errorCallback.onError(new NetworkError(100344, -1, "Error on getting SAML response!")); + return; + } + HashMap object = new HashMap<>(); + object.put("SAMLResponse", matcher.group(1)); + callback.onResponse(object); + return; + } + String cookies = response.getHeaders().get("Set-Cookie"); + if (cookies == null) { + errorCallback.onError(new NetworkError(100321, -1, "Error on starting FU session!")); + return; + } + HashMap object; + try { + object = getCookie(cookies, new String[]{"JSESSIONID"}); + } catch (NoSuchFieldException e) { + errorCallback.onError(new NetworkError(100322, -1, "Error on starting FU session!")); + return; + } + callback.onResponse(object); + }, error -> errorCallback.onError(new NetworkError(100320, error.networkResponse.statusCode, "Error on starting FU session!"))); + } + + /* + 3= GET [Location-Header 2] + + Cookie: JSESSIONID=[JSESSION-FU] + */ + private void step3(String JSESSIONID_FU, final NetworkCallback callback, final NetworkErrorCallback errorCallback) { + HashMap cookies = new HashMap<>(); + cookies.put("JSESSIONID", JSESSIONID_FU); + head("https://identity.fu-berlin.de/idp-fub/profile/SAML2/Redirect/SSO?execution=e1s1", cookies, response -> { + callback.onResponse(true); + }, error -> errorCallback.onError(new NetworkError(100330, error.networkResponse.statusCode, "Error starting login page!"))); + } + + /* + 4= POST [Location-Header 2] + + Body: j_username=[USERNAME]&j_password=[PASSWORD]&_eventId_proceed= + + Header: Content-Type: application/x-www-form-urlencoded + + Header: Referer: [Location-Header 2] + + Cookie: JSESSIONID=[JSESSION-FU] + -> Set-Cookie: shib_idp_session=[SHIB-IDP-SESSION] + -> Body SAMLResponse-Input-value + */ + private void step4(String username, String password, String JSESSIONID_FU, final NetworkCallback> callback, final NetworkErrorCallback errorCallback) { + HashMap cookies = new HashMap<>(); + cookies.put("JSESSIONID", JSESSIONID_FU); + HashMap body = new HashMap<>(); + body.put("j_username", username); + body.put("j_password", password); + body.put("_eventId_proceed", ""); + post("https://identity.fu-berlin.de/idp-fub/profile/SAML2/Redirect/SSO?execution=e1s1", cookies, body, response -> { + String content = response.getParsed(); + if (content == null) { + errorCallback.onError(new NetworkError(100343, -1, "Error on getting SAML response!")); + return; + } + + String cookies1 = response.getHeaders().get("Set-Cookie"); + if (cookies1 ==null) { + errorCallback.onError(new NetworkError(100341, -1, "Error on logging in to FU Identity Server!")); + return; + } + HashMap object; + try { + object = getCookie(cookies1, new String[]{"shib_idp_session"}); + } catch (NoSuchFieldException e) { + errorCallback.onError(new NetworkError(100342, -1, "Error on logging in to FU Identity Server!")); + return; + } + Pattern pattern = Pattern.compile("name=\"SAMLResponse\" value=\"([0-9a-zA-Z+]+=*)"); + Matcher matcher = pattern.matcher(content); + if (!matcher.find()) { + errorCallback.onError(new NetworkError(100344, -1, "Error on getting SAML response!")); + return; + } + object.put("SAMLResponse", matcher.group(1)); + callback.onResponse(object); + }, error -> errorCallback.onError(new NetworkError(100345, error.networkResponse.statusCode, "Error on logging in to FU Identity Server!"))); + } +} diff --git a/app/src/main/java/de/sebse/fuplanner/services/kvv/sync/KVVLogin.java b/app/src/main/java/de/sebse/fuplanner/services/kvv/sync/KVVLogin.java index 01f0299..0c22888 100644 --- a/app/src/main/java/de/sebse/fuplanner/services/kvv/sync/KVVLogin.java +++ b/app/src/main/java/de/sebse/fuplanner/services/kvv/sync/KVVLogin.java @@ -17,8 +17,11 @@ import de.sebse.fuplanner.tools.network.NetworkError; import de.sebse.fuplanner.tools.network.NetworkErrorCallback; public class KVVLogin extends HTTPService { - public KVVLogin(Context context) { + private final FULogin mFULogin; + + public KVVLogin(Context context, FULogin fuLogin) { super(context); + this.mFULogin = fuLogin; } @@ -58,20 +61,14 @@ public class KVVLogin extends HTTPService { public void doLogin(String username, String password, NetworkCallback callback, NetworkErrorCallback error) { step1(success1 -> { String samlLocation = success1.get("Location"); - step2(samlLocation, success2 -> { - String fuJSESSIONID = success2.get("JSESSIONID"); - step3(fuJSESSIONID, success3 -> { - step4(username, password, fuJSESSIONID, success4 -> { - String samlResponse = success4.get("SAMLResponse"); - step5(samlResponse, success5 -> { - String shibsessionKey = success5.get("shibsessionKey"); - String shibsessionName = success5.get("shibsessionName"); - step6(shibsessionKey, shibsessionName, success6 -> { - String kvvJSESSIONID = success6.get("JSESSIONID"); - LoginTokenKVV token = new LoginTokenKVV(username, kvvJSESSIONID); - callback.onResponse(token); - }, error); - }, error); + mFULogin.fulogin(samlLocation, username, password, samlResponse -> { + step5(samlResponse, success5 -> { + String shibsessionKey = success5.get("shibsessionKey"); + String shibsessionName = success5.get("shibsessionName"); + step6(shibsessionKey, shibsessionName, success6 -> { + String kvvJSESSIONID = success6.get("JSESSIONID"); + LoginTokenKVV token = new LoginTokenKVV(username, kvvJSESSIONID); + callback.onResponse(token); }, error); }, error); }, error); @@ -95,87 +92,6 @@ public class KVVLogin extends HTTPService { }, error -> errorCallback.onError(new NetworkError(100110, error.networkResponse.statusCode, "Error on getting SAML request!"))); } - /* - 2= GET [Location-Header 1] - -> Set-Cookie: JSESSIONID=[JSESSION-FU] - -> Location: /idp-fub/profile/SAML2/Redirect/SSO?execution=e1s1 - */ - private void step2(String url, final NetworkCallback> callback, final NetworkErrorCallback errorCallback) { - get(url, null, response -> { - String cookies = response.getHeaders().get("Set-Cookie"); - if (cookies==null) { - errorCallback.onError(new NetworkError(100121, -1, "Error on starting FU session!")); - return; - } - HashMap object; - try { - object = getCookie(cookies, new String[]{"JSESSIONID"}); - } catch (NoSuchFieldException e) { - errorCallback.onError(new NetworkError(100122, -1, "Error on starting FU session!")); - return; - } - callback.onResponse(object); - }, error -> errorCallback.onError(new NetworkError(100120, error.networkResponse.statusCode, "Error on starting FU session!"))); - } - - /* - 3= GET [Location-Header 2] - + Cookie: JSESSIONID=[JSESSION-FU] - */ - private void step3(String JSESSIONID_FU, final NetworkCallback callback, final NetworkErrorCallback errorCallback) { - HashMap cookies = new HashMap<>(); - cookies.put("JSESSIONID", JSESSIONID_FU); - head("https://identity.fu-berlin.de/idp-fub/profile/SAML2/Redirect/SSO?execution=e1s1", cookies, response -> { - callback.onResponse(true); - }, error -> errorCallback.onError(new NetworkError(100130, error.networkResponse.statusCode, "Error starting login page!"))); - } - - /* - 4= POST [Location-Header 2] - + Body: j_username=[USERNAME]&j_password=[PASSWORD]&_eventId_proceed= - + Header: Content-Type: application/x-www-form-urlencoded - + Header: Referer: [Location-Header 2] - + Cookie: JSESSIONID=[JSESSION-FU] - -> Set-Cookie: shib_idp_session=[SHIB-IDP-SESSION] - -> Body SAMLResponse-Input-value - */ - private void step4(String username, String password, String JSESSIONID_FU, final NetworkCallback> callback, final NetworkErrorCallback errorCallback) { - HashMap cookies = new HashMap<>(); - cookies.put("JSESSIONID", JSESSIONID_FU); - HashMap body = new HashMap<>(); - body.put("j_username", username); - body.put("j_password", password); - body.put("_eventId_proceed", ""); - post("https://identity.fu-berlin.de/idp-fub/profile/SAML2/Redirect/SSO?execution=e1s1", cookies, body, response -> { - String content = response.getParsed(); - if (content == null) { - errorCallback.onError(new NetworkError(100143, -1, "Error on getting SAML response!")); - return; - } - - String cookies1 = response.getHeaders().get("Set-Cookie"); - if (cookies1 ==null) { - errorCallback.onError(new NetworkError(100141, -1, "Error on logging in to FU Identity Server!")); - return; - } - HashMap object; - try { - object = getCookie(cookies1, new String[]{"shib_idp_session"}); - } catch (NoSuchFieldException e) { - errorCallback.onError(new NetworkError(100142, -1, "Error on logging in to FU Identity Server!")); - return; - } - Pattern pattern = Pattern.compile("name=\"SAMLResponse\" value=\"([0-9a-zA-Z+]+=*)"); - Matcher matcher = pattern.matcher(content); - if (!matcher.find()) { - errorCallback.onError(new NetworkError(100144, -1, "Error on getting SAML response!")); - return; - } - object.put("SAMLResponse", matcher.group(1)); - callback.onResponse(object); - }, error -> errorCallback.onError(new NetworkError(100145, error.networkResponse.statusCode, "Error on logging in to FU Identity Server!"))); - } - /* 5= POST https://kvv.imp.fu-berlin.de/Shibboleth.sso/SAML2/POST + Body: SAMLResponse=[SAML-RESPONSE] @@ -231,34 +147,4 @@ public class KVVLogin extends HTTPService { callback.onResponse(object); }, error -> errorCallback.onError(new NetworkError(100160, error.networkResponse.statusCode, "Cannot finish login process!"))); } - - - - - - - - - - - - - private String getCookie(String cookies, String name) throws NoSuchFieldException { - Pattern pattern = Pattern.compile(name+"=([^;]+);"); - Matcher matcher = pattern.matcher(cookies); - if (!matcher.find()) { - log.e("GETcookie failed", name); - log.e("GETcookie failed", cookies); - throw new NoSuchFieldException(); - } - return matcher.group(1); - } - - private HashMap getCookie(String cookies, String[] names) throws NoSuchFieldException { - HashMap result = new HashMap<>(); - for (String name: names) { - result.put(name,this.getCookie(cookies, name)); - } - return result; - } } diff --git a/app/src/main/java/de/sebse/fuplanner/tools/Preferences.java b/app/src/main/java/de/sebse/fuplanner/tools/Preferences.java index c86eede..1fb529c 100644 --- a/app/src/main/java/de/sebse/fuplanner/tools/Preferences.java +++ b/app/src/main/java/de/sebse/fuplanner/tools/Preferences.java @@ -7,16 +7,25 @@ import androidx.annotation.StringRes; import androidx.preference.PreferenceManager; public class Preferences { - public static String getString(Context context, @ArrayRes int key) { + public static String getStringArray(Context context, @ArrayRes int key) { String[] strings = context.getResources().getStringArray(key); return PreferenceManager.getDefaultSharedPreferences(context).getString(strings[0], strings[1]); } + + public static String getString(Context context, @StringRes int key) { + String string = context.getResources().getString(key); + return PreferenceManager.getDefaultSharedPreferences(context).getString(string, null); + } + public static void setString(Context context, @StringRes int key, String value) { + String string = context.getResources().getString(key); + PreferenceManager.getDefaultSharedPreferences(context).edit().putString(string, value).apply(); + } + public static long getLong(Context context, @StringRes int key) { String string = context.getResources().getString(key); return PreferenceManager.getDefaultSharedPreferences(context).getLong(string, 0); } - public static void setLong(Context context, @StringRes int key, long value) { String string = context.getResources().getString(key); PreferenceManager.getDefaultSharedPreferences(context).edit().putLong(string, value).apply(); @@ -26,7 +35,6 @@ public class Preferences { String string = context.getResources().getString(key); return PreferenceManager.getDefaultSharedPreferences(context).getBoolean(string, false); } - public static void setBoolean(Context context, @StringRes int key, boolean value) { String string = context.getResources().getString(key); PreferenceManager.getDefaultSharedPreferences(context).edit().putBoolean(string, value).apply(); diff --git a/app/src/main/java/de/sebse/fuplanner/tools/network/HTTPService.java b/app/src/main/java/de/sebse/fuplanner/tools/network/HTTPService.java index 41a027c..0425330 100644 --- a/app/src/main/java/de/sebse/fuplanner/tools/network/HTTPService.java +++ b/app/src/main/java/de/sebse/fuplanner/tools/network/HTTPService.java @@ -15,6 +15,8 @@ import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.HashMap; import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import androidx.annotation.Nullable; import de.sebse.fuplanner.tools.EventListener; @@ -200,4 +202,24 @@ public class HTTPService { protected Context getContext() { return mContext; } + + + protected String getCookie(String cookies, String name) throws NoSuchFieldException { + Pattern pattern = Pattern.compile(name+"=([^;]+);"); + Matcher matcher = pattern.matcher(cookies); + if (!matcher.find()) { + log.e("GETcookie failed", name); + log.e("GETcookie failed", cookies); + throw new NoSuchFieldException(); + } + return matcher.group(1); + } + + protected HashMap getCookie(String cookies, String[] names) throws NoSuchFieldException { + HashMap result = new HashMap<>(); + for (String name: names) { + result.put(name,this.getCookie(cookies, name)); + } + return result; + } } diff --git a/app/src/main/res/values/preferences.xml b/app/src/main/res/values/preferences.xml index 9b36f25..7786f35 100644 --- a/app/src/main/res/values/preferences.xml +++ b/app/src/main/res/values/preferences.xml @@ -11,6 +11,8 @@ pref_set_auto_sync_on_startup + pref_shib_idp_session + @string/pref_sync_frequency @string/pref_sync_frequency_default