Skip to content

Commit 2e7bfe9

Browse files
committed
feat: update subscription user agent on raw request
1 parent 66eb6e2 commit 2e7bfe9

3 files changed

Lines changed: 29 additions & 8 deletions

File tree

app/operation/subscription.py

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -230,18 +230,18 @@ def create_info_response_headers(user: UsersResponseWithInbounds, sub_settings:
230230
# Only include headers that have values
231231
return {k: v for k, v in headers.items() if v}
232232

233-
async def fetch_config(self, user: UsersResponseWithInbounds, client_type: ConfigFormat) -> tuple[str, str]:
233+
async def fetch_config(self, user: UsersResponseWithInbounds, client_type: ConfigFormat) -> tuple[str | bytes, str]:
234234
# Get client configuration
235-
config = client_config.get(client_type)
235+
config = client_config.get(client_type, {})
236236
sub_settings = await subscription_settings()
237237
randomize_order = sub_settings.randomize_order
238238

239239
# Generate subscription content
240240
return (
241241
await generate_subscription(
242242
user=user,
243-
config_format=config["config_format"],
244-
as_base64=config["as_base64"],
243+
config_format=config.get("config_format", ""),
244+
as_base64=config.get("as_base64", ""),
245245
randomize_order=randomize_order,
246246
),
247247
config["media_type"],
@@ -386,10 +386,20 @@ def _build_raw_subscription_payload(
386386
"apps": self._make_apps_import_urls(sub_settings.applications, format_variables),
387387
}
388388

389-
async def user_subscription_raw(self, db: AsyncSession, token: str):
389+
async def user_subscription_raw(
390+
self,
391+
db: AsyncSession,
392+
token: str,
393+
update_user_agent: str = "",
394+
ip: str | None = None,
395+
):
390396
sub_settings: SubSettings = await subscription_settings()
391397
db_user = await self.get_validated_sub(db, token)
392398
user = await self.validated_user(db_user)
399+
400+
if update_user_agent:
401+
await user_sub_update(db, db_user.id, update_user_agent, ip=ip)
402+
393403
links = []
394404
if sub_settings.allow_browser_config:
395405
conf, _ = await self.fetch_config(user, ConfigFormat.links)

app/routers/subscription.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from app.operation import OperatorType
99
from app.operation.subscription import SubscriptionOperation
1010
from config import subscription_env_settings
11+
1112
from .dependencies import get_subscription_usage_query
1213

1314
router = APIRouter(tags=["Subscription"], prefix=f"/{subscription_env_settings.path}")
@@ -43,8 +44,18 @@ async def user_subscription_info(request: Request, token: str, db: AsyncSession
4344

4445

4546
@router.get("/{token}/raw")
46-
async def user_subscription_raw(token: str, db: AsyncSession = Depends(get_db)):
47-
return await subscription_operator.user_subscription_raw(db, token=token)
47+
async def user_subscription_raw(
48+
request: Request,
49+
token: str,
50+
db: AsyncSession = Depends(get_db),
51+
update_user_agent: str = Header(default="", alias="X-Subscription-User-Agent"),
52+
):
53+
return await subscription_operator.user_subscription_raw(
54+
db,
55+
token=token,
56+
update_user_agent=update_user_agent,
57+
ip=request.client.host if request.client else None,
58+
)
4859

4960

5061
@router.get("/{token}/apps", response_model=list[Application])

app/subscription/share.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -341,7 +341,7 @@ async def process_inbounds_and_tags(
341341
client_templates: dict[str, str],
342342
xray_template_overrides: dict[int, str] | None = None,
343343
randomize_order: bool = False,
344-
) -> list | str | bytes:
344+
) -> str | bytes:
345345
proxy_settings = user.proxy_settings.dict()
346346
proxy_settings["_user_id"] = user.id
347347
hosts = await filter_hosts(list((await host_manager.get_hosts()).values()), user.status)

0 commit comments

Comments
 (0)