brainz-social-old/routes/api/v1/accounts/verify_credentials.js

125 lines
7.2 KiB
JavaScript

const crypto = require("crypto");
const databaseHandler = require("../../../../lib/database-handler");
const auth = require("../../../../middleware/auth");
module.exports = {
route: (routeObj) => {
routeObj.get(auth.auth_token(true, "read:accounts"), (req, res) => {
const token = req.brainz.token;
const account = databaseHandler.getAccountByToken(token.token);
const accountActivityRow = databaseHandler.getAccountActivityByAccount(account.id);
let accountActivity = {};
if (accountActivityRow) {
accountActivity = JSON.parse(accountActivityRow.object);
} else {
const keyPair = crypto.generateKeyPairSync("rsa", {
modulusLength: 4096,
publicKeyEncoding: {
type: "spki",
format: "pem",
},
privateKeyEncoding: {
type: "pkcs8",
format: "pem",
},
});
databaseHandler.storeW3idSecurityKey(`https://${req.headers.host}/users/${account.username}#main-key`, keyPair.publicKey, keyPair.privateKey, (Math.floor(Date.now() / 1000) + (86400 * 90)));
accountActivity = {
"@id": `https://${req.headers.host}/users/${account.username}`,
"@type": "https://www.w3.org/ns/activitystreams#Person",
"http://joinmastodon.org/ns#devices": {
"@id": `https://${req.headers.host}/users/${account.username}/collections/devices`,
},
"http://joinmastodon.org/ns#discoverable": true,
"http://joinmastodon.org/ns#featured": {
"@id": `https://${req.headers.host}/users/${account.username}/collections/featured`,
},
"http://joinmastodon.org/ns#featuredTags": {
"@id": `https://${req.headers.host}/users/${account.username}/collections/tags`,
},
"http://joinmastodon.org/ns#indexable": true,
"http://joinmastodon.org/ns#memorial": false,
"http://www.w3.org/ns/ldp#inbox": {
"@id": `https://${req.headers.host}/users/${account.username}/inbox`,
},
"https://w3id.org/security#publicKey": {
"@id": `https://${req.headers.host}/users/${account.username}#main-key`,
"https://w3id.org/security#owner": {
"@id": `https://${req.headers.host}/users/${account.username}`,
},
"https://w3id.org/security#publicKeyPem": keyPair.publicKey,
},
"https://www.w3.org/ns/activitystreams#endpoints": {
"https://www.w3.org/ns/activitystreams#sharedInbox": {
"@id": `https://${req.headers.host}/inbox`,
},
},
"https://www.w3.org/ns/activitystreams#followers": {
"@id": `https://${req.headers.host}/users/${account.username}/followers`,
},
"https://www.w3.org/ns/activitystreams#following": {
"@id": `https://${req.headers.host}/users/${account.username}/following`,
},
"https://www.w3.org/ns/activitystreams#icon": {
"@type": "https://www.w3.org/ns/activitystreams#Image",
"https://www.w3.org/ns/activitystreams#mediaType": "image/png",
"https://www.w3.org/ns/activitystreams#url": {
"@id": `https://${req.headers.host}/res/avatar_not_found.png`,
},
},
"https://www.w3.org/ns/activitystreams#manuallyApprovesFollowers": false,
"https://www.w3.org/ns/activitystreams#name": account.username,
"https://www.w3.org/ns/activitystreams#outbox": {
"@id": `https://${req.headers.host}/users/${account.username}/outbox`,
},
"https://www.w3.org/ns/activitystreams#preferredUsername": account.username,
"https://www.w3.org/ns/activitystreams#published": {
"@type": "http://www.w3.org/2001/XMLSchema#dateTime",
"@value": new Date(Date.now()).toISOString(),
},
"https://www.w3.org/ns/activitystreams#summary": "",
"https://www.w3.org/ns/activitystreams#tag": [],
"https://www.w3.org/ns/activitystreams#url": {
"@id": `https://${req.headers.host}/@${account.username}`,
},
};
databaseHandler.addActivity(JSON.stringify(accountActivity), accountActivity["@type"], "true", accountActivity["@id"], account.username, (new Date(Number(account.created_at))).toISOString());
}
const last_status = databaseHandler.getLastStatus(account.username);
res.status(200);
res.json({
id: accountActivity["@id"],
username: account.username,
acct: account.username,
url: accountActivity["https://www.w3.org/ns/activitystreams#url"]["@id"],
display_name: accountActivity["https://www.w3.org/ns/activitystreams#preferredUsername"],
avatar: accountActivity["https://www.w3.org/ns/activitystreams#icon"]["https://www.w3.org/ns/activitystreams#url"]["@id"],
avatar_static: accountActivity["https://www.w3.org/ns/activitystreams#icon"]["https://www.w3.org/ns/activitystreams#url"]["@id"],
header: accountActivity["https://www.w3.org/ns/activitystreams#icon"]["https://www.w3.org/ns/activitystreams#url"]["@id"],
header_static: accountActivity["https://www.w3.org/ns/activitystreams#icon"]["https://www.w3.org/ns/activitystreams#url"]["@id"],
locked: accountActivity["https://www.w3.org/ns/activitystreams#manuallyApprovesFollowers"],
emojis: [],
bot: accountActivity["@type"] === "https://www.w3.org/ns/activitystreams#Service",
group: accountActivity["@type"] === "https://www.w3.org/ns/activitystreams#Group",
discoverable: accountActivity["http://joinmastodon.org/ns#discoverable"],
created_at: accountActivity["https://www.w3.org/ns/activitystreams#published"]["@value"],
last_status_at: last_status ? last_status.created_at : null,
statuses_count: databaseHandler.getStatusCount(account.username).count,
// TODO: Proper followers and following count.
followers_count: -1,
following_count: -1,
source: {
note: "",
fields: [],
privacy: "public",
sensitive: false,
language: "en",
},
});
return;
});
},
};