Skip to content

Commit

Permalink
Version 2.0
Browse files Browse the repository at this point in the history
  • Loading branch information
mminichino committed Dec 22, 2022
1 parent aa7514b commit d40bbab
Show file tree
Hide file tree
Showing 7 changed files with 128 additions and 48 deletions.
18 changes: 11 additions & 7 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ android {
defaultConfig {
applicationId "com.example.sgwdemo"
minSdk 26
targetSdk 32
targetSdk 33
versionCode 1
versionName "1.0"

Expand Down Expand Up @@ -39,20 +39,24 @@ dependencies {

implementation 'androidx.core:core-ktx:1.9.0'
implementation 'androidx.appcompat:appcompat:1.5.1'
implementation 'com.google.android.material:material:1.6.1'
implementation 'com.google.android.material:material:1.7.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'com.couchbase.lite:couchbase-lite-android-ktx:3.0.2'
implementation("androidx.navigation:navigation-fragment-ktx:2.5.2")
implementation("androidx.navigation:navigation-ui-ktx:2.5.2")
implementation("androidx.navigation:navigation-fragment-ktx:2.5.3")
implementation("androidx.navigation:navigation-ui-ktx:2.5.3")
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.recyclerview:recyclerview:1.2.1'
implementation 'androidx.databinding:viewbinding:7.3.0'
implementation 'androidx.databinding:viewbinding:7.3.1'
implementation 'androidx.core:core-ktx:1.9.0'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
androidTestImplementation 'androidx.test.ext:junit:1.1.4'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.0'
implementation "androidx.core:core-ktx:1.9.0"
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'com.google.code.gson:gson:2.8.9'
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'com.squareup.retrofit2:converter-scalars:2.9.0'
}
repositories {
mavenCentral()
Expand Down
3 changes: 3 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@
xmlns:tools="http://schemas.android.com/tools"
package="com.example.sgwdemo">

<uses-permission
android:name="android.permission.INTERNET" />

<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
Expand Down
1 change: 1 addition & 0 deletions app/src/main/assets/config.properties
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@ sgwhost=192.168.1.10
database=employees
username=sguser
password=password
authEndpoint=192.168.1.10
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ class CouchbaseConnect(context: Context) {

private var TAG = "CBL-Demo"
private var cntx: Context = context
private var instance: CouchbaseConnect? = null
// private var instance: CouchbaseConnect? = null
var db: Database? = null
var replicator: Replicator? = null
var listenerToken: ListenerToken? = null
Expand Down Expand Up @@ -79,14 +79,15 @@ class CouchbaseConnect(context: Context) {
}
}

fun syncDatabase(username: String) {
Log.i(TAG, "DB Sync -> $username")
fun syncDatabase(session: String, cookie: String) {
Log.i(TAG, "DB Session Cookie -> $cookie")
replicator = Replicator(
ReplicatorConfigurationFactory.create(
database = db,
target = URLEndpoint(URI(connectString)),
type = ReplicatorType.PUSH_AND_PULL,
authenticator = BasicAuthenticator(username, password!!.toCharArray()),
// authenticator = BasicAuthenticator(username, password!!.toCharArray()),
authenticator = SessionAuthenticator(session, cookie),
continuous = true
)
)
Expand Down
124 changes: 89 additions & 35 deletions app/src/main/java/com/example/sgwdemo/login/LoginActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -9,23 +9,37 @@ import android.view.View
import android.widget.EditText
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.isVisible
import com.example.sgwdemo.R
import com.example.sgwdemo.main.MainActivity
import com.example.sgwdemo.cbdb.CouchbaseConnect
import com.example.sgwdemo.main.MainActivity
import com.example.sgwdemo.util.Util
import com.google.android.material.progressindicator.CircularProgressIndicator
import com.google.gson.Gson
import com.google.gson.GsonBuilder
import okhttp3.Interceptor
import okhttp3.OkHttpClient
import okhttp3.Request
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import retrofit2.http.GET
import retrofit2.http.Path
import java.security.MessageDigest
import java.util.*
import kotlinx.coroutines.*


class LoginActivity : AppCompatActivity() {

private var TAG = "LoginActivity"
private val TAG = "LoginActivity"
var usernameInput: EditText? = null
var passwordInput: EditText? = null
var storeIdInput: EditText? = null
var progress: CircularProgressIndicator? = null
var authEndpoint: String? = null
var authUrl: String? = null
var gson: Gson? = null

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Expand All @@ -34,16 +48,18 @@ class LoginActivity : AppCompatActivity() {
passwordInput = findViewById(R.id.passwordInput)
storeIdInput = findViewById(R.id.storeIdInput)
progress = findViewById(R.id.progressBarLoginWait)
authEndpoint = Util.getProperty("authEndpoint", applicationContext)
gson = GsonBuilder()
.setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
.create()
authUrl = "http://$authEndpoint:8080"
}

fun onLoginTapped(view: View?) {
val cntx: Context = getApplicationContext()
val db: CouchbaseConnect = CouchbaseConnect.getInstance(this)
val storeId = storeIdInput!!.text.toString()
val username = usernameInput!!.text.toString()
val password = passwordInput!!.text.toString()
val passwordHashed = hashPassword(password)
var employeePassword: String? = null

if (usernameInput!!.length() == 0 || passwordInput!!.length() == 0 || storeId.isEmpty()) {
showMessageDialog("Missing Information",
Expand All @@ -52,37 +68,64 @@ class LoginActivity : AppCompatActivity() {
}

progress!!.visibility = View.VISIBLE
setupDb(storeId)

for (iterationCount in 1..100) {
employeePassword = db.getEmployeePassword(username)
if (employeePassword != null) {
break
} else {
Thread.sleep(100)
}
}

if (employeePassword == null) {
showMessageDialog("Timeout",
"Timeout waiting for data sync")
return
val sgwLogin = "store_id@$storeId"
val credentials = "$username:$password"
val authHeaderValue = "Basic " + Base64
.getEncoder()
.encodeToString(credentials.toByteArray(Charsets.UTF_8))

val interceptor = Interceptor { chain ->
val newRequest: Request =
chain.request()
.newBuilder()
.addHeader("Authorization", authHeaderValue).build()
chain.proceed(newRequest)
}

Log.i(TAG, "Login employee ID -> $username")
val builder = OkHttpClient.Builder()
builder.interceptors().add(interceptor)
val client = builder.build()

if (employeePassword != passwordHashed) {
showMessageDialog("Incorrect Password",
"The password you entered is incorrect")
return
}
Log.d(TAG, "Auth URL: $authUrl")

val intent = Intent(cntx, MainActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
or Intent.FLAG_ACTIVITY_CLEAR_TASK)
intent.putExtra("StoreID",storeId)
intent.putExtra("UserName",username)
startActivity(intent)
val service = Retrofit.Builder()
.baseUrl(authUrl!!)
.addConverterFactory(GsonConverterFactory.create(gson!!))
.client(client)
.build()
.create(SessionService::class.java)

val call: Call<SessionResponse> = service.getSession(sgwLogin)
call.enqueue(object : Callback<SessionResponse> {

override fun onFailure(call: Call<SessionResponse>, t: Throwable) {
Log.d(TAG, "Auth API called failed")
t.printStackTrace()
showMessageDialog("Error",
"Authorization Service Unavailable")
}

override fun onResponse(call: Call<SessionResponse>, response: Response<SessionResponse>) {
if (response.isSuccessful) {
Log.d(TAG, "Session " + response.body()!!.session_id)
Log.d(TAG, "Cookie " + response.body()!!.cookie_name)

setupDb(storeId, response.body()!!.cookie_name, response.body()!!.session_id)

val intent = Intent(cntx, MainActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
or Intent.FLAG_ACTIVITY_CLEAR_TASK)
intent.putExtra("StoreID",storeId)
intent.putExtra("UserName",username)
startActivity(intent)
} else {
showMessageDialog("Unauthorized",
"Login was not successful")
}
progress!!.visibility = View.INVISIBLE
}
})
}

private fun hashPassword(password: String): String {
Expand All @@ -104,7 +147,7 @@ class LoginActivity : AppCompatActivity() {
builder.show()
}

fun setupDb(storeId: String) {
fun setupDb(storeId: String, sessionCookie: String, sessionId: String) {
val db: CouchbaseConnect = CouchbaseConnect.getInstance(this)

if (!db.isDbOpen()) {
Expand All @@ -115,7 +158,18 @@ class LoginActivity : AppCompatActivity() {

db.init()
db.openDatabase(dbUser)
db.syncDatabase(dbUser)
db.syncDatabase(sessionId, sessionCookie)
}
}
}

data class SessionResponse(
val cookie_name: String,
val expires: String,
val session_id: String
)

interface SessionService {
@GET("/api/v1/auth/name/{username}")
fun getSession(@Path("username") username: String): Call<SessionResponse>
}
17 changes: 17 additions & 0 deletions app/src/main/java/com/example/sgwdemo/util/Util.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.example.sgwdemo.util

import android.content.Context
import android.content.res.AssetManager
import java.io.InputStream
import java.util.*


object Util {
fun getProperty(key: String?, context: Context): String {
val properties = Properties()
val assetManager: AssetManager = context.assets
val inputStream: InputStream = assetManager.open("config.properties")
properties.load(inputStream)
return properties.getProperty(key)
}
}
4 changes: 2 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ buildscript {
}
}
plugins {
id 'com.android.application' version '7.3.0' apply false
id 'com.android.library' version '7.3.0' apply false
id 'com.android.application' version '7.3.1' apply false
id 'com.android.library' version '7.3.1' apply false
id 'org.jetbrains.kotlin.android' version '1.7.10' apply false
}

Expand Down

0 comments on commit d40bbab

Please sign in to comment.