[MOD] Read the config file for tool DB access

This commit is contained in:
LDA 2024-09-08 16:12:27 +02:00
commit 9775bd8d4e
6 changed files with 157 additions and 115 deletions

View file

@ -17,8 +17,8 @@ allows you to see/add admins to it, using simplified globrules.
.SH OPTIONS .SH OPTIONS
.TP .TP
.B [DB path] .B [config]
The DB directory this tool will use to manage administrators. The configuration file used by the Parsee daemon.
.TP .TP
.B [user] .B [user]
If set, adds the glob If set, adds the glob
@ -28,7 +28,8 @@ the Parsee instance.
.SH BUGS .SH BUGS
.PP .PP
Currently not available with flat-based backends. None as I know of. If anyone notices any issues with this, please
let me know.
.SH LICENSE .SH LICENSE
Unlike Parsee, Unlike Parsee,

View file

@ -230,34 +230,31 @@ end_error:
char *res = ParseeGetResource(from); char *res = ParseeGetResource(from);
char *encoded = ParseeGetBridgedUser(args, stanza); char *encoded = ParseeGetBridgedUser(args, stanza);
char *event_id = NULL; char *event_id = NULL;
char *parsee = ParseeJID(args);
char *trim = ParseeTrimJID(from);
XMLElement *ps;
{ /* Subscribe to the sender's metadata node. */
char *parsee = ParseeJID(args); ps = CreatePubsubRequest(
char *trim = ParseeTrimJID(from); parsee, decode_from, "urn:xmpp:avatar:metadata"
XMLElement *ps; );
pthread_mutex_lock(&jabber->write_lock);
XMLEncode(jabber->stream, ps);
StreamFlush(jabber->stream);
pthread_mutex_unlock(&jabber->write_lock);
XMLFreeElement(ps);
/* Subscribe to the sender's metadata node. */ ps = CreatePubsubRequest(
ps = CreatePubsubRequest( parsee, trim, "urn:xmpp:avatar:metadata"
parsee, decode_from, "urn:xmpp:avatar:metadata" );
); pthread_mutex_lock(&jabber->write_lock);
pthread_mutex_lock(&jabber->write_lock); XMLEncode(jabber->stream, ps);
XMLEncode(jabber->stream, ps); StreamFlush(jabber->stream);
StreamFlush(jabber->stream); pthread_mutex_unlock(&jabber->write_lock);
pthread_mutex_unlock(&jabber->write_lock); XMLFreeElement(ps);
XMLFreeElement(ps);
ps = CreatePubsubRequest( Free(parsee);
parsee, trim, "urn:xmpp:avatar:metadata" Free(trim);
);
pthread_mutex_lock(&jabber->write_lock);
XMLEncode(jabber->stream, ps);
StreamFlush(jabber->stream);
pthread_mutex_unlock(&jabber->write_lock);
XMLFreeElement(ps);
Free(parsee);
Free(trim);
}
pthread_mutex_lock(&thr->info->chk_lock); pthread_mutex_lock(&thr->info->chk_lock);
if (ParseeVerifyAllStanza(args, stanza) && !replaced) if (ParseeVerifyAllStanza(args, stanza) && !replaced)
@ -317,6 +314,7 @@ end_error:
size_t reacts = ArraySize(react_child); size_t reacts = ArraySize(react_child);
event_id = ParseeGetReactedEvent(args, stanza); event_id = ParseeGetReactedEvent(args, stanza);
/* Redact the last few reactions. */
to_redact = ASGetRelations( to_redact = ASGetRelations(
args->config, 30, mroom_id, event_id, args->config, 30, mroom_id, event_id,
"m.reaction" "m.reaction"
@ -335,6 +333,7 @@ end_error:
} }
ASFreeRelations(to_redact); ASFreeRelations(to_redact);
/* ... and push out the new ones. */
for (i = 0; i < reacts; i++) for (i = 0; i < reacts; i++)
{ {
XMLElement *reaction, *react_data; XMLElement *reaction, *react_data;
@ -365,9 +364,9 @@ end_error:
} }
else if (data) else if (data)
{ {
/* TODO: Use HTML-formatted bodies, and respect the fallback /* TODO: Respect the fallback trims the stanza provides us
* trims the stanza provides us if possible. Element does not * if possible. Element does not like raw bodies on replies
* like raw bodies on replies too. Go figure. */ * too. Go figure. */
size_t off = size_t off =
reply_to ? ParseeFindDatastart(data->data) : 0; reply_to ? ParseeFindDatastart(data->data) : 0;
HashMap *ev = MatrixCreateMessage(data->data + off); HashMap *ev = MatrixCreateMessage(data->data + off);

View file

@ -13,12 +13,7 @@
* Under CC0, as its a rather useful example of a Parsee tool. * Under CC0, as its a rather useful example of a Parsee tool.
* See LICENSE for more information about Parsee's licensing. */ * See LICENSE for more information about Parsee's licensing. */
#include <Cytoplasm/Memory.h> #include "common.h"
#include <Cytoplasm/Json.h>
#include <Cytoplasm/Log.h>
#include <Cytoplasm/Db.h>
#include <stdlib.h>
static void static void
AddAdmin(Db *parsee, char *glob) AddAdmin(Db *parsee, char *glob)
@ -86,14 +81,14 @@ Main(Array *args, HashMap *env)
if (ArraySize(args) < 2) if (ArraySize(args) < 2)
{ {
Log(LOG_ERR, "Usage: %s [DB path] [glob]", exec); Log(LOG_ERR, "Usage: %s [config] <glob>", exec);
return EXIT_FAILURE; return EXIT_FAILURE;
} }
db_path = ArrayGet(args, 1); db_path = ArrayGet(args, 1);
glob = ArrayGet(args, 2); glob = ArrayGet(args, 2);
parsee = DbOpenLMDB(db_path, 8 * 1024 * 1024); parsee = GetDB(db_path);
if (parsee) if (parsee)
{ {

118
tools/common.h Normal file
View file

@ -0,0 +1,118 @@
/* Single-header tools for Parsee tools. */
#include <Cytoplasm/HttpClient.h>
#include <Cytoplasm/Memory.h>
#include <Cytoplasm/Json.h>
#include <Cytoplasm/Args.h>
#include <Cytoplasm/Util.h>
#include <Cytoplasm/Log.h>
#include <Cytoplasm/Uri.h>
#include <Cytoplasm/Str.h>
#include <Cytoplasm/Db.h>
#include <stdlib.h>
#define GrabString(obj, ...) JsonValueAsString(JsonGet(obj, __VA_ARGS__))
#define GrabInteger(obj, ...) JsonValueAsInteger(JsonGet(obj, __VA_ARGS__))
#define GrabBoolean(obj, ...) JsonValueAsBoolean(JsonGet(obj, __VA_ARGS__))
#define GrabObject(obj, ...) JsonValueAsObject(JsonGet(obj, __VA_ARGS__))
#define GrabArray(obj, ...) JsonValueAsArray(JsonGet(obj, __VA_ARGS__))
Uri *
DelegateServer(char *raw)
{
HttpClientContext *ctx = NULL;
Stream *stream = NULL;
HashMap *reply = NULL;
Uri *ret = NULL;
if (!raw)
{
return NULL;
}
ctx = HttpRequest(
HTTP_GET,
HTTP_FLAG_TLS, 443,
raw, "/.well-known/matrix/client"
);
HttpRequestSendHeaders(ctx);
switch (HttpRequestSend(ctx))
{
case HTTP_OK:
stream = HttpClientStream(ctx);
reply = JsonDecode(stream);
if (!reply)
{
goto end;
}
ret = UriParse(JsonValueAsString(JsonGet(
reply, 2,
"m.homeserver", "base_url"
)));
break;
default:
/* TODO */
break;
}
if (ret && !ret->port && StrEquals(ret->proto, "https"))
{
ret->port = 443;
}
if (ret && !ret->port)
{
ret->port = 80;
}
end:
HttpClientContextFree(ctx);
JsonFree(reply);
return ret;
}
Db *
GetDB(char *config)
{
size_t lmdb_size;
Db *ret = NULL;
char *db_path;
HashMap *json;
Stream *file;
if (!config)
{
return NULL;
}
file = StreamOpen(config, "r");
json = JsonDecode(file);
StreamClose(file);
if (!json)
{
return NULL;
}
lmdb_size = GrabInteger(json, 1, "db_size");
db_path = GrabString(json, 1, "db");
if (!db_path)
{
JsonFree(json);
return NULL;
}
if (lmdb_size)
{
ret = DbOpenLMDB(db_path, lmdb_size);
}
if (!ret)
{
ret = DbOpen(db_path, 0);
}
JsonFree(json);
return ret;
}

View file

@ -10,73 +10,7 @@
* Under CC0, as its a rather useful example of a Parsee tool. * Under CC0, as its a rather useful example of a Parsee tool.
* See LICENSE for more information about Parsee's licensing. */ * See LICENSE for more information about Parsee's licensing. */
#include <Cytoplasm/HttpClient.h> #include "common.h"
#include <Cytoplasm/Memory.h>
#include <Cytoplasm/Json.h>
#include <Cytoplasm/Args.h>
#include <Cytoplasm/Util.h>
#include <Cytoplasm/Log.h>
#include <Cytoplasm/Uri.h>
#include <Cytoplasm/Str.h>
#include <Cytoplasm/Db.h>
#include <stdlib.h>
static Uri *
DelegateServer(char *raw)
{
HttpClientContext *ctx = NULL;
Stream *stream = NULL;
HashMap *reply = NULL;
Uri *ret = NULL;
if (!raw)
{
return NULL;
}
ctx = HttpRequest(
HTTP_GET,
HTTP_FLAG_TLS, 443,
raw, "/.well-known/matrix/client"
);
HttpRequestSendHeaders(ctx);
switch (HttpRequestSend(ctx))
{
case HTTP_OK:
stream = HttpClientStream(ctx);
reply = JsonDecode(stream);
if (!reply)
{
goto end;
}
ret = UriParse(JsonValueAsString(JsonGet(
reply, 2,
"m.homeserver", "base_url"
)));
break;
default:
/* TODO */
break;
}
if (ret && !ret->port && StrEquals(ret->proto, "https"))
{
ret->port = 443;
}
if (ret && !ret->port)
{
ret->port = 80;
}
end:
HttpClientContextFree(ctx);
JsonFree(reply);
return ret;
}
int int
Main(Array *args, HashMap *env) Main(Array *args, HashMap *env)

View file

@ -3,12 +3,7 @@
* Under CC0, as its a rather useful example of a Parsee tool. * Under CC0, as its a rather useful example of a Parsee tool.
* See LICENSE for more information about Parsee's licensing. */ * See LICENSE for more information about Parsee's licensing. */
#include <Cytoplasm/Memory.h> #include "common.h"
#include <Cytoplasm/Json.h>
#include <Cytoplasm/Log.h>
#include <Cytoplasm/Db.h>
#include <stdlib.h>
int int
Main(Array *args, HashMap *env) Main(Array *args, HashMap *env)
@ -20,13 +15,13 @@ Main(Array *args, HashMap *env)
if (ArraySize(args) < 2) if (ArraySize(args) < 2)
{ {
Log(LOG_ERR, "Usage: %s [DB path]", exec); Log(LOG_ERR, "Usage: %s [config]", exec);
return EXIT_FAILURE; return EXIT_FAILURE;
} }
db_path = ArrayGet(args, 1); db_path = ArrayGet(args, 1);
parsee = DbOpenLMDB(db_path, 8 * 1024 * 1024); parsee = GetDB(db_path);
if (parsee) if (parsee)
{ {
DbDelete(parsee, 1, "avatars"); DbDelete(parsee, 1, "avatars");