feat(@desktop/general): Use compressed community key in deep links
Issue #8001
This commit is contained in:
parent
e687dad3c7
commit
1f2a050695
|
@ -2,6 +2,8 @@ import NimQml, strutils, chronicles
|
|||
import ../eventemitter
|
||||
|
||||
import ../../global/app_signals
|
||||
import ../../../app_service/common/conversion
|
||||
import ../../../app_service/service/accounts/utils
|
||||
|
||||
logScope:
|
||||
topics = "urls-manager"
|
||||
|
@ -44,6 +46,11 @@ QtObject:
|
|||
result.protocolUriOnStart = protocolUriOnStart
|
||||
result.loggedIn = false
|
||||
|
||||
proc prepareCommunityId(self: UrlsManager, communityId: string): string =
|
||||
if isCompressedPubKey(communityId):
|
||||
return changeCommunityKeyCompression(communityId)
|
||||
return communityId
|
||||
|
||||
proc onUrlActivated*(self: UrlsManager, urlRaw: string) {.slot.} =
|
||||
if not self.loggedIn:
|
||||
self.protocolUriOnStart = urlRaw
|
||||
|
@ -62,7 +69,7 @@ QtObject:
|
|||
# Open community with `community_key`
|
||||
elif url.startsWith(UriFormatCommunity):
|
||||
data.action = StatusUrlAction.OpenCommunity
|
||||
data.communityId = url[UriFormatCommunity.len .. url.len-1]
|
||||
data.communityId = self.prepareCommunityId(url[UriFormatCommunity.len .. url.len-1])
|
||||
|
||||
# Open community which has a channel with `channel_key` and makes that channel active
|
||||
elif url.startsWith(UriFormatCommunityChannel):
|
||||
|
|
|
@ -151,5 +151,18 @@ QtObject:
|
|||
proc getCompressedPk*(self: Utils, publicKey: string): string {.slot.} =
|
||||
compressPk(publicKey)
|
||||
|
||||
proc getDecompressedPk*(self: Utils, compressedKey: string): string {.slot.} =
|
||||
decompressPk(compressedKey)
|
||||
|
||||
proc decompressCommunityKey*(self: Utils, publicKey: string): string {.slot.} =
|
||||
decompressCommunityKey(publicKey)
|
||||
|
||||
proc compressCommunityKey*(self: Utils, publicKey: string): string {.slot.} =
|
||||
compressCommunityKey(publicKey)
|
||||
|
||||
proc isCompressedPubKey*(self: Utils, publicKey: string): bool {.slot.} =
|
||||
conversion.isCompressedPubKey(publicKey)
|
||||
|
||||
# Changes publicKey compression between 33-bytes and multiformat zQ..
|
||||
proc changeCommunityKeyCompression*(self: Utils, publicKey: string): string {.slot.} =
|
||||
changeCommunityKeyCompression(publicKey)
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
import json
|
||||
import ../../../backend/accounts as status_account
|
||||
import ../../common/conversion
|
||||
|
||||
proc compressPk*(publicKey: string): string =
|
||||
try:
|
||||
|
@ -11,8 +12,49 @@ proc compressPk*(publicKey: string): string =
|
|||
except Exception as e:
|
||||
echo "error: `compressPk` " & $e.name & " msg: " & $e.msg
|
||||
|
||||
proc decompressPk*(compressedKey: string): string =
|
||||
try:
|
||||
let response = status_account.decompressPk(compressedKey)
|
||||
if(not response.error.isNil):
|
||||
echo "error decompressPk: " & response.error.message
|
||||
result = response.result
|
||||
|
||||
except Exception as e:
|
||||
echo "error: `decompressPk` " & $e.name & " msg: " & $e.msg
|
||||
|
||||
proc decompressCommunityKey*(publicKey: string): string =
|
||||
try:
|
||||
let response = status_account.decompressCommunityKey(publicKey)
|
||||
if(not response.error.isNil):
|
||||
echo "error decompressCommunityKey: " & response.error.message
|
||||
result = response.result
|
||||
|
||||
except Exception as e:
|
||||
echo "error: `decompressCommunityKey` " & $e.name & " msg: " & $e.msg
|
||||
|
||||
proc compressCommunityKey*(publicKey: string): string =
|
||||
try:
|
||||
let response = status_account.compressCommunityKey(publicKey)
|
||||
if(not response.error.isNil):
|
||||
echo "error compressCommunityKey: " & response.error.message
|
||||
result = response.result
|
||||
|
||||
except Exception as e:
|
||||
echo "error: `compressCommunityKey` " & $e.name & " msg: " & $e.msg
|
||||
|
||||
proc generateAliasFromPk*(publicKey: string): string =
|
||||
return status_account.generateAlias(publicKey).result.getStr
|
||||
|
||||
proc isAlias*(value: string): bool =
|
||||
return status_account.isAlias(value)
|
||||
return status_account.isAlias(value)
|
||||
|
||||
# Changes publicKey compression between 33-bytes and multiformat zQ..
|
||||
proc changeCommunityKeyCompression*(publicKey: string): string =
|
||||
if isCompressedPubKey(publicKey):
|
||||
# is zQ
|
||||
let uncompressedKey = decompressPk(publicKey)
|
||||
return compressCommunityKey(uncompressedKey)
|
||||
else:
|
||||
# is 33-bytes
|
||||
let uncompressedKey = decompressCommunityKey(publicKey)
|
||||
return compressPk(uncompressedKey)
|
|
@ -89,7 +89,29 @@ proc decompressPk*(publicKey: string): RpcResponse[string] =
|
|||
let secp256k1Code = "fe701"
|
||||
response.removePrefix(secp256k1Code)
|
||||
result.result = "0x" & response
|
||||
|
||||
|
||||
proc decompressCommunityKey*(publicKey: string): RpcResponse[string] =
|
||||
|
||||
let response = status_go.decompressPublicKey(publicKey)
|
||||
|
||||
# json response indicates error
|
||||
try:
|
||||
let jsonReponse = parseJson(response)
|
||||
result.error = RpcError(message: jsonReponse["error"].getStr())
|
||||
except JsonParsingError as e:
|
||||
result.result = response
|
||||
|
||||
proc compressCommunityKey*(publicKey: string): RpcResponse[string] =
|
||||
|
||||
let response = status_go.compressPublicKey(publicKey)
|
||||
|
||||
# json response indicates error
|
||||
try:
|
||||
let jsonReponse = parseJson(response)
|
||||
result.error = RpcError(message: jsonReponse["error"].getStr())
|
||||
except JsonParsingError as e:
|
||||
result.result = response
|
||||
|
||||
proc compressPk*(publicKey: string): RpcResponse[string] =
|
||||
let secp256k1Code = "0xe701"
|
||||
let base58btc = "z"
|
||||
|
|
|
@ -86,11 +86,11 @@ ColumnLayout {
|
|||
|
||||
StatusDescriptionListItem {
|
||||
title: qsTr("Share community")
|
||||
subTitle: `${Constants.communityLinkPrefix}${root.community && root.community.id.substring(0, 4)}...${root.community && root.community.id.substring(root.community.id.length -2)}`
|
||||
subTitle: Utils.getCommunityShareLink(root.community.id, true)
|
||||
tooltip.text: qsTr("Copied!")
|
||||
asset.name: "copy"
|
||||
iconButton.onClicked: {
|
||||
let link = `${Constants.communityLinkPrefix}${root.community.id}`
|
||||
let link = Utils.getCommunityShareLink(root.community.id)
|
||||
root.rootStore.copyToClipboard(link)
|
||||
tooltip.visible = !tooltip.visible
|
||||
}
|
||||
|
|
|
@ -46,11 +46,11 @@ Column {
|
|||
|
||||
StatusDescriptionListItem {
|
||||
title: qsTr("Share community")
|
||||
subTitle: `${Constants.communityLinkPrefix}${root.community.id.substring(0, 4)}...${root.community.id.substring(root.community.id.length -2)}`
|
||||
subTitle: Utils.getCommunityShareLink(root.community.id, true)
|
||||
tooltip.text: qsTr("Copied!")
|
||||
asset.name: "copy"
|
||||
iconButton.onClicked: {
|
||||
let link = `${Constants.communityLinkPrefix}${root.community.id}`
|
||||
let link = Utils.getCommunityShareLink(root.community.id)
|
||||
root.copyToClipboard(link);
|
||||
tooltip.visible = !tooltip.visible
|
||||
}
|
||||
|
|
|
@ -388,15 +388,13 @@ QtObject {
|
|||
}*/
|
||||
|
||||
// Community
|
||||
let index = link.lastIndexOf("/c/")
|
||||
if (index > -1) {
|
||||
const communityId = link.substring(index + 3)
|
||||
|
||||
const communityId = Utils.getCommunityIdFromShareLink(link)
|
||||
if (communityId !== "") {
|
||||
const communityName = getSectionNameById(communityId)
|
||||
|
||||
if (!communityName) {
|
||||
// Unknown community, fetch the info if possible
|
||||
communitiesModuleInst.requestCommunityInfo(communityId)
|
||||
root.requestCommunityInfo(communityId)
|
||||
result.communityId = communityId
|
||||
result.fetching = true
|
||||
return result
|
||||
|
|
|
@ -608,6 +608,19 @@ QtObject {
|
|||
return colorForColorId(pubKeyColorId)
|
||||
}
|
||||
|
||||
function getCommunityShareLink(communityId, elided = false) {
|
||||
if (communityId === "") {
|
||||
return ""
|
||||
}
|
||||
|
||||
let compressedPk = communityId
|
||||
if (!globalUtilsInst.isCompressedPubKey(compressedPk)) {
|
||||
compressedPk = globalUtilsInst.changeCommunityKeyCompression(compressedPk)
|
||||
}
|
||||
return Constants.communityLinkPrefix +
|
||||
(elided ? StatusQUtils.Utils.elideText(compressedPk, 4, 2) : compressedPk)
|
||||
}
|
||||
|
||||
function getChatKeyFromShareLink(link) {
|
||||
let index = link.lastIndexOf("/u/")
|
||||
if (index === -1) {
|
||||
|
@ -616,6 +629,19 @@ QtObject {
|
|||
return link.substring(index + 3)
|
||||
}
|
||||
|
||||
function getCommunityIdFromShareLink(link) {
|
||||
let index = link.lastIndexOf("/c/")
|
||||
if (index === -1) {
|
||||
return ""
|
||||
}
|
||||
const communityKey = link.substring(index + 3)
|
||||
if (globalUtilsInst.isCompressedPubKey(communityKey)) {
|
||||
// is zQ.., need to be converted to standard compression
|
||||
return globalUtilsInst.changeCommunityKeyCompression(communityKey)
|
||||
}
|
||||
return communityKey
|
||||
}
|
||||
|
||||
function getCompressedPk(publicKey) {
|
||||
if (publicKey === "") {
|
||||
return ""
|
||||
|
|
Loading…
Reference in New Issue