125 lines
7.2 KiB
JavaScript
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;
|
|
});
|
|
},
|
|
};
|