Skip to content

Commit 5306aea

Browse files
committed
[server] createProject should not query all repositories
except for github.com when using the GitHub App.
1 parent 7e3ccd1 commit 5306aea

File tree

2 files changed

+39
-6
lines changed

2 files changed

+39
-6
lines changed

components/server/src/projects/projects-service.ts

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import { ErrorCodes, ApplicationError } from "@gitpod/gitpod-protocol/lib/messag
2525
import { URL } from "url";
2626
import { Authorizer } from "../authorization/authorizer";
2727
import { TransactionalContext } from "@gitpod/gitpod-db/lib/typeorm/transactional-db-impl";
28+
import { GitHubAppSupport } from "../github/github-app-support";
2829

2930
@injectable()
3031
export class ProjectsService {
@@ -36,6 +37,7 @@ export class ProjectsService {
3637
@inject(IAnalyticsWriter) private readonly analytics: IAnalyticsWriter,
3738
@inject(WebhookEventDB) private readonly webhookEventDB: WebhookEventDB,
3839
@inject(Authorizer) private readonly auth: Authorizer,
40+
@inject(GitHubAppSupport) private readonly githubAppSupport: GitHubAppSupport,
3941
) {}
4042

4143
async getProject(userId: string, projectId: string): Promise<Project> {
@@ -193,6 +195,40 @@ export class ProjectsService {
193195
return result;
194196
}
195197

198+
async canCreateProject(currentUser: User, cloneURL: string) {
199+
try {
200+
const parsedUrl = RepoURL.parseRepoUrl(cloneURL);
201+
const hostContext = parsedUrl?.host ? this.hostContextProvider.get(parsedUrl?.host) : undefined;
202+
const authProvider = hostContext && hostContext.authProvider.info;
203+
const type = authProvider && authProvider.authProviderType;
204+
const host = authProvider?.host;
205+
if (!type || !host) {
206+
throw Error("Unknown host: " + parsedUrl?.host);
207+
}
208+
if (
209+
type === "GitLab" ||
210+
type === "Bitbucket" ||
211+
type === "BitbucketServer" ||
212+
(type === "GitHub" && (host !== "github.com" || !this.config.githubApp?.enabled))
213+
) {
214+
const repositoryService = hostContext?.services?.repositoryService;
215+
if (repositoryService) {
216+
return await repositoryService.canInstallAutomatedPrebuilds(currentUser, cloneURL);
217+
}
218+
}
219+
if (host === "github.com" && this.config.githubApp?.enabled) {
220+
const availableRepositories = await this.githubAppSupport.getProviderRepositoriesForUser({
221+
user: currentUser,
222+
provider: "github.com",
223+
});
224+
return availableRepositories.some((r) => r.cloneUrl === cloneURL);
225+
}
226+
} catch (error) {
227+
log.error("Failed to check precondition for creating a project.");
228+
}
229+
return false;
230+
}
231+
196232
async createProject(
197233
{ name, slug, cloneUrl, teamId, appInstallationId }: CreateProjectParams,
198234
installer: User,

components/server/src/workspace/gitpod-server-impl.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2638,16 +2638,13 @@ export class GitpodServerImpl implements GitpodServerWithTracing, Disposable {
26382638
await this.auth.checkPermissionOnOrganization(user.id, "create_project", params.teamId);
26392639

26402640
// Check if provided clone URL is accessible for the current user, and user has admin permissions.
2641-
let url;
26422641
try {
2643-
url = new URL(params.cloneUrl);
2642+
new URL(params.cloneUrl);
26442643
} catch (err) {
26452644
throw new ApplicationError(ErrorCodes.BAD_REQUEST, "Clone URL must be a valid URL.");
26462645
}
2647-
const availableRepositories = await this.getProviderRepositoriesForUser(ctx, { provider: url.host });
2648-
if (!availableRepositories.some((r) => r.cloneUrl === params.cloneUrl)) {
2649-
// The error message is derived from internals of `getProviderRepositoriesForUser` and
2650-
// `getRepositoriesForAutomatedPrebuilds`, which require admin permissions to be present.
2646+
const canCreateProject = await this.projectsService.canCreateProject(user, params.cloneUrl);
2647+
if (!canCreateProject) {
26512648
throw new ApplicationError(
26522649
ErrorCodes.BAD_REQUEST,
26532650
"Repository URL seems to be inaccessible, or admin permissions are missing.",

0 commit comments

Comments
 (0)