aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorMarvin Borner2018-08-17 18:38:53 +0200
committerMarvin Borner2018-08-17 18:38:53 +0200
commit35c5af9d71cbeff5403c32754c4cf8a37399543f (patch)
tree04fdcda3cb33ac6cc98b6ee1ba1f83b2237e516a
parente19577b5ebd40c235f933ac54d61f1c6442cd71a (diff)
Added working login verification on app start
-rw-r--r--app/src/main/AndroidManifest.xml13
-rw-r--r--app/src/main/java/com/no_name/no_name/InitialActivity.kt39
-rw-r--r--app/src/main/java/com/no_name/no_name/LoginActivity.kt32
-rw-r--r--app/src/main/java/com/no_name/no_name/MainActivity.kt25
-rw-r--r--app/src/main/java/com/no_name/no_name/SecureStorage.kt22
5 files changed, 102 insertions, 29 deletions
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 31cb83c..29c7f56 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -10,17 +10,14 @@
<uses-permission android:name="android.permission.INTERNET" />
<application
- tools:replace="android:allowBackup"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
- android:theme="@style/AppTheme">
- <activity
- android:name=".MainActivity"
- android:label="@string/app_name"
- android:theme="@style/AppTheme.NoActionBar">
+ android:theme="@style/AppTheme"
+ tools:replace="android:allowBackup">
+ <activity android:name=".InitialActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@@ -28,6 +25,10 @@
</intent-filter>
</activity>
<activity
+ android:name=".MainActivity"
+ android:label="@string/app_name"
+ android:theme="@style/AppTheme.NoActionBar"></activity>
+ <activity
android:name=".LoginActivity"
android:label="@string/title_activity_login"></activity>
</application>
diff --git a/app/src/main/java/com/no_name/no_name/InitialActivity.kt b/app/src/main/java/com/no_name/no_name/InitialActivity.kt
new file mode 100644
index 0000000..9e7f27c
--- /dev/null
+++ b/app/src/main/java/com/no_name/no_name/InitialActivity.kt
@@ -0,0 +1,39 @@
+package com.no_name.no_name
+
+import android.content.Intent
+import android.os.Bundle
+import android.support.v7.app.AppCompatActivity
+import com.github.kittinunf.fuel.android.extension.responseJson
+import com.github.kittinunf.fuel.core.FuelManager
+import com.github.kittinunf.fuel.httpGet
+import com.madapps.prefrences.EasyPrefrences
+
+/**
+ * Activity which will be run before any other to verify user and choose which activity
+ * should be started next
+ */
+class InitialActivity : AppCompatActivity() {
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ FuelManager.instance.basePath = "http://192.168.0.59"
+ verifyLogin()
+ }
+
+ private fun verifyLogin() {
+ val accessToken: String? = SecureStorage(this@InitialActivity).get("access_token")
+ var intent = Intent(this@InitialActivity, LoginActivity::class.java)
+
+ if (accessToken != null) { // TODO: Check if user has internet connection, if not -> show MA without verification
+ val userID = EasyPrefrences(this@InitialActivity).getString("user_id")
+ "/users/$userID".httpGet() // synced function of fuel doesn't work here (#331) -> ugly workaround
+ .header("Authorization" to "Bearer $accessToken")
+ .responseJson { _, _, result ->
+ val (_, error) = result
+ if (error == null) intent = Intent(this@InitialActivity, MainActivity::class.java)
+ startActivity(intent)
+ }
+ } else {
+ startActivity(intent)
+ }
+ }
+} \ No newline at end of file
diff --git a/app/src/main/java/com/no_name/no_name/LoginActivity.kt b/app/src/main/java/com/no_name/no_name/LoginActivity.kt
index 154eb63..78289b4 100644
--- a/app/src/main/java/com/no_name/no_name/LoginActivity.kt
+++ b/app/src/main/java/com/no_name/no_name/LoginActivity.kt
@@ -26,6 +26,7 @@ import android.widget.TextView
import android.widget.Toast
import com.github.kittinunf.fuel.android.extension.responseJson
import com.github.kittinunf.fuel.httpPost
+import com.madapps.prefrences.EasyPrefrences
import kotlinx.android.synthetic.main.activity_login.*
import org.json.JSONObject
import java.util.*
@@ -39,10 +40,12 @@ class LoginActivity : AppCompatActivity(), LoaderCallbacks<Cursor> {
*/
private var mAuthTask: UserLoginTask? = null
+ /**
+ * Set up the login form and initial configuration
+ */
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_login)
- // Set up the login form.
populateAutoComplete()
password.setOnEditorActionListener(TextView.OnEditorActionListener { _, id, _ ->
if (id == EditorInfo.IME_ACTION_DONE || id == EditorInfo.IME_NULL) {
@@ -191,6 +194,9 @@ class LoginActivity : AppCompatActivity(), LoaderCallbacks<Cursor> {
}
}
+ /**
+ * Things executed while creation of the loader
+ */
override fun onCreateLoader(i: Int, bundle: Bundle?): Loader<Cursor> {
return CursorLoader(this,
// Retrieve data rows for the device user's 'profile' contact.
@@ -206,6 +212,9 @@ class LoginActivity : AppCompatActivity(), LoaderCallbacks<Cursor> {
ContactsContract.Contacts.Data.IS_PRIMARY + " DESC")
}
+ /**
+ * Things executed when loading is finished -> shown if login wasn't successful
+ */
override fun onLoadFinished(cursorLoader: Loader<Cursor>, cursor: Cursor) {
val emails = ArrayList<String>()
cursor.moveToFirst()
@@ -242,21 +251,29 @@ class LoginActivity : AppCompatActivity(), LoaderCallbacks<Cursor> {
* the user.
*/
inner class UserLoginTask internal constructor(private val mEmail: String, private val mPassword: String) : AsyncTask<Void, Void, Boolean>() {
-
+ /**
+ * Login processing and verifying
+ */
override fun doInBackground(vararg params: Void): Boolean? {
val credentialJson = JSONObject()
credentialJson.put("email", mEmail)
credentialJson.put("password", mPassword)
- val (request, response, result) = "/login".httpPost()
+ val (_, _, result) = "/login".httpPost()
.header("Content-Type" to "application/json")
.body(credentialJson.toString())
.responseJson()
result.fold(success = {
- val secureStorage = SecureStorage(this@LoginActivity)
val accessToken = result.get().obj().getString("access_token")
+ val userID = result.get().obj().getString("user_id")
+
+ val sharedPrefs = EasyPrefrences(this@LoginActivity)
+ sharedPrefs.putString("user_id", userID)
+
+ val secureStorage = SecureStorage(this@LoginActivity)
secureStorage.set("access_token", accessToken)
+
val verifyToken = secureStorage.get("access_token")
return verifyToken == accessToken
}, failure = {
@@ -264,6 +281,9 @@ class LoginActivity : AppCompatActivity(), LoaderCallbacks<Cursor> {
})
}
+ /**
+ * Runs after [doInBackground], starts actions depending on [success]
+ */
override fun onPostExecute(success: Boolean?) {
mAuthTask = null
showProgress(false)
@@ -282,6 +302,9 @@ class LoginActivity : AppCompatActivity(), LoaderCallbacks<Cursor> {
}
}
+ /**
+ * Executed if login process was cancelled
+ */
override fun onCancelled() {
mAuthTask = null
showProgress(false)
@@ -289,7 +312,6 @@ class LoginActivity : AppCompatActivity(), LoaderCallbacks<Cursor> {
}
companion object {
-
/**
* Id to identity READ_CONTACTS permission request.
*/
diff --git a/app/src/main/java/com/no_name/no_name/MainActivity.kt b/app/src/main/java/com/no_name/no_name/MainActivity.kt
index 10ae784..f44e873 100644
--- a/app/src/main/java/com/no_name/no_name/MainActivity.kt
+++ b/app/src/main/java/com/no_name/no_name/MainActivity.kt
@@ -1,39 +1,40 @@
package com.no_name.no_name
-import android.content.Intent
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.view.Menu
import android.view.MenuItem
-import com.github.kittinunf.fuel.core.FuelManager
import kotlinx.android.synthetic.main.activity_main.*
+/**
+ * Main activity aka home screen of app
+ */
class MainActivity : AppCompatActivity() {
-
+ /**
+ * Set initial configuration
+ */
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setSupportActionBar(toolbar)
- FuelManager.instance.basePath = "http://192.168.0.59"
fab.setOnClickListener { view ->
- //Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
- //.setAction("Action", null).show()
- val intent = Intent(this@MainActivity, LoginActivity::class.java)
- startActivity(intent)
+ // TODO: Set FAB onclick event
}
}
+ /**
+ * Inflate the [menu]; this adds items to the action bar if it is present
+ */
override fun onCreateOptionsMenu(menu: Menu): Boolean {
- // Inflate the menu; this adds items to the action bar if it is present.
menuInflater.inflate(R.menu.menu_main, menu)
return true
}
+ /**
+ * Handling action bar [item] clicks
+ */
override fun onOptionsItemSelected(item: MenuItem): Boolean {
- // Handle action bar item clicks here. The action bar will
- // automatically handle clicks on the Home/Up button, so long
- // as you specify a parent activity in AndroidManifest.xml.
return when (item.itemId) {
R.id.action_settings -> true
else -> super.onOptionsItemSelected(item)
diff --git a/app/src/main/java/com/no_name/no_name/SecureStorage.kt b/app/src/main/java/com/no_name/no_name/SecureStorage.kt
index 5072f0d..ff14167 100644
--- a/app/src/main/java/com/no_name/no_name/SecureStorage.kt
+++ b/app/src/main/java/com/no_name/no_name/SecureStorage.kt
@@ -7,14 +7,26 @@ import com.kazakago.cryptore.CipherAlgorithm
import com.kazakago.cryptore.Cryptore
import com.madapps.prefrences.EasyPrefrences
-
+/**
+ * Class for saving data securely in SharedPreferences
+ */
class SecureStorage(private val context: Context) {
- public fun set(key: String, value: String) {
+ /**
+ * Encrypts and saves the [value] with [key] as index
+ */
+ fun set(key: String, value: String) {
sharedPrefs.putString(key, encryptAES(value))
}
- public fun get(key: String): String {
- return decryptAES(sharedPrefs.getString(key))
+ /**
+ * Finds the encrypted value by [key], decrypts it and returns the value as string
+ */
+ fun get(key: String): String? {
+ return try {
+ decryptAES(sharedPrefs.getString(key))
+ } catch (e: Exception) {
+ null
+ }
}
private val sharedPrefs = EasyPrefrences(context)
@@ -26,8 +38,6 @@ class SecureStorage(private val context: Context) {
private val cryptoreAES: Cryptore by lazy {
val builder = Cryptore.Builder(alias = Alias.AES.value, type = CipherAlgorithm.AES)
- // builder.blockMode = BlockMode.CBC //If Needed.
- // builder.encryptionPadding = EncryptionPadding.PKCS7 //If Needed.
builder.build()
}