Break out JIRA oauth handling

This commit is contained in:
Will Hunt 2021-11-22 18:07:08 +00:00
parent 1d9ed92144
commit d0c936bd12
3 changed files with 72 additions and 4 deletions

View File

@ -39,10 +39,18 @@ interface BridgeConfigGitLab {
instances: {[name: string]: GitLabInstance};
}
interface BridgeConfigJira {
export interface BridgeConfigJira {
webhook: {
secret: string;
};
oauth: {
// eslint-disable-next-line camelcase
client_id: string;
// eslint-disable-next-line camelcase
client_secret: string;
// eslint-disable-next-line camelcase
redirect_uri: string;
};
}
interface BridgeGenericWebhooksConfig {

55
src/Jira/Router.ts Normal file
View File

@ -0,0 +1,55 @@
import axios from "axios";
import { Router, Request, Response } from "express";
import qs from "querystring";
import { BridgeConfigJira } from "../Config/Config";
import LogWrapper from "../LogWrapper";
import { MessageQueue } from "../MessageQueue/MessageQueue";
import { OAuthRequest, OAuthTokens } from "../Webhooks";
const log = new LogWrapper("JiraRouter");
export default class JiraRouter {
constructor(private readonly config: BridgeConfigJira, private readonly queue: MessageQueue) { }
private async onOAuth(req: Request, res: Response) {
log.info("Got new JIRA oauth request");
try {
const exists = await this.queue.pushWait<OAuthRequest, boolean>({
eventName: "jira.oauth.response",
sender: "GithubWebhooks",
data: {
code: req.query.code as string,
state: req.query.state as string,
},
});
if (!exists) {
res.status(404).send(`<p>Could not find user which authorised this request. Has it timed out?</p>`);
return;
}
const accessTokenRes = await axios.post(`https://github.com/login/oauth/access_token?${qs.encode({
client_id: this.config.oauth.client_id,
client_secret: this.config.oauth.client_secret,
code: req.query.code as string,
redirect_uri: this.config.oauth.redirect_uri,
state: req.query.state as string,
})}`);
// eslint-disable-next-line camelcase
const result = qs.parse(accessTokenRes.data) as { access_token: string, token_type: string };
await this.queue.push<OAuthTokens>({
eventName: "oauth.tokens",
sender: "GithubWebhooks",
data: { state: req.query.state as string, ... result },
});
res.send(`<p> Your account has been bridged </p>`);
} catch (ex) {
log.error("Failed to handle oauth request:", ex);
res.status(500).send(`<p>Encountered an error handing oauth request</p>`);
}
}
public getRouter() {
const router = Router();
router.get("/oauth", this.onOAuth.bind(this));
return router;
}
}

View File

@ -8,7 +8,8 @@ import { Server } from "http";
import axios from "axios";
import { IGitLabWebhookEvent } from "./Gitlab/WebhookTypes";
import { EmitterWebhookEvent, Webhooks as OctokitWebhooks } from "@octokit/webhooks"
import { IJiraWebhookEvent, JiraIssueEvent } from "./Jira/WebhookTypes";
import { IJiraWebhookEvent } from "./Jira/WebhookTypes";
import JiraRouter from "./Jira/Router";
const log = new LogWrapper("GithubWebhooks");
export interface GenericWebhookEvent {
@ -70,7 +71,11 @@ export class Webhooks extends EventEmitter {
verify: this.verifyRequest.bind(this),
}));
this.expressApp.post("/", this.onPayload.bind(this));
this.expressApp.get("/oauth", this.onGetOauth.bind(this));
this.expressApp.get("/oauth", this.onGitHubGetOauth.bind(this));
this.queue = createMessageQueue(config);
if (this.config.jira) {
this.expressApp.use("/jira", new JiraRouter(this.config.jira, this.queue).getRouter());
}
this.queue = createMessageQueue(config);
}
@ -201,7 +206,7 @@ export class Webhooks extends EventEmitter {
}
}
public async onGetOauth(req: Request, res: Response) {
public async onGitHubGetOauth(req: Request, res: Response) {
log.info("Got new oauth request");
try {
if (!this.config.github) {