Gitea에 동적 클라이언트 등록이 없어 MCP 클라이언트가 URL만으로 OAuth 연결을 못 하는 문제를 이 브리지가 인가 서버 역할을 대신해 해결한다. G3X의 plane-mcp-oauth-bridge(upstream_oauth 모드)에서 가져와 Gitea 전용으로 정리했다: Plane PAT 연결 페이지·워크스페이스 헤더·bridge_mode 분기를 없앴다. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
24 lines
681 B
Python
24 lines
681 B
Python
from __future__ import annotations
|
|
|
|
import base64
|
|
import hashlib
|
|
|
|
from cryptography.fernet import Fernet, InvalidToken
|
|
|
|
|
|
def make_fernet(encryption_key: str) -> Fernet:
|
|
digest = hashlib.sha256(encryption_key.encode("utf-8")).digest()
|
|
key = base64.urlsafe_b64encode(digest)
|
|
return Fernet(key)
|
|
|
|
|
|
def encrypt_token(encryption_key: str, plaintext: str) -> str:
|
|
return make_fernet(encryption_key).encrypt(plaintext.encode("utf-8")).decode("ascii")
|
|
|
|
|
|
def decrypt_token(encryption_key: str, ciphertext: str) -> str | None:
|
|
try:
|
|
return make_fernet(encryption_key).decrypt(ciphertext.encode("ascii")).decode("utf-8")
|
|
except InvalidToken:
|
|
return None
|