import { readFile } from "node:fs/promises" import { readFileSync } from "node:fs"; import { createSign } from "node:crypto"; import Fastify from "fastify"; import { join } from "node:path"; import mime from "mime" import { assert } from "node:console"; const M2M_ALGORITHM = "RSA-SHA512" const { private: M2M_PRIVATE_KEY, public: M2M_PUBLIC_KEY } = loadM2MKeys() if (M2M_PRIVATE_KEY == null || M2M_PUBLIC_KEY == null) { console.error("Couldn't load keys") process.exit(1) } const ASSETS_FOLDER = "../.assets/" const ASSET_API_LANDING_MESSAGE = "asset-api v1.0.0" const IDENTITY_API_ENDPOINT = "http://localhost:3000" const fastify = new Fastify({ logger: true, }) fastify.get("/", async (request, reply) => { return signString(ASSET_API_LANDING_MESSAGE) }) fastify.get("/crypto/cert", async (request, reply) => { return M2M_PUBLIC_KEY }) fastify.get("/crypto/algo", (request, reply) => { return M2M_ALGORITHM }) fastify.put("/asset", { async handler(request, reply) { let user = await userFromSessionKey(request.query.session_key) // continue working onmthis console.log(typeof request.body) }, schema: { query: { type: "object", properties: { session_key: { type: "string" }, }, required: ["session_key"], }, }, }) fastify.get("/asset", { async handler(request, reply) { let user = await userFromSessionKey(request.query.session_key) if (user.assets.includes(request.query.asset_id)) { let path = join(ASSETS_FOLDER, request.query.asset_id) reply.type(mime.getType(path)) reply.send(await readFile(path)) } else { return "Not authorized" } }, schema: { query: { type: "object", properties: { asset_id: { type: "string" }, session_key: { type: "string" }, }, required: ["asset_id", "session_key"], }, }, }) fastify.listen({ port: 3001 }) function loadM2MKeys() { return { private: readFileSync("../.keys/m2m-dev.pem").toString("ascii"), public: readFileSync("../.keys/m2m-dev.pub").toString("ascii"), } } function signString(content) { let sign = createSign(M2M_ALGORITHM) sign.update(content) return `-----BEGIN SIGNED MESSAGE-----\n\n${content}\n\n-----BEGIN SIGNATURE-----\n\n${sign.sign(M2M_PRIVATE_KEY, "base64")}\n-----END SIGNATURE-----` } function signObject(content) { return signString(JSON.stringify(content)) } async function userFromSessionKey(session_key) { let url = new URL(IDENTITY_API_ENDPOINT) url.pathname = "/m2m/account" let res1 = await fetch(url, { method: "POST", body: signObject({ session_key: request.query.session_key, }) }) return await res1.json() }