import traceback from pydantic import SecretStr from openhands.core.logger import openhands_logger as logger from openhands.integrations.github.github_service import GitHubService from openhands.integrations.gitlab.gitlab_service import GitLabService from openhands.integrations.provider import ProviderType async def validate_provider_token( token: SecretStr, base_domain: str | None = None ) -> ProviderType | None: """ Determine whether a token is for GitHub or GitLab by attempting to get user info from both services. Args: token: The token to check Returns: 'github' if it's a GitHub token 'gitlab' if it's a GitLab token None if the token is invalid for both services """ # Try GitHub first try: github_service = GitHubService(token=token, base_domain=base_domain) await github_service.verify_access() return ProviderType.GITHUB except Exception as e: logger.debug( f'Failed to validate Github token: {e} \n {traceback.format_exc()}' ) # Try GitLab next try: gitlab_service = GitLabService(token=token, base_domain=base_domain) await gitlab_service.get_user() return ProviderType.GITLAB except Exception as e: logger.debug( f'Failed to validate GitLab token: {e} \n {traceback.format_exc()}' ) return None