feat: Adds Request user info (#1279)

* Request user info

* safe calls

* Fix: Ensure NodeInfo is sent when requesting user info

The `requestUserInfo` function now correctly sends `NodeInfo` when requesting user info by using the `
toNodeInfo()` method on `ourNodeInfo`. This ensures the recipient receives the necessary information.

* fix: remove unused parameters, use service's node db for our node entity

---------

Co-authored-by: musznik <bymucha@gmail.com>
pull/1286/head
James Rich 2024-10-03 03:02:13 -05:00 zatwierdzone przez GitHub
rodzic 83c3b484ad
commit f944a236ac
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: B5690EEEBB952194
6 zmienionych plików z 37 dodań i 5 usunięć

Wyświetl plik

@ -168,4 +168,7 @@ interface IMeshService {
/// Stop providing location (from phone GPS) to mesh
void stopProvideLocation();
/// Send request for node UserInfo
void requestUserInfo(in int destNum);
}

Wyświetl plik

@ -58,10 +58,10 @@ import java.util.concurrent.TimeUnit
import javax.inject.Inject
import kotlin.math.roundToInt
/// Given a human name, strip out the first letter of the first three words and return that as the initials for
/// that user. If the original name is only one word, strip vowels from the original name and if the result is
/// 3 or more characters, use the first three characters. If not, just take the first 3 characters of the
/// original name.
// / Given a human name, strip out the first letter of the first three words and return that as the initials for
// / that user. If the original name is only one word, strip vowels from the original name and if the result is
// / 3 or more characters, use the first three characters. If not, just take the first 3 characters of the
// / original name.
fun getInitials(nameIn: String): String {
val nchars = 4
val minchars = 2
@ -411,6 +411,15 @@ class UIViewModel @Inject constructor(
}
}
fun requestUserInfo(destNum: Int) {
info("Requesting UserInfo for '$destNum'")
try {
meshService?.requestUserInfo( destNum )
} catch (ex: RemoteException) {
errormsg("Request NodeInfo error: ${ex.message}")
}
}
fun requestPosition(destNum: Int, position: Position = Position(0.0, 0.0, 0)) {
info("Requesting position for '$destNum'")
try {

Wyświetl plik

@ -1928,7 +1928,18 @@ class MeshService : Service(), Logging {
removeByNodenum = nodeNum
})
}
override fun requestUserInfo( destNum: Int ) = toRemoteExceptions {
if (destNum != myNodeNum) {
sendToRadio(newMeshPacketTo(destNum
).buildMeshPacket(
channel = nodeDBbyNodeNum[destNum]?.channel ?: 0
) {
portnumValue = Portnums.PortNum.NODEINFO_APP_VALUE
wantResponse = true
payload = nodeDBbyNodeNum[myNodeNum]!!.user.toByteString()
})
}
}
override fun requestPosition(destNum: Int, position: Position) = toRemoteExceptions {
sendToRadio(newMeshPacketTo(destNum).buildMeshPacket(
channel = nodeDBbyNodeNum[destNum]?.channel ?: 0,

Wyświetl plik

@ -85,6 +85,10 @@ class UsersFragment : ScreenFragment("Users"), Logging {
R.id.metrics -> {
navigateToMetrics(node.num)
}
R.id.request_userinfo -> {
model.requestUserInfo(node.num)
}
}
}
}

Wyświetl plik

@ -6,6 +6,10 @@
android:id="@+id/direct_message"
android:title="@string/direct_message"
app:showAsAction="withText" />
<item
android:id="@+id/request_userinfo"
android:title="@string/request_userinfo"
app:showAsAction="withText" />
<item
android:id="@+id/request_position"
android:title="@string/request_position"

Wyświetl plik

@ -268,4 +268,5 @@
<string name="encryption_pkc_text">Direct messages are using the new public key infrastructure for encryption. Requires firmware version 2.5 or greater.</string>
<string name="encryption_error">Public key mismatch</string>
<string name="encryption_error_text">The public key does not match the recorded key. You may remove the node and let it exchange keys again, but this may indicate a more serious security problem. Contact the user through another trusted channel, to determine if the key change was due to a factory reset or other intentional action.</string>
<string name="request_userinfo">Request user info</string>
</resources>