- Improved asking of password when it is not given in account config.

This commit is contained in:
Juha Heinanen
2020-04-04 19:38:56 +03:00
parent 3d30e38b79
commit a4c849a61f
5 changed files with 148 additions and 57 deletions
@@ -214,6 +214,29 @@ class Account(val accp: String) {
return false return false
} }
fun checkDisplayName(dn: String): Boolean {
if (dn == "") return true
val dnRegex = Regex("^([* .!%_`'~]|[+]|[-a-zA-Z0-9]){1,63}\$")
return dnRegex.matches(dn)
}
fun checkAuthUser(au: String): Boolean {
if (au == "") return true
val ud = au.split("@")
val userIDRegex = Regex("^([* .!%_`'~]|[+]|[-a-zA-Z0-9]){1,63}\$")
val telnoRegex = Regex("^[+]?[0-9]{1,16}\$")
if (ud.size == 1) {
return userIDRegex.matches(ud[0]) || telnoRegex.matches(ud[0])
} else {
return (userIDRegex.matches(ud[0]) || telnoRegex.matches(ud[0])) &&
Utils.checkDomain(ud[1])
}
}
fun checkAuthPass(ap: String): Boolean {
return (ap.length > 0) && (ap.length <= 64) &&
Regex("^[ -~]*\$").matches(ap) && !ap.contains('"')
}
} }
} }
@@ -9,6 +9,10 @@ import android.view.MenuItem
import android.view.View import android.view.View
import android.widget.LinearLayout.LayoutParams import android.widget.LinearLayout.LayoutParams
import android.widget.* import android.widget.*
import com.tutpro.baresip.Account.Companion.checkAuthPass
import com.tutpro.baresip.Account.Companion.checkAuthUser
import com.tutpro.baresip.Account.Companion.checkDisplayName
import com.tutpro.baresip.MainActivity.Companion.aorPasswords
import kotlinx.android.synthetic.main.activity_account.* import kotlinx.android.synthetic.main.activity_account.*
@@ -62,7 +66,7 @@ class AccountActivity : AppCompatActivity() {
authUser.setText(acc.authUser) authUser.setText(acc.authUser)
authPass = findViewById(R.id.AuthPass) as EditText authPass = findViewById(R.id.AuthPass) as EditText
if (MainActivity.aorPasswords.containsKey(aor)) if (aorPasswords.containsKey(aor))
authPass.setText("") authPass.setText("")
else else
authPass.setText(acc.authPass) authPass.setText(acc.authPass)
@@ -246,32 +250,33 @@ class AccountActivity : AppCompatActivity() {
} }
} }
if (ap != acc.authPass) { if (ap != "") {
if (ap != "") { if (ap != acc.authPass) {
if (Utils.checkPrintAscii(ap) && (ap.length <= 64)) { if (checkAuthPass(ap)) {
if (account_set_auth_pass(acc.accp, ap) == 0) { setAuthPass(acc, ap)
acc.authPass = account_auth_pass(acc.accp) aorPasswords.remove(aor)
MainActivity.aorPasswords.remove(aor)
// Log.d("Baresip", "New auth password is ${acc.authPass}")
save = true
} else {
Log.e("Baresip", "Setting of auth pass failed")
}
} else { } else {
Utils.alertView(this, getString(R.string.notice), Utils.alertView(this, getString(R.string.notice),
String.format(getString(R.string.invalid_authentication_password), ap)) String.format(getString(R.string.invalid_authentication_password), ap))
return false return false
} }
} else { } else {
if ((au != "") && !MainActivity.aorPasswords.containsKey(aor)) { if (aorPasswords.containsKey(aor)) {
MainActivity.aorPasswords.put(aor, acc.authPass) aorPasswords.remove(aor)
save = true save = true
} }
} }
} else { } else { // ap == ""
if (MainActivity.aorPasswords.containsKey(aor)) { if (acc.authUser != "") {
MainActivity.aorPasswords.remove(aor) if (!aorPasswords.containsKey(aor)) {
save = true setAuthPass(acc, "")
aorPasswords.put(aor, "")
}
} else {
if (acc.authPass != "") {
setAuthPass(acc, "")
aorPasswords.remove(aor)
}
} }
} }
@@ -457,10 +462,12 @@ class AccountActivity : AppCompatActivity() {
//Api.ua_debug(ua.uap) //Api.ua_debug(ua.uap)
} }
if (regCheck.isChecked) Api.ua_register(ua.uap) if (regCheck.isChecked && !((acc.authUser != "") && (acc.authPass == "")))
Api.ua_register(ua.uap)
BaresipService.activities.remove("account,$accp") BaresipService.activities.remove("account,$accp")
val i = Intent() val i = Intent()
i.putExtra("accp", accp)
setResult(Activity.RESULT_OK, i) setResult(Activity.RESULT_OK, i)
finish() finish()
@@ -470,7 +477,7 @@ class AccountActivity : AppCompatActivity() {
BaresipService.activities.remove("account,$accp") BaresipService.activities.remove("account,$accp")
val i = Intent() val i = Intent()
setResult(Activity.RESULT_OK, i) setResult(Activity.RESULT_CANCELED, i)
finish() finish()
} }
@@ -485,7 +492,7 @@ class AccountActivity : AppCompatActivity() {
BaresipService.activities.remove("account,$accp") BaresipService.activities.remove("account,$accp")
val i = Intent() val i = Intent()
setResult(Activity.RESULT_OK, i) setResult(Activity.RESULT_CANCELED, i)
finish() finish()
super.onBackPressed() super.onBackPressed()
@@ -548,29 +555,20 @@ class AccountActivity : AppCompatActivity() {
} }
} }
private fun setAuthPass(acc: Account, ap: String) {
if (account_set_auth_pass(acc.accp, ap) == 0) {
acc.authPass = account_auth_pass(acc.accp)
aorPasswords.remove(acc.aor)
save = true
} else {
Log.e("Baresip", "Setting of auth pass failed")
}
}
private fun checkOutboundUri(uri: String): Boolean { private fun checkOutboundUri(uri: String): Boolean {
if (!uri.startsWith("sip:")) return false if (!uri.startsWith("sip:")) return false
return Utils.checkHostPortParams(uri.substring(4)) return Utils.checkHostPortParams(uri.substring(4))
} }
private fun checkDisplayName(dn: String): Boolean {
if (dn == "") return true
val dnRegex = Regex("^([* .!%_`'~]|[+]|[-a-zA-Z0-9]){1,63}\$")
return dnRegex.matches(dn)
}
private fun checkAuthUser(au: String): Boolean {
if (au == "") return true
val ud = au.split("@")
val userIDRegex = Regex("^([* .!%_`'~]|[+]|[-a-zA-Z0-9]){1,63}\$")
val telnoRegex = Regex("^[+]?[0-9]{1,16}\$")
if (ud.size == 1) {
return userIDRegex.matches(ud[0]) || telnoRegex.matches(ud[0])
} else {
return (userIDRegex.matches(ud[0]) || telnoRegex.matches(ud[0])) &&
Utils.checkDomain(ud[1])
}
}
} }
@@ -3,10 +3,18 @@ package com.tutpro.baresip
import android.app.Activity import android.app.Activity
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.support.v7.app.AlertDialog
import android.support.v7.app.AppCompatActivity import android.support.v7.app.AppCompatActivity
import android.text.method.HideReturnsTransformationMethod
import android.text.method.PasswordTransformationMethod
import android.view.LayoutInflater
import android.view.Menu import android.view.Menu
import android.view.MenuItem import android.view.MenuItem
import android.view.ViewGroup
import android.widget.* import android.widget.*
import com.tutpro.baresip.Account.Companion.checkAuthPass
import com.tutpro.baresip.MainActivity.Companion.ACCOUNT_CODE
import com.tutpro.baresip.MainActivity.Companion.aorPasswords
import java.util.ArrayList import java.util.ArrayList
@@ -59,13 +67,60 @@ class AccountsActivity : AppCompatActivity() {
val b = Bundle() val b = Bundle()
b.putString("accp", ua.account.accp) b.putString("accp", ua.account.accp)
i.putExtras(b) i.putExtras(b)
startActivity(i) startActivityForResult(i, ACCOUNT_CODE)
} }
} }
} }
} }
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
when (requestCode) {
ACCOUNT_CODE -> {
if (resultCode == Activity.RESULT_OK) {
val aor = Account.find(data!!.getStringExtra("accp"))!!.aor
val ua = UserAgent.uas()[UserAgent.findAorIndex(aor)!!]
if (aorPasswords.containsKey(aor) && aorPasswords[aor] == "")
askPassword(String.format(getString(R.string.account_password), aor), ua)
}
}
}
}
private fun askPassword(title: String, ua: UserAgent) {
val builder = AlertDialog.Builder(this)
builder.setTitle(title)
val viewInflated = LayoutInflater.from(this)
.inflate(R.layout.password_dialog, findViewById(android.R.id.content) as ViewGroup,
false)
val input = viewInflated.findViewById(R.id.password) as EditText
val checkBox = viewInflated.findViewById(R.id.checkbox) as CheckBox
checkBox.setOnCheckedChangeListener { buttonView, isChecked ->
if (isChecked)
input.transformationMethod = HideReturnsTransformationMethod()
else
input.transformationMethod = PasswordTransformationMethod()
}
builder.setView(viewInflated)
builder.setPositiveButton(android.R.string.ok) { dialog, _ ->
dialog.dismiss()
var password = input.text.toString().trim()
if (!checkAuthPass(password)) {
Utils.alertView(this, getString(R.string.notice),
String.format(getString(R.string.invalid_authentication_password), password))
password = ""
}
aorPasswords[ua.account.aor] = password
account_set_auth_pass(ua.account.accp, password)
if (password != "")
if (ua.account.regint > 0) Api.ua_register(ua.uap)
}
builder.setNegativeButton(android.R.string.cancel) { dialog, _ ->
dialog.cancel()
}
builder.show()
}
override fun onOptionsItemSelected(item: MenuItem): Boolean { override fun onOptionsItemSelected(item: MenuItem): Boolean {
if (BaresipService.activities.indexOf("accounts") == -1) return true if (BaresipService.activities.indexOf("accounts") == -1) return true
@@ -19,6 +19,7 @@ import android.text.method.HideReturnsTransformationMethod
import android.text.method.PasswordTransformationMethod import android.text.method.PasswordTransformationMethod
import android.widget.* import android.widget.*
import android.view.* import android.view.*
import com.tutpro.baresip.Account.Companion.checkAuthPass
import java.io.File import java.io.File
import kotlin.collections.ArrayList import kotlin.collections.ArrayList
@@ -951,7 +952,7 @@ class MainActivity : AppCompatActivity() {
} }
} }
private fun askPassword(title: String) { private fun askPassword(title: String, ua: UserAgent? = null) {
val builder = AlertDialog.Builder(this) val builder = AlertDialog.Builder(this)
builder.setTitle(title) builder.setTitle(title)
val viewInflated = LayoutInflater.from(this) val viewInflated = LayoutInflater.from(this)
@@ -968,12 +969,23 @@ class MainActivity : AppCompatActivity() {
builder.setView(viewInflated) builder.setView(viewInflated)
builder.setPositiveButton(android.R.string.ok) { dialog, _ -> builder.setPositiveButton(android.R.string.ok) { dialog, _ ->
dialog.dismiss() dialog.dismiss()
val password = input.text.toString() var password = input.text.toString().trim()
if (password != "") { if (!checkAuthPass(password)) {
if (title == getString(R.string.encrypt_password)) Utils.alertView(this, getString(R.string.notice),
backup(password) String.format(getString(R.string.invalid_authentication_password), password))
else password = ""
restore(password) }
when (title) {
getString(R.string.encrypt_password) ->
if (password != "") backup(password)
getString(R.string.decrypt_password) ->
if (password != "") restore(password)
else -> {
aorPasswords[ua!!.account.aor] = password
account_set_auth_pass(ua.account.accp, password)
if (password != "")
if (ua.account.regint > 0) Api.ua_register(ua.uap)
}
} }
} }
builder.setNegativeButton(android.R.string.cancel) { dialog, _ -> builder.setNegativeButton(android.R.string.cancel) { dialog, _ ->
@@ -1005,11 +1017,10 @@ class MainActivity : AppCompatActivity() {
builder.setView(viewInflated) builder.setView(viewInflated)
builder.setPositiveButton(android.R.string.ok) { dialog, _ -> builder.setPositiveButton(android.R.string.ok) { dialog, _ ->
dialog.dismiss() dialog.dismiss()
val password = input.text.toString() val password = input.text.toString().trim()
if ((password.length < 1) || (password.length > 64) || !Utils.checkPrintAscii(password)) { if (!checkAuthPass(password)) {
Utils.alertView(this, getString(R.string.notice), Utils.alertView(this, getString(R.string.notice),
String.format(getString(R.string.invalid_authentication_password), password)) String.format(getString(R.string.invalid_authentication_password), password))
accounts.add(0, account)
} else { } else {
aorPasswords.put(aor, password) aorPasswords.put(aor, password)
} }
@@ -1111,10 +1122,16 @@ class MainActivity : AppCompatActivity() {
} }
baresipService.setAction("UpdateNotification") baresipService.setAction("UpdateNotification")
startService(baresipService) startService(baresipService)
for (ua in UserAgent.uas()) updateIcons(ua.account)
} }
ACCOUNT_CODE -> { ACCOUNT_CODE -> {
updateIcons(UserAgent.uas()[aorSpinner.selectedItemPosition].account) val ua = UserAgent.uas()[aorSpinner.selectedItemPosition]
val account = ua.account
updateIcons(account)
if (aorPasswords.containsKey(account.aor) && aorPasswords[account.aor] == "")
askPassword(String.format(getString(R.string.account_password),
Utils.plainAor(account.aor)), ua)
} }
CONTACTS_CODE -> { CONTACTS_CODE -> {
@@ -1435,6 +1452,8 @@ class MainActivity : AppCompatActivity() {
var resumeUap = "" var resumeUap = ""
var resumeCall: Call? = null var resumeCall: Call? = null
var resumeUri = "" var resumeUri = ""
// <aor, password> of those accounts that have auth username without auth password
val aorPasswords = mutableMapOf<String, String>() val aorPasswords = mutableMapOf<String, String>()
const val ACCOUNTS_CODE = 1 const val ACCOUNTS_CODE = 1
@@ -224,11 +224,6 @@ object Utils {
return false return false
} }
fun checkPrintAscii(s: String): Boolean {
if (s == "") return true
return Regex("^[ -~]*\$").matches(s)
}
fun checkName(name: String): Boolean { fun checkName(name: String): Boolean {
return name.isNotEmpty() && name == String(name.toByteArray(), Charsets.UTF_8) && return name.isNotEmpty() && name == String(name.toByteArray(), Charsets.UTF_8) &&
name.lines().size == 1 && !name.contains('"') name.lines().size == 1 && !name.contains('"')
@@ -566,4 +561,5 @@ object Utils {
if ((BaresipService.activities.size == 0) || (BaresipService.activities[0] != activity)) if ((BaresipService.activities.size == 0) || (BaresipService.activities[0] != activity))
BaresipService.activities.add(0, activity) BaresipService.activities.add(0, activity)
} }
} }