Finish adding support for self-hosted GitLab integration

This commit is contained in:
Tuan Dang
2023-09-06 10:57:27 +01:00
parent 04548313ab
commit d07b2dafc3
11 changed files with 73 additions and 39 deletions
@@ -367,16 +367,19 @@ export const useAuthorizeIntegration = () => {
mutationFn: async ({
workspaceId,
code,
integration
integration,
url
}: {
workspaceId: string;
code: string;
integration: string;
url?: string;
}) => {
const { data: { integrationAuth } } = await apiRequest.post("/api/v1/integration-auth/oauth-token", {
workspaceId,
code,
integration
integration,
url
});
return integrationAuth;
@@ -14,18 +14,20 @@ export default function GitLabAuthorizeIntegrationPage() {
const [gitLabURL, setGitLabURL] = useState("");
const handleIntegrateWithOAuth = () => {
if (!cloudIntegrations) return;
const integrationOption = cloudIntegrations.find((integration) => integration.slug === "gitlab");
if (!integrationOption) return;
const baseURL = gitLabURL.trim() === "" ? "https://gitlab.com" : gitLabURL.trim();
const csrfToken = crypto.randomBytes(16).toString("hex");
localStorage.setItem("latestCSRFToken", csrfToken);
const link = `${baseURL}/oauth/authorize?client_id=${integrationOption.clientId}&redirect_uri=${window.location.origin}/integrations/gitlab/oauth2/callback&response_type=code&state=${state}`;
window.location.assign(link);
if (!cloudIntegrations) return;
const integrationOption = cloudIntegrations.find((integration) => integration.slug === "gitlab");
if (!integrationOption) return;
const baseURL = gitLabURL.trim() === "" ? "https://gitlab.com" : gitLabURL.trim();
const csrfToken = crypto.randomBytes(16).toString("hex");
localStorage.setItem("latestCSRFToken", csrfToken);
const state = `${csrfToken}|${gitLabURL.trim() === "" ? "" : gitLabURL.trim()}`;
const link = `${baseURL}/oauth/authorize?client_id=${integrationOption.clientId}&redirect_uri=${window.location.origin}/integrations/gitlab/oauth2/callback&response_type=code&state=${state}`;
window.location.assign(link);
}
return (
@@ -95,7 +95,7 @@ export default function GitLabCreateIntegrationPage() {
integrationAuthId: integrationAuth?._id,
isActive: true,
app: integrationAuthApps?.find((integrationAuthApp) => integrationAuthApp.appId === targetAppId)?.name,
appId: targetAppId,
appId: String(targetAppId),
sourceEnvironment: selectedSourceEnvironment,
targetEnvironment: targetEnvironment === "" ? "*" : targetEnvironment,
targetEnvironmentId: null,
@@ -15,14 +15,18 @@ export default function GitLabOAuth2CallbackPage() {
(async () => {
try {
// validate state
if (state !== localStorage.getItem("latestCSRFToken")) return;
const [csrfToken, url] = (state as string).split("|", 2);
if (csrfToken !== localStorage.getItem("latestCSRFToken")) return;
localStorage.removeItem("latestCSRFToken");
// TODO: self-hosted url somewhere here?
const integrationAuth = await mutateAsync({
workspaceId: localStorage.getItem("projectData.id") as string,
code: code as string,
integration: "gitlab"
integration: "gitlab",
...(url === "" ? {} : {
url
})
});
router.push(`/integrations/gitlab/create?integrationAuthId=${integrationAuth._id}`);