Skip to content

Commit

Permalink
Merge pull request #202 from HackIllinois/staff-login-fix
Browse files Browse the repository at this point in the history
Block non-staff from using staff login
  • Loading branch information
patrickfeltes authored Jan 25, 2020
2 parents d456d58 + 08ead63 commit b08560a
Showing 1 changed file with 41 additions and 13 deletions.
54 changes: 41 additions & 13 deletions app/src/main/java/org/hackillinois/android/view/LoginActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,11 @@ import com.google.android.material.snackbar.Snackbar
import androidx.appcompat.app.AppCompatActivity
import android.util.Log
import kotlinx.android.synthetic.main.activity_login.*
import org.hackillinois.android.API
import org.hackillinois.android.App
import org.hackillinois.android.R
import org.hackillinois.android.common.JWTUtilities
import org.hackillinois.android.database.entity.Roles
import org.hackillinois.android.model.auth.Code
import org.hackillinois.android.model.auth.JWT
import retrofit2.Call
Expand Down Expand Up @@ -43,21 +45,22 @@ class LoginActivity : AppCompatActivity() {
override fun onResume() {
super.onResume()

val intent = getIntent()

intent ?: return
val intent = intent ?: return
intent.action ?: return

val uri = intent.data
val uri = intent.data ?: return

uri ?: return
val code = uri.getQueryParameter("code") ?: return

val code = uri.getQueryParameter("code")
var api = App.getAPI()
finishLogin(code)
}

private fun finishLogin(code: String) {
// TODO: update to Retrofit 2.6.0 and use suspend functions to remove nested callbacks
var api = App.getAPI()
api.getJWT(getOAuthProvider(), redirectUri, Code(code)).enqueue(object : Callback<JWT> {
override fun onFailure(call: Call<JWT>, t: Throwable) {
Snackbar.make(findViewById(android.R.id.content), "Failed to login", Snackbar.LENGTH_SHORT).show()
showFailedToLogin()
}

override fun onResponse(call: Call<JWT>, response: Response<JWT>) {
Expand All @@ -70,29 +73,54 @@ class LoginActivity : AppCompatActivity() {
Log.e("LoginActivity", "Notifications update timed out!")
}
}
JWTUtilities.writeJWT(applicationContext, it)
runOnUiThread {

if (getOAuthProvider() == "google") {
verifyStaffRole(api, it)
} else {
JWTUtilities.writeJWT(applicationContext, it)
launchMainActivity()
}
}
}
})
}

private fun verifyStaffRole(api: API, jwt: String) {
api.roles().enqueue(object : Callback<Roles> {
override fun onFailure(call: Call<Roles>, t: Throwable) {
showFailedToLogin()
}

override fun onResponse(call: Call<Roles>, response: Response<Roles>) {
if (response.isSuccessful &&
response.body()?.roles?.contains("Staff") == true) {
JWTUtilities.writeJWT(applicationContext, jwt)
launchMainActivity()
} else {
showFailedToLogin()
}
}
})
}

private fun showFailedToLogin() {
Snackbar.make(findViewById(android.R.id.content), "Failed to login", Snackbar.LENGTH_SHORT).show()
}

fun launchMainActivity() {
val mainIntent = Intent(this, MainActivity::class.java)
startActivity(mainIntent)
finish()
}

fun redirectToOAuthProvider(provider: String) {
private fun redirectToOAuthProvider(provider: String) {
val intent = Intent(Intent.ACTION_VIEW)
intent.setData(Uri.parse(authUriTemplate.format(provider, redirectUri)))
intent.data = Uri.parse(authUriTemplate.format(provider, redirectUri))
setOAuthProvider(provider)
startActivity(intent)
}

fun setOAuthProvider(provider: String) {
private fun setOAuthProvider(provider: String) {
val editor = applicationContext.getSharedPreferences(applicationContext.getString(R.string.authorization_pref_file_key), Context.MODE_PRIVATE).edit()
editor.putString("provider", provider)
editor.apply()
Expand Down

0 comments on commit b08560a

Please sign in to comment.