- Improved asking of password when it is not given in account config.
This commit is contained in:
@@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user