This commit is contained in:
Ashley Graves 2024-10-13 13:35:10 +02:00
parent 6357080619
commit 880ae5a359
8 changed files with 232 additions and 138 deletions

View file

@ -1,9 +1,10 @@
PREFIX=!
BASE_URL=https://example.com
OWNER_ID=@root:example.com
USER_ID=@bot:example.com
ACCESS_TOKEN=1234567890
DEVICE_ID=Bot-Device
PREFIX=!
LOG_CHANNEL=!1234567890:example.com
AP_FETCH_PORT=3000
AP_FETCH_DOMAIN=example.com
OWNER_ID=@nyx:nyx.ftp.sh

View file

@ -1,15 +1,46 @@
import { exec as ossl_exec } from "openssl-wrapper";
import express from 'express';
import fs from 'fs';
import env from 'dotenv';
env.config();
const password = "penis";
function openssl(func, args) {
return new Promise((resolve, reject) => {
ossl_exec(func, args, function (err, buffer) {
if (err)
reject(err);
resolve(buffer);
});
})
}
const domain = process.env.AP_FETCH_DOMAIN;
const pubkey = fs.readFileSync('data/publickey.crt', 'utf8');
if (!fs.existsSync("data/server-crt.pem")) {
console.log("Generating certificate...");
await openssl('req', {
new: true,
newkey: 'rsa:4096',
days: 365,
nodes: true,
x509: true,
subj: '/C=',
keyout: "data/server-key.pem",
out: "data/server-crt.pem"
});
console.log("Certificate generated!");
}
const app = express();
const pubkey = fs.readFileSync('data/server-crt.pem', 'utf8');
const notice = fs.readFileSync('auth-fetch-notice.txt', 'utf8');
const userId = process.env.USER_ID;
const username = userId.slice(1, userId.indexOf(":"));
const actor = {
'@context': [
@ -19,7 +50,7 @@ const actor = {
'id': 'https://' + domain + '/actor',
'type': 'Person',
'preferredUsername': 'possumbot',
'preferredUsername': username,
'inbox': 'https://' + domain + '/inbox',
'publicKey': {
@ -30,7 +61,7 @@ const actor = {
}
const webfinger = {
'subject': 'acct:possumbot@' + domain + '',
'subject': 'acct:' + userId,
'links': [
{
@ -41,24 +72,24 @@ const webfinger = {
]
}
app.get('/', (req, res) => {
app.get('/', (_, res) => {
res.setHeader('content-type', 'text/plain');
res.write(notice);
res.end();
});
app.get('/actor', (req, res) => {
app.get('/actor', (_, res) => {
res.writeHead(200, { 'Content-Type': 'application/activity+json' });
res.write(JSON.stringify(actor));
res.end();
});
app.get('/.well-known/webfinger', (req, res) => {
app.get('/.well-known/webfinger', (_, res) => {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.write(JSON.stringify(webfinger));
res.end();
});
app.listen(process.env.AP_FETCH_PORT);
export default true;
export default function (port) {
app.listen(port);
};

View file

@ -4,7 +4,6 @@ import * as sdk from "matrix-js-sdk";
import sdkExt from "./lib/ext.js";
import { resolve } from "node:path";
import fs from "node:fs";
import util from "util";
import { LocalStorage } from 'node-localstorage';
import fetch from "node-fetch";
@ -31,6 +30,8 @@ const client = sdk.createClient({
sdkExt(client);
apfetch(process.env.AP_FETCH_PORT);
var prefixes = [process.env.PREFIX];
client.initialized = false;
@ -83,7 +84,7 @@ function doCommand(client, event, cmd, args) {
if ((command.owner && event.sender.userId != process.env.OWNER_ID) || (command.minPwr && event.sender.powerLevel < command.minPwr && event.sender.userId != process.env.OWNER_ID)) {
var addl = command.minPwr ? `this command requires a power level of ${command.minPwr}\nyour power level is ${event.sender.powerLevel}` : "this command is owner-only.";
client.reply(event, addl, '<img src="mxc://possum.city/b4Vo1BTcq49B7TbFWCqq76HQWQEdNIqq" alt="nuh uh" /><br>' + addl.replaceAll("\n", "<br>"));
client.reply(event, addl, '<img src="mxc://nyx.ftp.sh/2kAXPyosdaz1M6Fv8t2V9SyxcJZEscdR" alt="nuh uh" /><br>' + addl.replaceAll("\n", "<br>"));
return true;
}

View file

@ -1,5 +1,4 @@
import httpSignature from "@peertube/http-signature";
import path from "node:path";
import fs from "node:fs";
const FRIENDLY_USERAGENT = "PossumBot/1.0 (+https://bot.possum.city/)";
@ -58,7 +57,7 @@ async function resolvePlatform(url) {
}
const keyId = "https://" + process.env.AP_FETCH_DOMAIN + "/actor#main-key";
const privKey = fs.readFileSync("data/private.pem");
const privKey = fs.readFileSync("data/server-crt.pem");
async function signedFetch(url, options) {
const urlObj = new URL(url);
@ -69,20 +68,17 @@ async function signedFetch(url, options) {
const headerNames = ["(request-target)", "host", "date"];
httpSignature.sign(
{
httpSignature.sign({
getHeader: (name) => headers[name.toLowerCase()],
setHeader: (name, value) => (headers[name] = value),
method: options.method ?? "GET",
path: urlObj.pathname,
},
{
}, {
keyId,
key: privKey,
headers: headerNames,
authorizationHeaderName: "signature",
}
);
});
options.headers = Object.assign(headers, options.headers ?? {});

View file

@ -1,5 +1,38 @@
import { LocalStorage } from 'node-localstorage';
import readline from "node:readline/promises";
import { stdin, stdout } from 'node:process';
import * as sdk from "matrix-js-sdk";
import readline from "node:readline";
import Olm from "@matrix-org/olm";
global.Olm = Olm;
const { stdin: input, stdout: output } = require('node:process');
const rl = readline.createInterface({ input, output });
const rl = readline.createInterface({ input: stdin, output: stdout });
const host = await rl.question("Server: ");
const user = await rl.question("Username: ");
const pass = await rl.question("Password: ");
const idnt = await rl.question("Device ID: ");
const userId = `@${user}:${host}`;
const localStorage = new LocalStorage("./data/localstorage");
const cryptoStore = new sdk.LocalStorageCryptoStore(localStorage);
const store = new sdk.MemoryStore({ localStorage });
const client = sdk.createClient({
baseUrl: "https://" + host,
deviceId: idnt,
cryptoStore,
store
});
await client.loginWithPassword(userId, pass);
await client.initCrypto();
await client.startClient();
console.log(`BASE_URL=${client.getHomeserverUrl()}
USER_ID=${client.getUserId()}
ACCESS_TOKEN=${client.getAccessToken()}
DEVICE_ID=${client.getDeviceId()}`);
client.stopClient();
process.exit(0);

View file

@ -6,6 +6,9 @@
"main": "index.js",
"author": "Ashley Graves",
"license": "GPL-v3",
"scripts": {
"login": "node login.js"
},
"dependencies": {
"@matrix-org/olm": "^3.2.15",
"@node-rs/xxhash": "^1.7.3",
@ -17,7 +20,8 @@
"jsdom": "^25.0.0",
"matrix-js-sdk": "^32.4.0",
"node-fetch": "^3.3.2",
"node-localstorage": "^3.0.5"
"node-localstorage": "^3.0.5",
"openssl-wrapper": "^0.3.4"
},
"pnpm": {
"overrides": {

28
privkey.pem Normal file
View file

@ -0,0 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCscpi8oYpieOQx
rysZVAtDBQHoKuQdtrz4zlLnZoAsWKkCgN5Df/+nxIrvp+yURnrrDPuNqTvxoo/n
mP88cuz8xAH8Gvnc6aZNrLENQwo02LscfxlAh+sXThaYN1qzf+jkJpPcy4sCXYam
7E/O7RYwRBPPw3JgMZgdjgX1IRTHmHUaAlTAcB78FFZIn0p2UGCFHSOrIRSOL8ga
e1s7alOfSqTF92N78lnbprAqxBbqiYTEY4CyTdqKZrbHjSvJcNjxdcifvmC/FIqC
PBmx49FMeUTKyY6Px5/eYcNY/MWjUCIR+65tGLftDJ1hlcZO4w3/qdKDmV/ErTVJ
jY1VQV1ZAgMBAAECggEABK08RIFXsMFOjvpif4FZUiv57UNHLyHG5jMnlGxMiudX
Tgtopl6mSZ/O6h5HuuMJGllzyQJkmceq12u9dZ+Nmx1FtddAHM70BPnrTfdveMIX
8Pc8HBU+OZeTN/WTBCMykbK/d9Fyp6cZq7/k5Nu71PtDqPLH+0vdBZArITFl0DPg
LRhG9oQmzlo9kY19upCKtn7mj/0OCv/p20RU7fjRZJcBTaZ0G6nDJbropZrp0RqK
AlTl+/u52cu2DpAt4EHMy3BJoNw2lk1b+ierEi9XolutO2IFoR9jvzrv3xW0wVom
Zm+Q8F4W5yNr1/lHqSVaBswn3HII9qgTTV+O3LgAAQKBgQDgrK7oyd4E71Uzywls
UhxQPNvGnDK7O13vVkrnyz93aUPXkkZE1EPviaRmXFKNVl1M5tjpIuyOSjl2o2M+
mpxAue526+l9zt28DGa4CyJ5y/frezI95lOaJx03QLfrD6OPXZSpqNvk+ozyPl6s
ZnB9u0avHDW4oWXgTd4+DPy1WQKBgQDEfcbVkkHTyJxiqhV9uax8WhNPxmRbnsft
0VFDSVBmqrwDpjAAlSrXegr44VPabbY8ioq9ExIaGVmihr8VpGkWmSAJIpHw+sjR
ml+r5irl8t+C7cEJJra60uuQ/SevgG9YbgWMXKvuzzYRlhcU8w5vBXccyaMEkMnV
o4HCqczoAQKBgFG4vg5Sjv1AiL9EFPNfkojk+hPt8M4FtA9AVhKl7TnkAhdBT2nt
w6A3cqMA5c4fIeS8+x0h5OWEvg4XNBwrZLZuavy6pr1qJ2ElKZ+7/RhMRqtSrl2x
j6s8mvXkBoHruFSHd3GWyBUrxWS/pvQSdsxk+DrtieTUYBgMetAbLThRAoGADiIl
7TLJ/VvOs+IcDaEPYRpxjSluCpEPPHHz8G0TlW7ueyy3AzO3kyw6IdDDYVDG7O/i
LttyT+JG6kPa9smOrYtyHHYaHUVMsJb0Dr9NkqC3pwlG+0uHlUSaoSE0e5E3cRro
10HLNDA/aWBsZJtfDGlOOgne6fMoMW/DY6cnEAECgYAQV8szcOywT7xxu8nJPJyV
nhcbqvJrPHdHZW01EPTtYRICOd5WFyw/bvULpWNKJm+aV5H+Q5JLFiJyxhJ6+juY
9LuJ1LHhnvEUmnn5ZOmDcjI0RvPZ4hFjIHslAKrizZ8fKdQLBW34c7GGMEHiN4S9
2QyE9tbfBp0u0pDBuR56wQ==
-----END PRIVATE KEY-----

View file

@ -1,4 +1,4 @@
# PossumBot
modular matrix bot :3
see: [wiki](https://git.lgbt/root/possumbot/wiki)
see: [wiki](https://git.lgbt/sisterkissers/matrix-bot/wiki)