Reuse FU identity session
This commit is contained in:
@@ -370,7 +370,7 @@ public class MainActivity extends AppCompatActivity
|
|||||||
accountByType,
|
accountByType,
|
||||||
KVVContentProvider.PROVIDER_NAME,
|
KVVContentProvider.PROVIDER_NAME,
|
||||||
Bundle.EMPTY,
|
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,
|
accountByType,
|
||||||
KVVContentProvider.PROVIDER_NAME,
|
KVVContentProvider.PROVIDER_NAME,
|
||||||
Bundle.EMPTY,
|
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);
|
Meal meal = getMeal(position);
|
||||||
viewHolder.mTitle.setText(meal.getName());
|
viewHolder.mTitle.setText(meal.getName());
|
||||||
String value;
|
String value;
|
||||||
switch (Preferences.getString(mContext, R.array.pref_price_group)) {
|
switch (Preferences.getStringArray(mContext, R.array.pref_price_group)) {
|
||||||
case "student":
|
case "student":
|
||||||
if (meal.getPriceStdnt() < 0)
|
if (meal.getPriceStdnt() < 0)
|
||||||
value = mContext.getResources().getString(R.string.no_price_available);
|
value = mContext.getResources().getString(R.string.no_price_available);
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import java.util.concurrent.atomic.AtomicReference;
|
|||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import de.sebse.fuplanner.R;
|
import de.sebse.fuplanner.R;
|
||||||
import de.sebse.fuplanner.services.kvv.sync.BBLogin;
|
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.sync.KVVLogin;
|
||||||
import de.sebse.fuplanner.tools.logging.Logger;
|
import de.sebse.fuplanner.tools.logging.Logger;
|
||||||
import de.sebse.fuplanner.tools.network.NetworkErrorCallback;
|
import de.sebse.fuplanner.tools.network.NetworkErrorCallback;
|
||||||
@@ -49,8 +50,9 @@ public class UserLoginTask extends AsyncTask<Void, Void, String> {
|
|||||||
mUsername = username;
|
mUsername = username;
|
||||||
mPassword = password;
|
mPassword = password;
|
||||||
mTokenType = tokenType;
|
mTokenType = tokenType;
|
||||||
mKVVLogin = new KVVLogin(context);
|
FULogin mFULogin = new FULogin(context);
|
||||||
mBBLogin = new BBLogin(context);
|
mKVVLogin = new KVVLogin(context, mFULogin);
|
||||||
|
mBBLogin = new BBLogin(context, mFULogin);
|
||||||
if (context instanceof FUAuthenticatorActivity)
|
if (context instanceof FUAuthenticatorActivity)
|
||||||
mActivity = (FUAuthenticatorActivity) context;
|
mActivity = (FUAuthenticatorActivity) context;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import de.sebse.fuplanner.services.fulogin.AccountGeneral;
|
import de.sebse.fuplanner.services.fulogin.AccountGeneral;
|
||||||
import de.sebse.fuplanner.services.kvv.sync.BBLogin;
|
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.sync.KVVLogin;
|
||||||
import de.sebse.fuplanner.services.kvv.types.LoginTokenBB;
|
import de.sebse.fuplanner.services.kvv.types.LoginTokenBB;
|
||||||
import de.sebse.fuplanner.services.kvv.types.LoginTokenKVV;
|
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) {
|
private void testLoginToken(@NotNull LoginTokenKVV tokenKVV, @NotNull LoginTokenBB tokenBB, @NotNull NetworkCallback<Pair<LoginTokenKVV, LoginTokenBB>> callback, @NotNull NetworkErrorCallback errorCallback) {
|
||||||
new KVVLogin(getContext()).testLoginToken(tokenKVV, tokenKVV1 -> {
|
FULogin mFULogin = new FULogin(getContext());
|
||||||
new BBLogin(getContext()).testLoginToken(tokenBB, tokenBB1 -> {
|
new KVVLogin(getContext(), mFULogin).testLoginToken(tokenKVV, tokenKVV1 -> {
|
||||||
|
new BBLogin(getContext(), mFULogin).testLoginToken(tokenBB, tokenBB1 -> {
|
||||||
callback.onResponse(new Pair<>(tokenKVV1, tokenBB1));
|
callback.onResponse(new Pair<>(tokenKVV1, tokenBB1));
|
||||||
}, errorCallback);
|
}, errorCallback);
|
||||||
}, errorCallback);
|
}, errorCallback);
|
||||||
|
|||||||
@@ -120,7 +120,7 @@ public class ModulesAnnouncements extends PartModules<ArrayList<Announcement>> {
|
|||||||
String title = site.getString("title");
|
String title = site.getString("title");
|
||||||
String text = site.getJSONObject("body").getString("rawText");
|
String text = site.getJSONObject("body").getString("rawText");
|
||||||
text = String.valueOf(fromHtml(text));
|
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'");
|
long createdOn = UtilsDate.stringToMillis(site.getString("startDateRestriction"), "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
|
||||||
ArrayList<String> urls = new ArrayList<>();
|
ArrayList<String> urls = new ArrayList<>();
|
||||||
|
|
||||||
|
|||||||
@@ -17,8 +17,11 @@ import de.sebse.fuplanner.tools.network.NetworkError;
|
|||||||
import de.sebse.fuplanner.tools.network.NetworkErrorCallback;
|
import de.sebse.fuplanner.tools.network.NetworkErrorCallback;
|
||||||
|
|
||||||
public class BBLogin extends HTTPService {
|
public class BBLogin extends HTTPService {
|
||||||
public BBLogin(Context context) {
|
private final FULogin mFULogin;
|
||||||
|
|
||||||
|
public BBLogin(Context context, FULogin fuLogin) {
|
||||||
super(context);
|
super(context);
|
||||||
|
this.mFULogin = fuLogin;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testLoginToken(@NotNull LoginTokenBB token, @NotNull NetworkCallback<LoginTokenBB> callback, @NotNull NetworkErrorCallback errorCallback) {
|
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) {
|
public void doLogin(String username, String password, NetworkCallback<LoginTokenBB> callback, NetworkErrorCallback error) {
|
||||||
step1(success1 -> {
|
step1(success1 -> {
|
||||||
String samlLocation = success1.get("Location");
|
String samlLocation = success1.get("Location");
|
||||||
step2(samlLocation, success2 -> {
|
mFULogin.fulogin(samlLocation, username, password, samlResponse -> {
|
||||||
String fuJSESSIONID = success2.get("JSESSIONID");
|
|
||||||
step3(fuJSESSIONID, success3 -> {
|
|
||||||
step4(username, password, fuJSESSIONID, success4 -> {
|
|
||||||
String samlResponse = success4.get("SAMLResponse");
|
|
||||||
step5(samlResponse, success5 -> {
|
step5(samlResponse, success5 -> {
|
||||||
String shibsessionKey = success5.get("shibsessionKey");
|
String shibsessionKey = success5.get("shibsessionKey");
|
||||||
String shibsessionName = success5.get("shibsessionName");
|
String shibsessionName = success5.get("shibsessionName");
|
||||||
@@ -75,8 +74,6 @@ public class BBLogin extends HTTPService {
|
|||||||
}, error);
|
}, error);
|
||||||
}, error);
|
}, 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!")));
|
}, 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
|
5= POST https://lms.fu-berlin.de/Shibboleth.sso/SAML2/POST
|
||||||
@@ -233,34 +151,4 @@ public class BBLogin extends HTTPService {
|
|||||||
callback.onResponse(object);
|
callback.onResponse(object);
|
||||||
}, error -> errorCallback.onError(new NetworkError(100260, error.networkResponse.statusCode, "Cannot finish login process!")));
|
}, 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;
|
import de.sebse.fuplanner.tools.network.NetworkErrorCallback;
|
||||||
|
|
||||||
public class KVVLogin extends HTTPService {
|
public class KVVLogin extends HTTPService {
|
||||||
public KVVLogin(Context context) {
|
private final FULogin mFULogin;
|
||||||
|
|
||||||
|
public KVVLogin(Context context, FULogin fuLogin) {
|
||||||
super(context);
|
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) {
|
public void doLogin(String username, String password, NetworkCallback<LoginTokenKVV> callback, NetworkErrorCallback error) {
|
||||||
step1(success1 -> {
|
step1(success1 -> {
|
||||||
String samlLocation = success1.get("Location");
|
String samlLocation = success1.get("Location");
|
||||||
step2(samlLocation, success2 -> {
|
mFULogin.fulogin(samlLocation, username, password, samlResponse -> {
|
||||||
String fuJSESSIONID = success2.get("JSESSIONID");
|
|
||||||
step3(fuJSESSIONID, success3 -> {
|
|
||||||
step4(username, password, fuJSESSIONID, success4 -> {
|
|
||||||
String samlResponse = success4.get("SAMLResponse");
|
|
||||||
step5(samlResponse, success5 -> {
|
step5(samlResponse, success5 -> {
|
||||||
String shibsessionKey = success5.get("shibsessionKey");
|
String shibsessionKey = success5.get("shibsessionKey");
|
||||||
String shibsessionName = success5.get("shibsessionName");
|
String shibsessionName = success5.get("shibsessionName");
|
||||||
@@ -74,8 +73,6 @@ public class KVVLogin extends HTTPService {
|
|||||||
}, error);
|
}, error);
|
||||||
}, error);
|
}, 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!")));
|
}, 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
|
5= POST https://kvv.imp.fu-berlin.de/Shibboleth.sso/SAML2/POST
|
||||||
+ Body: SAMLResponse=[SAML-RESPONSE]
|
+ Body: SAMLResponse=[SAML-RESPONSE]
|
||||||
@@ -231,34 +147,4 @@ public class KVVLogin extends HTTPService {
|
|||||||
callback.onResponse(object);
|
callback.onResponse(object);
|
||||||
}, error -> errorCallback.onError(new NetworkError(100160, error.networkResponse.statusCode, "Cannot finish login process!")));
|
}, 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;
|
import androidx.preference.PreferenceManager;
|
||||||
|
|
||||||
public class Preferences {
|
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);
|
String[] strings = context.getResources().getStringArray(key);
|
||||||
return PreferenceManager.getDefaultSharedPreferences(context).getString(strings[0], strings[1]);
|
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) {
|
public static long getLong(Context context, @StringRes int key) {
|
||||||
String string = context.getResources().getString(key);
|
String string = context.getResources().getString(key);
|
||||||
return PreferenceManager.getDefaultSharedPreferences(context).getLong(string, 0);
|
return PreferenceManager.getDefaultSharedPreferences(context).getLong(string, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void setLong(Context context, @StringRes int key, long value) {
|
public static void setLong(Context context, @StringRes int key, long value) {
|
||||||
String string = context.getResources().getString(key);
|
String string = context.getResources().getString(key);
|
||||||
PreferenceManager.getDefaultSharedPreferences(context).edit().putLong(string, value).apply();
|
PreferenceManager.getDefaultSharedPreferences(context).edit().putLong(string, value).apply();
|
||||||
@@ -26,7 +35,6 @@ public class Preferences {
|
|||||||
String string = context.getResources().getString(key);
|
String string = context.getResources().getString(key);
|
||||||
return PreferenceManager.getDefaultSharedPreferences(context).getBoolean(string, false);
|
return PreferenceManager.getDefaultSharedPreferences(context).getBoolean(string, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void setBoolean(Context context, @StringRes int key, boolean value) {
|
public static void setBoolean(Context context, @StringRes int key, boolean value) {
|
||||||
String string = context.getResources().getString(key);
|
String string = context.getResources().getString(key);
|
||||||
PreferenceManager.getDefaultSharedPreferences(context).edit().putBoolean(string, value).apply();
|
PreferenceManager.getDefaultSharedPreferences(context).edit().putBoolean(string, value).apply();
|
||||||
|
|||||||
@@ -15,6 +15,8 @@ import java.io.UnsupportedEncodingException;
|
|||||||
import java.net.URLEncoder;
|
import java.net.URLEncoder;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import de.sebse.fuplanner.tools.EventListener;
|
import de.sebse.fuplanner.tools.EventListener;
|
||||||
@@ -200,4 +202,24 @@ public class HTTPService {
|
|||||||
protected Context getContext() {
|
protected Context getContext() {
|
||||||
return mContext;
|
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_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">
|
<string-array name="pref_sync_frequency" translatable="false">
|
||||||
<item>@string/pref_sync_frequency</item>
|
<item>@string/pref_sync_frequency</item>
|
||||||
<item>@string/pref_sync_frequency_default</item>
|
<item>@string/pref_sync_frequency_default</item>
|
||||||
|
|||||||
Reference in New Issue
Block a user