upd1
This commit is contained in:
parent
6357080619
commit
880ae5a359
8 changed files with 232 additions and 138 deletions
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
};
|
||||
|
|
5
index.js
5
index.js
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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 ?? {});
|
||||
|
||||
|
|
39
login.js
39
login.js
|
@ -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);
|
|
@ -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
28
privkey.pem
Normal 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-----
|
|
@ -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)
|
Loading…
Reference in a new issue