authsome 0.2.3rc65__tar.gz → 0.2.3rc67__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/PKG-INFO +1 -1
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/pyproject.toml +1 -1
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/cli/daemon_control.py +32 -4
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/cli/main.py +11 -4
- authsome-0.2.3rc67/src/authsome/server/routes/health.py +196 -0
- authsome-0.2.3rc65/src/authsome/server/routes/health.py +0 -70
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/.github/dependabot.yml +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/.github/pull_request_template.md +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/.github/release-please-config.json +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/.github/release-please-manifest.json +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/.github/workflows/pr-title.yml +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/.github/workflows/publish-rc.yml +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/.github/workflows/publish.yml +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/.github/workflows/release-please.yml +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/.github/workflows/test.yml +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/.gitignore +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/.pre-commit-config.yaml +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/AGENTS.md +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/CHANGELOG.md +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/CLAUDE.md +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/CONTRIBUTING.md +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/LICENSE +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/README.md +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/UBIQUITOUS_LANGUAGE.md +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/adr/0001-provider-client-record-server-scope.md +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/architecture.md +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/authsome-design.md +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/cli.md +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/manual-testing.md +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/providers.md +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/register-provider.md +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/security.md +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/site/README.md +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/site/concepts/architecture.mdx +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/site/concepts/credential-storage.mdx +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/site/concepts/provider-registry.mdx +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/site/concepts/proxy-injection.mdx +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/site/docs.json +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/site/guides/custom-providers.mdx +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/site/guides/headless-device-code.mdx +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/site/guides/login-with-oauth.mdx +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/site/guides/profiles.mdx +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/site/guides/run-agents-with-proxy.mdx +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/site/guides/use-api-keys.mdx +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/site/index.mdx +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/site/quickstart.mdx +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/site/reference/bundled-providers.mdx +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/site/reference/cli.mdx +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/site/reference/environment-variables.mdx +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/site/reference/provider-schema.mdx +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/site/troubleshooting/doctor.mdx +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/site/troubleshooting/oauth-callbacks.mdx +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/site/troubleshooting/proxy-networking.mdx +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/site/troubleshooting/token-refresh.mdx +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/specs/authsome-v1.md +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/refactoring.md +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/skills/authsome/SKILL.md +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/skills/authsome/evals/evals.json +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/__init__.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/audit/__init__.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/__init__.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/__init__.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/ahrefs.json +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/apollo.json +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/ashby.json +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/atlassian.json +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/beehiiv.json +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/brevo.json +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/buffer.json +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/calendly.json +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/clearbit.json +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/discord.json +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/dub.json +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/g2.json +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/github.json +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/gitlab.json +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/google.json +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/hubspot.json +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/hunter.json +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/instantly.json +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/intercom.json +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/keywords-everywhere.json +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/klaviyo-oauth.json +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/klaviyo.json +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/lemlist.json +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/linear.json +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/livestorm.json +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/mailchimp.json +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/mention-me.json +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/microsoft.json +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/notion.json +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/notion_dcr.json +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/openai.json +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/optimizely.json +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/postiz.json +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/postmark.json +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/resend.json +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/rewardful.json +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/savvycal.json +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/semrush.json +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/sendgrid.json +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/slack.json +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/tolt.json +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/typeform.json +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/wistia.json +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/x.json +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/zapier.json +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/flows/__init__.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/flows/api_key.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/flows/base.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/flows/dcr_pkce.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/flows/device_code.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/flows/pkce.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/input_provider.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/models/__init__.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/models/config.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/models/connection.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/models/enums.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/models/profile.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/models/provider.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/providers/__init__.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/providers/registry.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/service.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/sessions.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/cli/__init__.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/cli/client.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/errors.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/identity/__init__.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/proxy/__init__.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/proxy/router.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/proxy/runner.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/proxy/server.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/py.typed +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/server/__init__.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/server/app.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/server/daemon.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/server/dependencies.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/server/routes/__init__.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/server/routes/_deps.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/server/routes/auth.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/server/routes/connections.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/server/routes/providers.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/server/routes/proxy.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/server/routes/ui.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/server/schemas.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/server/ui/__init__.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/server/ui/pages.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/server/ui/web_theme.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/server/urls.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/store/__init__.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/store/interfaces.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/store/local.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/ui/__init__.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/ui/static/app.js +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/ui/static/style.css +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/ui/templates/_app_detail_shell.html +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/ui/templates/_layout.html +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/ui/templates/app_detail_apikey.html +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/ui/templates/app_detail_disconnected.html +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/ui/templates/app_detail_oauth.html +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/ui/templates/connections.html +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/ui/templates/overview.html +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/utils.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/vault/__init__.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/vault/crypto.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/__init__.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/auth/__init__.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/auth/test_flows.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/auth/test_models.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/auth/test_url_template.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/cli/__init__.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/cli/conftest.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/cli/test_daemon.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/cli/test_get.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/cli/test_helpers.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/cli/test_list.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/cli/test_login.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/cli/test_logout.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/cli/test_register.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/cli/test_revoke.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/cli/test_whoami.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/common/__init__.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/common/test_audit.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/common/test_errors.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/common/test_logging.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/common/test_utils.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/conftest.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/proxy/__init__.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/proxy/test_proxy.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/vault/__init__.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/vault/test_crypto.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/vault/test_store.py +0 -0
- {authsome-0.2.3rc65 → authsome-0.2.3rc67}/uv.lock +0 -0
|
@@ -35,8 +35,7 @@ def ensure_daemon() -> AuthsomeApiClient:
|
|
|
35
35
|
client = AuthsomeApiClient(DEFAULT_DAEMON_URL)
|
|
36
36
|
if _is_ready(client):
|
|
37
37
|
return client
|
|
38
|
-
|
|
39
|
-
stop_daemon()
|
|
38
|
+
stop_daemon()
|
|
40
39
|
start_daemon()
|
|
41
40
|
deadline = time.monotonic() + 10
|
|
42
41
|
while time.monotonic() < deadline:
|
|
@@ -71,7 +70,17 @@ def start_daemon() -> None:
|
|
|
71
70
|
|
|
72
71
|
|
|
73
72
|
def stop_daemon() -> None:
|
|
74
|
-
pid =
|
|
73
|
+
pid = None
|
|
74
|
+
client = AuthsomeApiClient(DEFAULT_DAEMON_URL)
|
|
75
|
+
try:
|
|
76
|
+
health_data = client.health()
|
|
77
|
+
pid = health_data.get("pid")
|
|
78
|
+
except Exception:
|
|
79
|
+
pass
|
|
80
|
+
|
|
81
|
+
if pid is None:
|
|
82
|
+
pid = _read_pid()
|
|
83
|
+
|
|
75
84
|
if pid is None:
|
|
76
85
|
return
|
|
77
86
|
try:
|
|
@@ -104,7 +113,26 @@ def daemon_status() -> dict[str, Any]:
|
|
|
104
113
|
|
|
105
114
|
def _is_ready(client: AuthsomeApiClient) -> bool:
|
|
106
115
|
try:
|
|
107
|
-
|
|
116
|
+
health = client.health()
|
|
117
|
+
from authsome import __version__
|
|
118
|
+
|
|
119
|
+
if health.get("version") != __version__:
|
|
120
|
+
return False
|
|
121
|
+
|
|
122
|
+
# If we are in local development, auto-restart the daemon if any code file changes.
|
|
123
|
+
if STATE_FILE.exists():
|
|
124
|
+
daemon_start_time = STATE_FILE.stat().st_mtime
|
|
125
|
+
src_dir = Path(__file__).parent.parent
|
|
126
|
+
for path in src_dir.glob("**/*"):
|
|
127
|
+
if path.is_file() and not any(part.startswith("__") or part == ".pytest_cache" for part in path.parts):
|
|
128
|
+
if path.suffix in (".py", ".json", ".html", ".css", ".js"):
|
|
129
|
+
if path.stat().st_mtime > daemon_start_time:
|
|
130
|
+
return False
|
|
131
|
+
|
|
132
|
+
if health.get("status") != "ok":
|
|
133
|
+
return False
|
|
134
|
+
client.ready()
|
|
135
|
+
return True
|
|
108
136
|
except Exception:
|
|
109
137
|
return False
|
|
110
138
|
|
|
@@ -899,14 +899,21 @@ def doctor(ctx_obj: ContextObj) -> None:
|
|
|
899
899
|
else:
|
|
900
900
|
all_ok = results.get("status") == "ready"
|
|
901
901
|
for key, val in results.get("checks", {}).items():
|
|
902
|
-
ok = val == "ok"
|
|
903
902
|
ctx_obj.echo(f"{key}: ", nl=False)
|
|
904
|
-
|
|
903
|
+
if val == "ok":
|
|
904
|
+
ctx_obj.echo("OK", color="green")
|
|
905
|
+
elif val == "warn":
|
|
906
|
+
ctx_obj.echo("WARN", color="yellow")
|
|
907
|
+
else:
|
|
908
|
+
ctx_obj.echo("FAIL", color="red")
|
|
905
909
|
issues = results.get("issues", [])
|
|
906
910
|
if issues:
|
|
907
|
-
ctx_obj.echo("\nIssues found:"
|
|
911
|
+
ctx_obj.echo("\nIssues/warnings found:")
|
|
908
912
|
for issue in issues:
|
|
909
|
-
|
|
913
|
+
if issue.startswith("warning:"):
|
|
914
|
+
ctx_obj.echo(f" - {issue}", color="yellow")
|
|
915
|
+
else:
|
|
916
|
+
ctx_obj.echo(f" - {issue}", color="red")
|
|
910
917
|
|
|
911
918
|
if not all_ok:
|
|
912
919
|
sys.exit(1)
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
"""Health and readiness routes."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import os
|
|
6
|
+
|
|
7
|
+
from fastapi import APIRouter, Depends
|
|
8
|
+
|
|
9
|
+
from authsome import __version__
|
|
10
|
+
from authsome.auth import AuthService
|
|
11
|
+
from authsome.server.routes._deps import get_auth_service
|
|
12
|
+
from authsome.server.schemas import HealthResponse, ReadyResponse
|
|
13
|
+
|
|
14
|
+
router = APIRouter()
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@router.get("/health", response_model=HealthResponse)
|
|
18
|
+
def health() -> HealthResponse:
|
|
19
|
+
return HealthResponse(status="ok", version=__version__, pid=os.getpid())
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _check_config(auth: AuthService, checks: dict[str, str], issues: list[str]) -> None:
|
|
23
|
+
try:
|
|
24
|
+
config = auth.app_store.get_config()
|
|
25
|
+
checks["config"] = "ok" if config else "ok"
|
|
26
|
+
except Exception as exc:
|
|
27
|
+
checks["config"] = "failed"
|
|
28
|
+
issues.append(f"config: {exc}")
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def _check_providers(auth: AuthService, checks: dict[str, str], issues: list[str]) -> None:
|
|
32
|
+
try:
|
|
33
|
+
auth.list_providers()
|
|
34
|
+
checks["providers"] = "ok"
|
|
35
|
+
except Exception as exc:
|
|
36
|
+
checks["providers"] = "failed"
|
|
37
|
+
issues.append(f"providers: {exc}")
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def _check_vault(auth: AuthService, checks: dict[str, str], issues: list[str]) -> None:
|
|
41
|
+
try:
|
|
42
|
+
auth.vault.put("__ready_test__", "ok", profile=auth.identity)
|
|
43
|
+
value = auth.vault.get("__ready_test__", profile=auth.identity)
|
|
44
|
+
auth.vault.delete("__ready_test__", profile=auth.identity)
|
|
45
|
+
checks["vault"] = "ok" if value == "ok" else "failed"
|
|
46
|
+
if value != "ok":
|
|
47
|
+
issues.append("vault: readiness roundtrip failed")
|
|
48
|
+
except Exception as exc:
|
|
49
|
+
checks["vault"] = "failed"
|
|
50
|
+
issues.append(f"vault: {exc}")
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def _check_permissions(auth: AuthService, checks: dict[str, str], issues: list[str]) -> None:
|
|
54
|
+
try:
|
|
55
|
+
if os.name != "nt":
|
|
56
|
+
master_key_path = auth.app_store.home / "master.key"
|
|
57
|
+
if master_key_path.exists():
|
|
58
|
+
mode = master_key_path.stat().st_mode
|
|
59
|
+
if (mode & 0o077) != 0:
|
|
60
|
+
checks["permissions"] = "failed"
|
|
61
|
+
issues.append(
|
|
62
|
+
f"permissions: master.key has insecure permissions {oct(mode & 0o777)} (expected 0600)"
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
db_path = auth.app_store.home / "profiles" / auth.identity / "store.db"
|
|
66
|
+
if db_path.exists():
|
|
67
|
+
mode = db_path.stat().st_mode
|
|
68
|
+
if (mode & 0o077) != 0:
|
|
69
|
+
checks["permissions"] = "failed"
|
|
70
|
+
issues.append(f"permissions: store.db has insecure permissions {oct(mode & 0o777)} (expected 0600)")
|
|
71
|
+
|
|
72
|
+
if "permissions" not in checks:
|
|
73
|
+
checks["permissions"] = "ok"
|
|
74
|
+
else:
|
|
75
|
+
checks["permissions"] = "ok"
|
|
76
|
+
except Exception as exc:
|
|
77
|
+
checks["permissions"] = "failed"
|
|
78
|
+
issues.append(f"permissions: {exc}")
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def _check_profiles(auth: AuthService, checks: dict[str, str], issues: list[str]) -> None:
|
|
82
|
+
try:
|
|
83
|
+
auth.app_store.list_profiles()
|
|
84
|
+
checks["profiles"] = "ok"
|
|
85
|
+
except Exception as exc:
|
|
86
|
+
checks["profiles"] = "failed"
|
|
87
|
+
issues.append(f"profiles: {exc}")
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def _check_connections(auth: AuthService, checks: dict[str, str], issues: list[str]) -> None:
|
|
91
|
+
try:
|
|
92
|
+
connections = auth.list_connections()
|
|
93
|
+
has_active = any(conn.get("status") == "connected" for p in connections for conn in p.get("connections", []))
|
|
94
|
+
checks["connections"] = "ok"
|
|
95
|
+
if not has_active:
|
|
96
|
+
issues.append("warning: No providers have active connections")
|
|
97
|
+
except Exception as exc:
|
|
98
|
+
checks["connections"] = "failed"
|
|
99
|
+
issues.append(f"connections: {exc}")
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def _check_key_age(auth: AuthService, checks: dict[str, str], issues: list[str]) -> None:
|
|
103
|
+
try:
|
|
104
|
+
master_key_path = auth.app_store.home / "master.key"
|
|
105
|
+
if master_key_path.exists():
|
|
106
|
+
from datetime import UTC, datetime
|
|
107
|
+
|
|
108
|
+
from authsome.utils import utc_now
|
|
109
|
+
|
|
110
|
+
mtime = datetime.fromtimestamp(master_key_path.stat().st_mtime, tz=UTC)
|
|
111
|
+
age_days = (utc_now() - mtime).days
|
|
112
|
+
if age_days > 90:
|
|
113
|
+
checks["key_age"] = "warn"
|
|
114
|
+
issues.append(f"warning: master.key has not been rotated in >90 days (age: {age_days} days)")
|
|
115
|
+
else:
|
|
116
|
+
checks["key_age"] = "ok"
|
|
117
|
+
else:
|
|
118
|
+
checks["key_age"] = "ok"
|
|
119
|
+
except Exception as exc:
|
|
120
|
+
checks["key_age"] = "failed"
|
|
121
|
+
issues.append(f"key_age: {exc}")
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def _check_integrity(auth: AuthService, checks: dict[str, str], issues: list[str]) -> None:
|
|
125
|
+
try:
|
|
126
|
+
import sqlite3
|
|
127
|
+
|
|
128
|
+
db_path = auth.app_store.home / "profiles" / auth.identity / "store.db"
|
|
129
|
+
if db_path.exists():
|
|
130
|
+
conn = sqlite3.connect(str(db_path))
|
|
131
|
+
try:
|
|
132
|
+
cursor = conn.execute("PRAGMA integrity_check;")
|
|
133
|
+
result = cursor.fetchone()
|
|
134
|
+
if result and result[0] == "ok":
|
|
135
|
+
checks["integrity"] = "ok"
|
|
136
|
+
else:
|
|
137
|
+
checks["integrity"] = "failed"
|
|
138
|
+
issues.append(f"integrity: PRAGMA integrity_check failed on store.db: {result}")
|
|
139
|
+
finally:
|
|
140
|
+
conn.close()
|
|
141
|
+
else:
|
|
142
|
+
checks["integrity"] = "ok"
|
|
143
|
+
except Exception as exc:
|
|
144
|
+
checks["integrity"] = "failed"
|
|
145
|
+
issues.append(f"integrity: {exc}")
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
def _check_version_compatibility(auth: AuthService, checks: dict[str, str], issues: list[str]) -> None:
|
|
149
|
+
try:
|
|
150
|
+
checks["version_compatibility"] = "ok"
|
|
151
|
+
version_path = auth.app_store.home / "version"
|
|
152
|
+
if version_path.exists():
|
|
153
|
+
v = version_path.read_text(encoding="utf-8").strip()
|
|
154
|
+
if v != "2":
|
|
155
|
+
checks["version_compatibility"] = "failed"
|
|
156
|
+
issues.append(f"version_compatibility: Home version is {v} but expected 2")
|
|
157
|
+
except Exception as exc:
|
|
158
|
+
checks["version_compatibility"] = "failed"
|
|
159
|
+
issues.append(f"version_compatibility: {exc}")
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
@router.get("/ready", response_model=ReadyResponse)
|
|
163
|
+
def ready(auth: AuthService = Depends(get_auth_service)) -> ReadyResponse:
|
|
164
|
+
checks: dict[str, str] = {}
|
|
165
|
+
issues: list[str] = []
|
|
166
|
+
|
|
167
|
+
_check_config(auth, checks, issues)
|
|
168
|
+
_check_providers(auth, checks, issues)
|
|
169
|
+
_check_vault(auth, checks, issues)
|
|
170
|
+
_check_permissions(auth, checks, issues)
|
|
171
|
+
_check_profiles(auth, checks, issues)
|
|
172
|
+
_check_connections(auth, checks, issues)
|
|
173
|
+
_check_key_age(auth, checks, issues)
|
|
174
|
+
_check_integrity(auth, checks, issues)
|
|
175
|
+
_check_version_compatibility(auth, checks, issues)
|
|
176
|
+
|
|
177
|
+
has_critical_failures = any(not issue.startswith("warning:") for issue in issues)
|
|
178
|
+
return ReadyResponse(status="ready" if not has_critical_failures else "not_ready", checks=checks, issues=issues)
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
@router.get("/whoami")
|
|
182
|
+
def whoami(auth: AuthService = Depends(get_auth_service)) -> dict[str, str]:
|
|
183
|
+
config = auth.app_store.get_config()
|
|
184
|
+
enc_mode = config.encryption.mode if config.encryption else "local_key"
|
|
185
|
+
if enc_mode == "local_key":
|
|
186
|
+
enc_desc = f"Local Key ({auth.app_store.home / 'master.key'})"
|
|
187
|
+
elif enc_mode == "keyring":
|
|
188
|
+
enc_desc = "OS Keyring"
|
|
189
|
+
else:
|
|
190
|
+
enc_desc = enc_mode
|
|
191
|
+
return {
|
|
192
|
+
"version": __version__,
|
|
193
|
+
"home": str(auth.app_store.home),
|
|
194
|
+
"active_identity": auth.identity,
|
|
195
|
+
"encryption_backend": enc_desc,
|
|
196
|
+
}
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
"""Health and readiness routes."""
|
|
2
|
-
|
|
3
|
-
from __future__ import annotations
|
|
4
|
-
|
|
5
|
-
import os
|
|
6
|
-
|
|
7
|
-
from fastapi import APIRouter, Depends
|
|
8
|
-
|
|
9
|
-
from authsome import __version__
|
|
10
|
-
from authsome.auth import AuthService
|
|
11
|
-
from authsome.server.routes._deps import get_auth_service
|
|
12
|
-
from authsome.server.schemas import HealthResponse, ReadyResponse
|
|
13
|
-
|
|
14
|
-
router = APIRouter()
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
@router.get("/health", response_model=HealthResponse)
|
|
18
|
-
def health() -> HealthResponse:
|
|
19
|
-
return HealthResponse(status="ok", version=__version__, pid=os.getpid())
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
@router.get("/ready", response_model=ReadyResponse)
|
|
23
|
-
def ready(auth: AuthService = Depends(get_auth_service)) -> ReadyResponse:
|
|
24
|
-
checks: dict[str, str] = {}
|
|
25
|
-
issues: list[str] = []
|
|
26
|
-
|
|
27
|
-
try:
|
|
28
|
-
config = auth.app_store.get_config()
|
|
29
|
-
checks["config"] = "ok" if config else "ok"
|
|
30
|
-
except Exception as exc:
|
|
31
|
-
checks["config"] = "failed"
|
|
32
|
-
issues.append(f"config: {exc}")
|
|
33
|
-
|
|
34
|
-
try:
|
|
35
|
-
auth.list_providers()
|
|
36
|
-
checks["providers"] = "ok"
|
|
37
|
-
except Exception as exc:
|
|
38
|
-
checks["providers"] = "failed"
|
|
39
|
-
issues.append(f"providers: {exc}")
|
|
40
|
-
|
|
41
|
-
try:
|
|
42
|
-
auth.vault.put("__ready_test__", "ok", profile=auth.identity)
|
|
43
|
-
value = auth.vault.get("__ready_test__", profile=auth.identity)
|
|
44
|
-
auth.vault.delete("__ready_test__", profile=auth.identity)
|
|
45
|
-
checks["vault"] = "ok" if value == "ok" else "failed"
|
|
46
|
-
if value != "ok":
|
|
47
|
-
issues.append("vault: readiness roundtrip failed")
|
|
48
|
-
except Exception as exc:
|
|
49
|
-
checks["vault"] = "failed"
|
|
50
|
-
issues.append(f"vault: {exc}")
|
|
51
|
-
|
|
52
|
-
return ReadyResponse(status="ready" if not issues else "not_ready", checks=checks, issues=issues)
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
@router.get("/whoami")
|
|
56
|
-
def whoami(auth: AuthService = Depends(get_auth_service)) -> dict[str, str]:
|
|
57
|
-
config = auth.app_store.get_config()
|
|
58
|
-
enc_mode = config.encryption.mode if config.encryption else "local_key"
|
|
59
|
-
if enc_mode == "local_key":
|
|
60
|
-
enc_desc = f"Local Key ({auth.app_store.home / 'master.key'})"
|
|
61
|
-
elif enc_mode == "keyring":
|
|
62
|
-
enc_desc = "OS Keyring"
|
|
63
|
-
else:
|
|
64
|
-
enc_desc = enc_mode
|
|
65
|
-
return {
|
|
66
|
-
"version": __version__,
|
|
67
|
-
"home": str(auth.app_store.home),
|
|
68
|
-
"active_identity": auth.identity,
|
|
69
|
-
"encryption_backend": enc_desc,
|
|
70
|
-
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/adr/0001-provider-client-record-server-scope.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/atlassian.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/instantly.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/klaviyo-oauth.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/livestorm.json
RENAMED
|
File without changes
|
{authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/mailchimp.json
RENAMED
|
File without changes
|
{authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/mention-me.json
RENAMED
|
File without changes
|
{authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/microsoft.json
RENAMED
|
File without changes
|
|
File without changes
|
{authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/notion_dcr.json
RENAMED
|
File without changes
|
|
File without changes
|
{authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/optimizely.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/rewardful.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/ui/templates/app_detail_disconnected.html
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|