diff options
Diffstat (limited to 'packages/server/src/routes/repo.ts')
-rw-r--r-- | packages/server/src/routes/repo.ts | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/packages/server/src/routes/repo.ts b/packages/server/src/routes/repo.ts new file mode 100644 index 0000000..ce81dcd --- /dev/null +++ b/packages/server/src/routes/repo.ts @@ -0,0 +1,84 @@ +import { Repository } from "../git/repository"; +import { CoolFastifyRequest, Route } from "../types/fastify"; +import { Tag } from "../git/tag"; +import { FastifyInstance, FastifyPluginOptions } from "fastify"; +import { verifyRepoName } from "../routes/api/util"; +import { BaseError } from "../git/error"; + +export default function(fastify: FastifyInstance, opts: FastifyPluginOptions, done: (err?: Error) => void): void { + fastify.addHook("onRequest", async(req: CoolFastifyRequest, reply) => { + if(!verifyRepoName(req.params.repo)) { + reply.code(400).send("Bad request"); + } + }); + + fastify.route<Route>({ + method: "GET", + url: "/info/refs", + handler: async(req, reply) => { + reply.header("Content-Type", "application/x-git-upload-pack-advertisement"); + + if(!req.query.service) { + reply.header("Content-Type", "text/plain"); + reply.code(403).send("Missing service query parameter\n"); + return; + } + + if(req.query.service !== "git-upload-pack") { + reply.header("Content-Type", "text/plain"); + reply.code(403).send("Access denied!\n"); + return; + } + + if(Object.keys(req.query).length !== 1) { + reply.code(403).send("Too many query parameters!\n"); + return; + } + + const repository = await Repository.open(opts.config.settings.base_dir, req.params.repo); + repository.HTTPconnect(req, reply); + } + }); + + fastify.route<Route>({ + method: "POST", + url: "/git-upload-pack", + handler: async(req, reply) => { + const repository = await Repository.open(opts.config.settings.base_dir, req.params.repo); + repository.HTTPconnect(req, reply); + } + }); + + fastify.route({ + method: "POST", + url: "/git-receive-pack", + handler: (req, reply) => { + reply.header("Content-Type", "application/x-git-receive-pack-result"); + reply.code(403).send("Access denied!"); + } + }); + + fastify.route<Route>({ + method: "GET", + url: "/refs/tags/:tag", + handler: async(req, reply) => { + const repository: Repository | BaseError = await Repository.open(opts.settings.base_dir, req.params.repo).catch(err => err); + + if(repository instanceof BaseError) { + reply.code(repository.code).send(repository.message); + return; + } + + const tag = await Tag.lookup(repository, req.params.tag).catch(err => err); + + if(tag instanceof BaseError) { + reply.code(tag.code).send(tag.message); + return; + } + + tag.downloadTarball(reply); + } + }); + + done(); +}
\ No newline at end of file |