Minor improvements

- WebFinger:  detect when to use http or https, better function naming
- RequestPool: add user agent
This commit is contained in:
2024-02-21 15:39:41 -03:00
parent 166f428cd1
commit 7fbdd031ff
5 changed files with 76 additions and 20 deletions

View File

@@ -11,24 +11,61 @@ import singletons;
import db.db; import db.db;
import net.request_pool; import net.request_pool;
import webfinger; import webfinger;
import ap.actor;
import ap.util;
import std.math.remainder;
import util;
void commonInit() { void commonInit() {
auto provider = new DefaultProvider(true, Levels.DEBUG); auto provider = new DefaultProvider(true, Levels.DEBUG);
configureLoggingProvider(provider); configureLoggingProvider(provider);
RP = new RequestPool(); Config cfg = loadConfig();
RP.startBackground(); initRequestPool(cfg);
initDatabase(cfg);
}
Config loadConfig() {
Config cfg = new Config();
cfg.load();
return cfg;
}
void initRequestPool(Config cfg) {
Rp = new RequestPool();
Rp.startBackground();
}
void initDatabase(Config cfg) {
Db = new DB(DBSettings.fromJson(cfg.v["db"]));
Db.connect();
} }
void main() { void main() {
commonInit(); commonInit();
scope (exit) scope (exit) {
RP.stop(); Db.close();
Rp.stop();
}
JSONValue js = requestAcct("localhost:8080", "admin"); generateRSA();
return;
infoF!"Response body: %s"(js.toJSON(true)); Actor marisa = apResolveRemoteUsername("@admin@localhost:8080");
infoF!"Actor type: %s"(marisa.type);
infoF!"Actor preferredUsername: %s"(marisa.preferredUsername);
infoF!"Actor sharedInbox: %s"(marisa.endpoints.sharedInbox);
PRequest followers = PRequest();
with (followers) {
url = marisa.followers;
headers["Accept"] = "application/activity+json";
}
Response rs = Rp.request(followers, true);
infoF!"followers: %s"(rs.responseBody);
} }
//int main() { //int main() {

View File

@@ -1,8 +1,5 @@
module net.request_pool; module net.request_pool;
import core.thread;
import core.sync.semaphore;
import std.container; import std.container;
import std.parallelism; import std.parallelism;
@@ -32,6 +29,7 @@ class RequestPool {
for (int i = 0; i < totalWorkers + 1; i++) { for (int i = 0; i < totalWorkers + 1; i++) {
Request rq = Request(); Request rq = Request();
// TODO: add custom fields (such as user agent) // TODO: add custom fields (such as user agent)
rq.addHeaders(["User-Agent": "apd (development)"]);
this.m_requests ~= rq; this.m_requests ~= rq;
} }
} }

View File

@@ -4,4 +4,4 @@ import db.db;
import net.request_pool; import net.request_pool;
DB Db; DB Db;
RequestPool RP; RequestPool Rp;

View File

@@ -3,6 +3,11 @@ module util;
import std.format; import std.format;
import std.json; import std.json;
import slf4d;
import deimos.openssl.rsa;
import deimos.openssl.pem;
void optional(T)(ref JSONValue val, string key, ref T receiver) { void optional(T)(ref JSONValue val, string key, ref T receiver) {
const(JSONValue)* p = key in val; const(JSONValue)* p = key in val;
@@ -24,3 +29,18 @@ T optional(T)(ref JSONValue val, string key) {
void required(T)(ref JSONValue val, string key, ref T receiver) { void required(T)(ref JSONValue val, string key, ref T receiver) {
receiver = val[key].get!T; receiver = val[key].get!T;
} }
void generateRSA() {
RSA* rsa = RSA_generate_key(2048, 3, null, null);
BIO* bio = BIO_new(BIO_s_mem());
PEM_write_bio_RSAPrivateKey(bio, rsa, null, null, 0, null, null);
int keyLen = BIO_pending(bio);
char[] pemKey = new char[keyLen + 1];
BIO_read(bio, pemKey.ptr, keyLen);
BIO_free_all(bio);
RSA_free(rsa);
infoF!"private key: %s"(pemKey);
}

View File

@@ -18,11 +18,15 @@ private bool checkValidWebfingerResponse(Response rs) {
return AcceptedWebfingerContentType.canFind(rs.responseHeaders()["content-type"].split(";")[0]); return AcceptedWebfingerContentType.canFind(rs.responseHeaders()["content-type"].split(";")[0]);
} }
PRequest buildRequest(string uri, string[string] params) { private PRequest buildRequest(string uri, string[string] params) {
PRequest rq = PRequest(); PRequest rq = PRequest();
string schema = "https";
if (uri.startsWith("localhost"))
schema = "http";
rq.method = "GET"; rq.method = "GET";
rq.url = format("https://%s/.well-known/webfinger", uri); rq.url = format("%s://%s/.well-known/webfinger", schema, uri);
rq.headers["Accept"] = AcceptedWebfingerContentType; rq.headers["Accept"] = AcceptedWebfingerContentType;
QueryParam[] p; QueryParam[] p;
@@ -41,8 +45,8 @@ PRequest buildAcctRequest(string uri, string acct) {
return buildRequest(uri, params); return buildRequest(uri, params);
} }
JSONValue requestAcct(string uri, string acct) { JSONValue wfRequestAccount(string uri, string acct) {
Response rs = RP.request(buildAcctRequest(uri, acct), true); Response rs = Rp.request(buildAcctRequest(uri, acct), true);
if (checkValidWebfingerResponse(rs) == false) if (checkValidWebfingerResponse(rs) == false)
throw new Exception("Invalid webfinger response"); throw new Exception("Invalid webfinger response");
@@ -50,11 +54,8 @@ JSONValue requestAcct(string uri, string acct) {
return parseJSON(rs.responseBody().toString()); return parseJSON(rs.responseBody().toString());
} }
JSONValue requestAcct(string handle) { JSONValue wfRequestAccount(string handle) {
string uri, acct; string[] uriAcct = handle.split("@")[$ - 2 .. $];
uri = handle.split("@")[$ - 1]; return wfRequestAccount(uriAcct[1], uriAcct[0]);
acct = handle.split("@")[$ - 2];
return requestAcct(uri, acct);
} }