Commit a810e1b5 authored by Varun Patil's avatar Varun Patil

Use SSO for login

parent a5e845c3
...@@ -4,18 +4,12 @@ package app.insti; ...@@ -4,18 +4,12 @@ package app.insti;
import android.app.ProgressDialog; import android.app.ProgressDialog;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.support.design.widget.TextInputLayout;
import android.support.v7.app.AppCompatActivity; import android.support.v7.app.AppCompatActivity;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log; import android.util.Log;
import android.view.KeyEvent; import android.webkit.WebView;
import android.view.View; import android.webkit.WebViewClient;
import android.view.inputmethod.EditorInfo;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.ConnectionResult;
...@@ -33,8 +27,10 @@ import retrofit2.Response; ...@@ -33,8 +27,10 @@ import retrofit2.Response;
public class LoginActivity extends AppCompatActivity { public class LoginActivity extends AppCompatActivity {
private static final String TAG = "LoginActivity"; private static final String TAG = "LoginActivity";
private static final int PLAY_SERVICES_RESOLUTION_REQUEST = 9000; private static final int PLAY_SERVICES_RESOLUTION_REQUEST = 9000;
public static final String USERNAME_ERROR = "Username cannot be blank"; private final String redirectUri = "https://redirecturi";
public static final String PASSWORD_ERROR = "Password cannot be blank"; private final String guestUri = "https://guesturi";
private boolean loggingIn = false;
public String authCode = null;
SessionManager session; SessionManager session;
Context mContext = this; Context mContext = this;
private ProgressDialog progressDialog; private ProgressDialog progressDialog;
...@@ -62,93 +58,46 @@ public class LoginActivity extends AppCompatActivity { ...@@ -62,93 +58,46 @@ public class LoginActivity extends AppCompatActivity {
protected void onStart() { protected void onStart() {
super.onStart(); super.onStart();
final Button loginButton = findViewById(R.id.login_button); WebView webview = (WebView) findViewById(R.id.login_webview);
final EditText usernameEditText = findViewById(R.id.login_username); webview.getSettings().setJavaScriptEnabled(true);
final EditText passwordEditText = findViewById(R.id.login_password); webview.getSettings().setDomStorageEnabled(true);
final TextInputLayout usernameLayout = findViewById(R.id.login_username_layout); webview.setWebViewClient(new WvClient());
final TextInputLayout passwordLayout = findViewById(R.id.login_password_layout); webview.loadUrl("file:///android_asset/login.html");
usernameEditText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
} }
@Override private void login(final String authorizationCode, final String redirectURL) {
public void onTextChanged(CharSequence s, int start, int before, int count) { /* This can be null if play services is hung */
if (usernameEditText.getText().toString().equals("")) { RetrofitInterface retrofitInterface = ServiceGenerator.createService(RetrofitInterface.class);
usernameLayout.setError(USERNAME_ERROR); Call<LoginResponse> call;
if (FirebaseInstanceId.getInstance().getToken() == null) {
call = retrofitInterface.login(authorizationCode, redirectURL);
} else { } else {
usernameLayout.setError(null); call = retrofitInterface.login(authorizationCode, redirectURL, FirebaseInstanceId.getInstance().getToken());
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
passwordEditText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
} }
call.enqueue(new Callback<LoginResponse>() {
@Override @Override
public void onTextChanged(CharSequence s, int start, int before, int count) { public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) {
if (passwordEditText.getText().toString().equals("")) { if (response.isSuccessful()) {
passwordLayout.setError(PASSWORD_ERROR); session.createLoginSession(response.body().getUser().getUserName(), response.body().getUser(), response.body().getSessionID());
progressDialog.dismiss();
openMainActivity();
finish();
} else { } else {
passwordLayout.setError(null); Toast.makeText(LoginActivity.this, "Authorization Failed!", Toast.LENGTH_LONG).show();
} progressDialog.dismiss();
}
@Override
public void afterTextChanged(Editable s) {
}
});
loginButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String username = usernameEditText.getText().toString();
String password = passwordEditText.getText().toString();
passwordEditText.setText("");
passwordLayout.setError(null);
if (username.equals("")) {
usernameLayout.setError(USERNAME_ERROR);
return;
}
if (password.equals("")) {
passwordLayout.setError(PASSWORD_ERROR);
return;
}
login(username, password);
}
});
passwordEditText.setImeOptions(EditorInfo.IME_ACTION_DONE);
passwordEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_DONE) {
loginButton.performClick();
} }
return false;
} }
});
final TextView guestView = findViewById(R.id.login_guest);
guestView.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onFailure(Call<LoginResponse> call, Throwable t) {
openMainActivity(); //Network Error
} }
}); });
} }
private void login(final String username, final String password) { @Deprecated
private void passLogin(final String username, final String password) {
if (!progressDialog.isShowing()) { if (!progressDialog.isShowing()) {
progressDialog.setMessage("Logging In"); progressDialog.setMessage("Logging In");
progressDialog.setCancelable(false); progressDialog.setCancelable(false);
...@@ -170,24 +119,22 @@ public class LoginActivity extends AppCompatActivity { ...@@ -170,24 +119,22 @@ public class LoginActivity extends AppCompatActivity {
call.enqueue(new Callback<LoginResponse>() { call.enqueue(new Callback<LoginResponse>() {
@Override @Override
public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) { public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) {
loggingIn = false;
if (response.isSuccessful()) { if (response.isSuccessful()) {
Log.d(TAG, "Login request successful"); Log.d(TAG, "Login request successful");
session.createLoginSession(username, response.body().getUser(), response.body().getSessionID()); session.createLoginSession(username, response.body().getUser(), response.body().getSessionID());
progressDialog.dismiss(); progressDialog.dismiss();
openMainActivity(); openMainActivity();
finish(); finish();
//Save credentials in AccountManager to keep user logged in
//Go to MainActivity
} else { } else {
Toast.makeText(LoginActivity.this, "Authorization Failed!", Toast.LENGTH_LONG).show(); Toast.makeText(LoginActivity.this, "Authorization Failed!", Toast.LENGTH_LONG).show();
progressDialog.dismiss(); progressDialog.dismiss();
} }
//Server error
} }
@Override @Override
public void onFailure(Call<LoginResponse> call, Throwable t) { public void onFailure(Call<LoginResponse> call, Throwable t) {
//Network Error loggingIn = false;
} }
}); });
} }
...@@ -207,5 +154,52 @@ public class LoginActivity extends AppCompatActivity { ...@@ -207,5 +154,52 @@ public class LoginActivity extends AppCompatActivity {
} }
return true; return true;
} }
private class WvClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(final WebView view, final String url) {
/* Capture redirect */
if (url.startsWith(redirectUri)) {
/* Show progress dialog */
progressDialog.setMessage("Logging In");
progressDialog.setCancelable(false);
progressDialog.setIndeterminate(true);
if (!progressDialog.isShowing()) {
progressDialog.show();
}
loggingIn = true;
/* Get auth code from query */
String query = Uri.parse(url).getQuery();
authCode = query.substring(query.lastIndexOf("=") + 1);
login(authCode, redirectUri);
return true;
}
/* Guest Login */
if (url.startsWith(guestUri)) {
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
startActivity(intent);
return true;
}
if (!progressDialog.isShowing()) {
progressDialog.setMessage("Loading");
progressDialog.setCancelable(false);
progressDialog.setIndeterminate(true);
progressDialog.show();
}
/* Load URL */
view.loadUrl(url);
return false;
}
@Override
public void onPageFinished(WebView view, String url) {
if (progressDialog.isShowing() && !loggingIn) {
progressDialog.dismiss();
}
}
}
} }
...@@ -28,6 +28,9 @@ public interface RetrofitInterface { ...@@ -28,6 +28,9 @@ public interface RetrofitInterface {
@GET("login") @GET("login")
Call<LoginResponse> login(@Query("code") String AUTH_CODE, @Query("redir") String redirectURI, @Query("fcm_id") String fcmID); Call<LoginResponse> login(@Query("code") String AUTH_CODE, @Query("redir") String redirectURI, @Query("fcm_id") String fcmID);
@GET("login")
Call<LoginResponse> login(@Query("code") String AUTH_CODE, @Query("redir") String redirectURI);
@GET("pass-login") @GET("pass-login")
Call<LoginResponse> passwordLogin(@Query("username") String username, @Query("password") String password); Call<LoginResponse> passwordLogin(@Query("username") String username, @Query("password") String password);
......
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:focusable="true"
android:focusableInTouchMode="true"
android:orientation="vertical"> android:orientation="vertical">
<WebView
<LinearLayout android:id="@+id/login_webview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:layout_width="match_parent"
android:layout_height="200dp"
android:layout_marginBottom="20dp"
android:contentDescription="InstiApp"
android:paddingLeft="100dp"
android:paddingRight="100dp"
android:scaleType="fitEnd"
app:srcCompat="@drawable/lotus" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="InstiApp"
android:textAlignment="center"
android:textSize="28sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="100dp"
android:orientation="vertical"
android:padding="20dp">
<android.support.design.widget.TextInputLayout
android:id="@+id/login_username_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:errorEnabled="true">
<android.support.design.widget.TextInputEditText
android:id="@+id/login_username"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="LDAP ID"
android:inputType="text" />
</android.support.design.widget.TextInputLayout>
<android.support.design.widget.TextInputLayout
android:id="@+id/login_password_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:errorEnabled="true"
app:passwordToggleEnabled="true">
<android.support.design.widget.TextInputEditText
android:id="@+id/login_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Password"
android:inputType="textPassword" />
</android.support.design.widget.TextInputLayout>
<Button
android:id="@+id/login_button"
style="@style/Widget.AppCompat.Button.Colored"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="match_parent"
android:text="Log In" android:layout_alignParentBottom="true"
android:textColor="@color/primaryTextColor" /> android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
<TextView android:layout_alignParentStart="true"
android:layout_width="match_parent" android:layout_alignParentTop="false"
android:layout_height="wrap_content" android:layout_alignWithParentIfMissing="false">
android:text="or" </WebView>
android:textAlignment="center" />
</LinearLayout>
<TextView \ No newline at end of file
android:id="@+id/login_guest"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="5dp"
android:text="Continue as a Guest"
android:textAlignment="center"
android:textAllCaps="false"
android:textAppearance="@style/TextAppearance.AppCompat.Light.SearchResult.Subtitle" />
</LinearLayout>
</LinearLayout>
</ScrollView>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment