Reuse FU identity session
This commit is contained in:
@@ -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)));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -56,7 +56,7 @@ class MealAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
|
||||
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);
|
||||
|
||||
@@ -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<Void, Void, String> {
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -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<Pair<LoginTokenKVV, LoginTokenBB>> 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);
|
||||
|
||||
@@ -120,7 +120,7 @@ public class ModulesAnnouncements extends PartModules<ArrayList<Announcement>> {
|
||||
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<String> urls = new ArrayList<>();
|
||||
|
||||
|
||||
@@ -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<LoginTokenBB> callback, @NotNull NetworkErrorCallback errorCallback) {
|
||||
@@ -58,11 +61,7 @@ public class BBLogin extends HTTPService {
|
||||
public void doLogin(String username, String password, NetworkCallback<LoginTokenBB> 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");
|
||||
mFULogin.fulogin(samlLocation, username, password, samlResponse -> {
|
||||
step5(samlResponse, success5 -> {
|
||||
String shibsessionKey = success5.get("shibsessionKey");
|
||||
String shibsessionName = success5.get("shibsessionName");
|
||||
@@ -75,8 +74,6 @@ public class BBLogin extends HTTPService {
|
||||
}, error);
|
||||
}, error);
|
||||
}, 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<HashMap<String, String>> 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<String, String> 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<Boolean> callback, final NetworkErrorCallback errorCallback) {
|
||||
HashMap<String, String> 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<HashMap<String, String>> callback, final NetworkErrorCallback errorCallback) {
|
||||
HashMap<String, String> cookies = new HashMap<>();
|
||||
cookies.put("JSESSIONID", JSESSIONID_FU);
|
||||
HashMap<String, String> 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<String, String> 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<String, String> getCookie(String cookies, String[] names) throws NoSuchFieldException {
|
||||
HashMap<String, String> result = new HashMap<>();
|
||||
for (String name: names) {
|
||||
result.put(name,this.getCookie(cookies, name));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<String> 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<HashMap<String, String>> callback, final NetworkErrorCallback errorCallback) {
|
||||
HashMap<String, String> 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<String, String> 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<String, String> 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<Boolean> callback, final NetworkErrorCallback errorCallback) {
|
||||
HashMap<String, String> 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<HashMap<String, String>> callback, final NetworkErrorCallback errorCallback) {
|
||||
HashMap<String, String> cookies = new HashMap<>();
|
||||
cookies.put("JSESSIONID", JSESSIONID_FU);
|
||||
HashMap<String, String> 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<String, String> 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!")));
|
||||
}
|
||||
}
|
||||
@@ -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,11 +61,7 @@ public class KVVLogin extends HTTPService {
|
||||
public void doLogin(String username, String password, NetworkCallback<LoginTokenKVV> 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");
|
||||
mFULogin.fulogin(samlLocation, username, password, samlResponse -> {
|
||||
step5(samlResponse, success5 -> {
|
||||
String shibsessionKey = success5.get("shibsessionKey");
|
||||
String shibsessionName = success5.get("shibsessionName");
|
||||
@@ -74,8 +73,6 @@ public class KVVLogin extends HTTPService {
|
||||
}, error);
|
||||
}, error);
|
||||
}, 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<HashMap<String, String>> 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<String, String> 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<Boolean> callback, final NetworkErrorCallback errorCallback) {
|
||||
HashMap<String, String> 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<HashMap<String, String>> callback, final NetworkErrorCallback errorCallback) {
|
||||
HashMap<String, String> cookies = new HashMap<>();
|
||||
cookies.put("JSESSIONID", JSESSIONID_FU);
|
||||
HashMap<String, String> 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<String, String> 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<String, String> getCookie(String cookies, String[] names) throws NoSuchFieldException {
|
||||
HashMap<String, String> result = new HashMap<>();
|
||||
for (String name: names) {
|
||||
result.put(name,this.getCookie(cookies, name));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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<String, String> getCookie(String cookies, String[] names) throws NoSuchFieldException {
|
||||
HashMap<String, String> result = new HashMap<>();
|
||||
for (String name: names) {
|
||||
result.put(name,this.getCookie(cookies, name));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,6 +11,8 @@
|
||||
|
||||
<string name="pref_set_auto_sync_on_startup" translatable="false">pref_set_auto_sync_on_startup</string>
|
||||
|
||||
<string name="pref_shib_idp_session" translatable="false">pref_shib_idp_session</string>
|
||||
|
||||
<string-array name="pref_sync_frequency" translatable="false">
|
||||
<item>@string/pref_sync_frequency</item>
|
||||
<item>@string/pref_sync_frequency_default</item>
|
||||
|
||||
Reference in New Issue
Block a user