nostr pubkey for Robot

This commit is contained in:
koalasat
2025-04-27 18:43:51 +02:00
parent 0d406ec6d2
commit e78d86feba
8 changed files with 24 additions and 16 deletions

View File

@ -693,6 +693,7 @@ class RobotView(APIView):
context["encrypted_private_key"] = user.robot.encrypted_private_key
context["earned_rewards"] = user.robot.earned_rewards
context["wants_stealth"] = user.robot.wants_stealth
context["nostr_pubkey"] = user.robot.nostr_pubkey
context["last_login"] = user.last_login
# Adds/generate telegram token and whether it is enabled

View File

@ -1,6 +1,5 @@
import { apiClient } from '../services/api';
import { apiClient, type Auth } from '../services/api';
import type Federation from './Federation.model';
import { type AuthHeaders } from './Slot.model';
class Robot {
constructor(attributes?: Record<any, any>) {
@ -31,13 +30,15 @@ class Robot {
Object.assign(this, attributes);
};
getAuthHeaders = (): AuthHeaders | null => {
getAuthHeaders = (): Auth | null => {
const tokenSHA256 = this.tokenSHA256 ?? '';
const encPrivKey = this.encPrivKey ?? '';
const pubKey = this.pubKey ?? '';
const nostrPubkey = this.nostrPubKey ?? '';
return {
tokenSHA256,
nostrPubkey,
keys: {
pubKey: pubKey.split('\n').join('\\'),
encPrivKey: encPrivKey.split('\n').join('\\'),

View File

@ -5,14 +5,6 @@ import { roboidentitiesClient } from '../services/Roboidentities/Web';
import { hexToBase91, validateTokenEntropy } from '../utils';
import { getPublicKey } from 'nostr-tools';
export interface AuthHeaders {
tokenSHA256: string;
keys: {
pubKey: string;
encPrivKey: string;
};
}
class Slot {
constructor(
token: string,

View File

@ -19,11 +19,11 @@ class ApiNativeClient implements ApiClient {
Authorization: `Token ${auth.tokenSHA256}`,
},
};
} else if (auth?.keys != null) {
} else if (auth?.keys != null && auth.nostrPubkey != null) {
headers = {
...headers,
...{
Authorization: `Token ${auth.tokenSHA256} | Public ${auth.keys.pubKey} | Private ${auth.keys.encPrivKey}`,
Authorization: `Token ${auth.tokenSHA256} | Public ${auth.keys.pubKey} | Private ${auth.keys.encPrivKey} | Nostr ${auth.nostrPubkey}`,
},
};
}

View File

@ -15,11 +15,11 @@ class ApiWebClient implements ApiClient {
Authorization: `Token ${auth.tokenSHA256}`,
},
};
} else if (auth?.keys != null) {
} else if (auth?.keys != null && auth.nostrPubkey != null) {
headers = {
...headers,
...{
Authorization: `Token ${auth.tokenSHA256} | Public ${auth.keys.pubKey} | Private ${auth.keys.encPrivKey}`,
Authorization: `Token ${auth.tokenSHA256} | Public ${auth.keys.pubKey} | Private ${auth.keys.encPrivKey} | Nostr ${auth.nostrPubkey}`,
},
};
}

View File

@ -3,6 +3,7 @@ import ApiNativeClient from './ApiNativeClient';
export interface Auth {
tokenSHA256: string;
nostrPubkey?: string;
keys?: { pubKey: string; encPrivKey: string };
}

View File

@ -42,9 +42,15 @@ class SplitAuthorizationHeaderMiddleware(MiddlewareMixin):
split_auth = auth_header.split(" | ")
if len(split_auth) == 3:
# Deprecated in favor of len 4
request.META["HTTP_AUTHORIZATION"] = split_auth[0]
request.META["PUBLIC_KEY"] = split_auth[1]
request.META["ENCRYPTED_PRIVATE_KEY"] = split_auth[2]
elif len(split_auth) == 4:
request.META["HTTP_AUTHORIZATION"] = split_auth[0]
request.META["PUBLIC_KEY"] = split_auth[1]
request.META["ENCRYPTED_PRIVATE_KEY"] = split_auth[2]
request.META["NOSTR_PUBKEY"] = split_auth[3]
class RobotTokenSHA256AuthenticationMiddleWare:
@ -108,11 +114,13 @@ class RobotTokenSHA256AuthenticationMiddleWare:
# Authorization header or in the Cookies.
public_key = ""
encrypted_private_key = ""
nostr_pubkey = ""
public_key = request.META.get("PUBLIC_KEY", "").replace("Public ", "")
encrypted_private_key = request.META.get(
"ENCRYPTED_PRIVATE_KEY", ""
).replace("Private ", "")
nostr_pubkey = request.META.get("NOSTR_PUBKEY", "").replace("Nostr ", "")
# Some legacy (pre-federation) clients will still send keys as cookies
if public_key == "" or encrypted_private_key == "":
@ -158,6 +166,10 @@ class RobotTokenSHA256AuthenticationMiddleWare:
if not user.robot.encrypted_private_key:
user.robot.encrypted_private_key = encrypted_private_key
# Add nostr key to the new user
if not user.robot.nostr_pubkey:
user.robot.nostr_pubkey = nostr_pubkey
update_last_login(None, user)
user.save()

View File

@ -70,11 +70,12 @@ class Trade:
b91_token = read_file(f"tests/robots/{robot_index}/b91_token")
pub_key = read_file(f"tests/robots/{robot_index}/pub_key")
enc_priv_key = read_file(f"tests/robots/{robot_index}/enc_priv_key")
nostr_pubkey = read_file(f"tests/robots/{robot_index}/nostr_pubkey")
# First time a robot authenticated, it is registered by the backend, so pub_key and enc_priv_key is needed
if first_encounter:
headers = {
"HTTP_AUTHORIZATION": f"Token {b91_token} | Public {pub_key} | Private {enc_priv_key}"
"HTTP_AUTHORIZATION": f"Token {b91_token} | Public {pub_key} | Private {enc_priv_key} | Nostr {nostr_pubkey}"
}
else:
headers = {"HTTP_AUTHORIZATION": f"Token {b91_token}"}