Spaces:
Sleeping
Sleeping
switch to rebuilding for a better security
Browse files- src/gradio_space_ci/webhook.py +33 -18
src/gradio_space_ci/webhook.py
CHANGED
@@ -28,9 +28,6 @@ from huggingface_hub import (
|
|
28 |
snapshot_download,
|
29 |
space_info,
|
30 |
upload_folder,
|
31 |
-
delete_space_secret,
|
32 |
-
delete_space_variable,
|
33 |
-
delete_space_storage,
|
34 |
)
|
35 |
from huggingface_hub.repocard import RepoCard
|
36 |
from huggingface_hub.utils import (
|
@@ -487,19 +484,37 @@ def set_config(space_id: str, pr_num: str) -> None:
|
|
487 |
request_space_storage(ci_space_id, storage)
|
488 |
|
489 |
|
490 |
-
def
|
491 |
-
"a function to
|
|
|
|
|
492 |
ci_space_id = _get_ci_space_id(space_id=space_id, pr_num=pr_num)
|
493 |
-
|
494 |
-
|
495 |
-
|
496 |
-
|
497 |
-
|
498 |
-
|
499 |
-
|
500 |
-
|
501 |
-
|
502 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
503 |
|
504 |
|
505 |
def handle_modification(space_id: str, discussion: Any) -> None:
|
@@ -509,8 +524,8 @@ def handle_modification(space_id: str, discussion: Any) -> None:
|
|
509 |
details = get_discussion_details(repo_id=space_id, repo_type="space", discussion_num=discussion.num)
|
510 |
event_author = details.events[-1]._event["author"]["name"] # username of that event
|
511 |
if event_author not in EPHEMERAL_SPACES_CONFIG["trusted_authors"]:
|
512 |
-
# Untrusted author, we
|
513 |
-
|
514 |
|
515 |
|
516 |
def handle_command(space_id: str, payload: WebhookPayload) -> None:
|
@@ -523,7 +538,7 @@ def handle_command(space_id: str, payload: WebhookPayload) -> None:
|
|
523 |
set_config(space_id=space_id, pr_num=pr_num)
|
524 |
notify_pr(space_id=space_id, pr_num=pr_num, action="trusted_pr")
|
525 |
elif payload.comment.content == "/untrust_pr":
|
526 |
-
|
527 |
notify_pr(space_id=space_id, pr_num=pr_num, action="untrusted_pr")
|
528 |
|
529 |
|
|
|
28 |
snapshot_download,
|
29 |
space_info,
|
30 |
upload_folder,
|
|
|
|
|
|
|
31 |
)
|
32 |
from huggingface_hub.repocard import RepoCard
|
33 |
from huggingface_hub.utils import (
|
|
|
484 |
request_space_storage(ci_space_id, storage)
|
485 |
|
486 |
|
487 |
+
def rebuild_space(space_id: str, pr_num: int) -> None:
|
488 |
+
"a function to rebuild the ephemeral space without config"
|
489 |
+
# This is useful to cut down on resource usage and to remove tokens from
|
490 |
+
# the ephemeral space
|
491 |
ci_space_id = _get_ci_space_id(space_id=space_id, pr_num=pr_num)
|
492 |
+
try:
|
493 |
+
delete_repo(repo_id=ci_space_id, repo_type="space")
|
494 |
+
except RepositoryNotFoundError:
|
495 |
+
pass
|
496 |
+
create_ephemeral_space(space_id=space_id, pr_num=pr_num)
|
497 |
+
# Download space codebase from PR revision
|
498 |
+
snapshot_path = Path(snapshot_download(repo_id=space_id, revision=f"refs/pr/{pr_num}", repo_type="space"))
|
499 |
+
|
500 |
+
# Overwrite README file in cache (/!\)
|
501 |
+
readme_path = snapshot_path / "README.md"
|
502 |
+
card = RepoCard.load(readme_path)
|
503 |
+
setattr(card.data, "synced_sha", snapshot_path.name) # latest sha
|
504 |
+
card.data.title = f"{card.data.title} (ephemeral #{pr_num})"
|
505 |
+
card.save(readme_path)
|
506 |
+
|
507 |
+
# Sync space codebase with PR revision
|
508 |
+
upload_folder(
|
509 |
+
repo_id=ci_space_id,
|
510 |
+
repo_type="space",
|
511 |
+
commit_message=f"Sync CI Space with PR {pr_num}.",
|
512 |
+
folder_path=snapshot_path,
|
513 |
+
delete_patterns="*",
|
514 |
+
)
|
515 |
+
|
516 |
+
# Delete readme file from cache (just in case)
|
517 |
+
readme_path.unlink(missing_ok=True)
|
518 |
|
519 |
|
520 |
def handle_modification(space_id: str, discussion: Any) -> None:
|
|
|
524 |
details = get_discussion_details(repo_id=space_id, repo_type="space", discussion_num=discussion.num)
|
525 |
event_author = details.events[-1]._event["author"]["name"] # username of that event
|
526 |
if event_author not in EPHEMERAL_SPACES_CONFIG["trusted_authors"]:
|
527 |
+
# Untrusted author, we rebuild the space
|
528 |
+
rebuild_space(space_id=space_id, pr_num=discussion.num)
|
529 |
|
530 |
|
531 |
def handle_command(space_id: str, payload: WebhookPayload) -> None:
|
|
|
538 |
set_config(space_id=space_id, pr_num=pr_num)
|
539 |
notify_pr(space_id=space_id, pr_num=pr_num, action="trusted_pr")
|
540 |
elif payload.comment.content == "/untrust_pr":
|
541 |
+
rebuild_space(space_id=space_id, pr_num=pr_num)
|
542 |
notify_pr(space_id=space_id, pr_num=pr_num, action="untrusted_pr")
|
543 |
|
544 |
|