|
| 1 | +import re |
1 | 2 | from typing import Dict, List, Optional |
2 | 3 |
|
3 | 4 | import sqlalchemy.exc |
4 | 5 | from sqlalchemy import delete, select, update |
5 | 6 | from sqlalchemy.ext.asyncio import AsyncSession |
6 | 7 |
|
7 | | -from dstack._internal.core.errors import ResourceExistsError, ResourceNotExistsError |
| 8 | +from dstack._internal.core.errors import ( |
| 9 | + ResourceExistsError, |
| 10 | + ResourceNotExistsError, |
| 11 | + ServerClientError, |
| 12 | +) |
8 | 13 | from dstack._internal.core.models.secrets import Secret |
9 | 14 | from dstack._internal.server.models import DecryptedString, ProjectModel, SecretModel |
10 | 15 | from dstack._internal.utils.logging import get_logger |
11 | 16 |
|
12 | 17 | logger = get_logger(__name__) |
13 | 18 |
|
14 | 19 |
|
| 20 | +_SECRET_NAME_REGEX = "^[A-Za-z0-9-_]{1,200}$" |
| 21 | +_SECRET_VALUE_MAX_LENGTH = 2000 |
| 22 | + |
| 23 | + |
15 | 24 | async def list_secrets( |
16 | 25 | session: AsyncSession, |
17 | 26 | project: ProjectModel, |
@@ -49,6 +58,7 @@ async def create_or_update_secret( |
49 | 58 | name: str, |
50 | 59 | value: str, |
51 | 60 | ) -> Secret: |
| 61 | + _validate_secret(name=name, value=value) |
52 | 62 | try: |
53 | 63 | secret_model = await create_secret( |
54 | 64 | session=session, |
@@ -177,3 +187,18 @@ async def update_secret( |
177 | 187 | if secret_model is None: |
178 | 188 | raise ResourceNotExistsError() |
179 | 189 | return secret_model |
| 190 | + |
| 191 | + |
| 192 | +def _validate_secret(name: str, value: str): |
| 193 | + _validate_secret_name(name) |
| 194 | + _validate_secret_value(value) |
| 195 | + |
| 196 | + |
| 197 | +def _validate_secret_name(name: str): |
| 198 | + if re.match(_SECRET_NAME_REGEX, name) is None: |
| 199 | + raise ServerClientError(f"Secret name should match regex '{_SECRET_NAME_REGEX}") |
| 200 | + |
| 201 | + |
| 202 | +def _validate_secret_value(value: str): |
| 203 | + if len(value) > _SECRET_VALUE_MAX_LENGTH: |
| 204 | + raise ServerClientError(f"Secret value length must not exceed {_SECRET_VALUE_MAX_LENGTH}") |
0 commit comments