Skip to content

Commit 8c04321

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

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
@@ -26,6 +26,7 @@ import { ErrorCodes, ApplicationError } from "@gitpod/gitpod-protocol/lib/messag
2626
import { URL } from "url";
2727
import { Authorizer } from "../authorization/authorizer";
2828
import { TransactionalContext } from "@gitpod/gitpod-db/lib/typeorm/transactional-db-impl";
29+
import { GitHubAppSupport } from "../github/github-app-support";
2930

3031
@injectable()
3132
export class ProjectsService {
@@ -37,6 +38,7 @@ export class ProjectsService {
3738
@inject(IAnalyticsWriter) private readonly analytics: IAnalyticsWriter,
3839
@inject(WebhookEventDB) private readonly webhookEventDB: WebhookEventDB,
3940
@inject(Authorizer) private readonly auth: Authorizer,
41+
@inject(GitHubAppSupport) private readonly githubAppSupport: GitHubAppSupport,
4042
) {}
4143

4244
async getProject(userId: string, projectId: string): Promise<Project> {
@@ -194,6 +196,40 @@ export class ProjectsService {
194196
return result;
195197
}
196198

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

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

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

27902790
// Check if provided clone URL is accessible for the current user, and user has admin permissions.
2791-
let url;
27922791
try {
2793-
url = new URL(params.cloneUrl);
2792+
new URL(params.cloneUrl);
27942793
} catch (err) {
27952794
throw new ApplicationError(ErrorCodes.BAD_REQUEST, "Clone URL must be a valid URL.");
27962795
}
2797-
const availableRepositories = await this.getProviderRepositoriesForUser(ctx, { provider: url.host });
2798-
if (!availableRepositories.some((r) => r.cloneUrl === params.cloneUrl)) {
2799-
// The error message is derived from internals of `getProviderRepositoriesForUser` and
2800-
// `getRepositoriesForAutomatedPrebuilds`, which require admin permissions to be present.
2796+
const canCreateProject = await this.projectsService.canCreateProject(user, params.cloneUrl);
2797+
if (!canCreateProject) {
28012798
throw new ApplicationError(
28022799
ErrorCodes.BAD_REQUEST,
28032800
"Repository URL seems to be inaccessible, or admin permissions are missing.",

0 commit comments

Comments
 (0)