| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- from collections.abc import Mapping
- from typing import Any
-
- from werkzeug import Request
-
- from core.plugin.entities.plugin_daemon import PluginOAuthAuthorizationUrlResponse, PluginOAuthCredentialsResponse
- from core.plugin.impl.base import BasePluginClient
-
-
- class OAuthHandler(BasePluginClient):
- def get_authorization_url(
- self,
- tenant_id: str,
- user_id: str,
- plugin_id: str,
- provider: str,
- system_credentials: Mapping[str, Any],
- ) -> PluginOAuthAuthorizationUrlResponse:
- return self._request_with_plugin_daemon_response(
- "POST",
- f"plugin/{tenant_id}/dispatch/oauth/get_authorization_url",
- PluginOAuthAuthorizationUrlResponse,
- data={
- "user_id": user_id,
- "data": {
- "provider": provider,
- "system_credentials": system_credentials,
- },
- },
- headers={
- "X-Plugin-ID": plugin_id,
- "Content-Type": "application/json",
- },
- )
-
- def get_credentials(
- self,
- tenant_id: str,
- user_id: str,
- plugin_id: str,
- provider: str,
- system_credentials: Mapping[str, Any],
- request: Request,
- ) -> PluginOAuthCredentialsResponse:
- """
- Get credentials from the given request.
- """
-
- # encode request to raw http request
- raw_request_bytes = self._convert_request_to_raw_data(request)
-
- return self._request_with_plugin_daemon_response(
- "POST",
- f"plugin/{tenant_id}/dispatch/oauth/get_credentials",
- PluginOAuthCredentialsResponse,
- data={
- "user_id": user_id,
- "data": {
- "provider": provider,
- "system_credentials": system_credentials,
- "raw_request_bytes": raw_request_bytes,
- },
- },
- headers={
- "X-Plugin-ID": plugin_id,
- "Content-Type": "application/json",
- },
- )
-
- def _convert_request_to_raw_data(self, request: Request) -> bytes:
- """
- Convert a Request object to raw HTTP data.
-
- Args:
- request: The Request object to convert.
-
- Returns:
- The raw HTTP data as bytes.
- """
- # Start with the request line
- method = request.method
- path = request.path
- protocol = request.headers.get("HTTP_VERSION", "HTTP/1.1")
- raw_data = f"{method} {path} {protocol}\r\n".encode()
-
- # Add headers
- for header_name, header_value in request.headers.items():
- raw_data += f"{header_name}: {header_value}\r\n".encode()
-
- # Add empty line to separate headers from body
- raw_data += b"\r\n"
-
- # Add body if exists
- body = request.get_data(as_text=False)
- if body:
- raw_data += body
-
- return raw_data
|