Skip to content

Commit 8ee8a33

Browse files
joebonclaude
andcommitted
fix(authz): restore get_accessible_org_ids and fix Account/PayoutAccount guards
get_accessible_org_ids is still needed by many services for list-filtering. Also update AccountPolicyGuard and PayoutAccountPolicyGuard to reference policy functions directly instead of removed wrapper functions. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 45a2cf9 commit 8ee8a33

4 files changed

Lines changed: 30 additions & 7 deletions

File tree

server/polar/authz/dependencies.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
from .policies import finance, members
2020
from .policies import organization as org_policy
21-
from .service import get_accessible_organization
21+
from .service import get_accessible_org_ids, get_accessible_organization
2222
from .types import PolicyFn
2323

2424

@@ -295,14 +295,14 @@ async def dependency(
295295

296296

297297
AuthorizeAccountRead = Annotated[
298-
AuthorizedAccount, Depends(AccountPolicyGuard(_finance_can_read()))
298+
AuthorizedAccount, Depends(AccountPolicyGuard(finance.can_read))
299299
]
300300
AuthorizeAccountWrite = Annotated[
301-
AuthorizedAccount, Depends(AccountPolicyGuard(_finance_can_write()))
301+
AuthorizedAccount, Depends(AccountPolicyGuard(finance.can_write))
302302
]
303303
AuthorizePayoutAccountRead = Annotated[
304-
AuthorizedPayoutAccount, Depends(PayoutAccountPolicyGuard(_finance_can_read()))
304+
AuthorizedPayoutAccount, Depends(PayoutAccountPolicyGuard(finance.can_read))
305305
]
306306
AuthorizePayoutAccountWrite = Annotated[
307-
AuthorizedPayoutAccount, Depends(PayoutAccountPolicyGuard(_finance_can_write()))
307+
AuthorizedPayoutAccount, Depends(PayoutAccountPolicyGuard(finance.can_write))
308308
]

server/polar/authz/repository.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,15 @@ class AuthzRepository:
1313
def __init__(self, session: AsyncReadSession) -> None:
1414
self.session = session
1515

16+
async def get_user_org_ids(self, user_id: UUID) -> set[UUID]:
17+
"""Get all organization IDs a user is a member of."""
18+
stmt = select(UserOrganization.organization_id).where(
19+
UserOrganization.user_id == user_id,
20+
UserOrganization.is_deleted.is_(False),
21+
)
22+
result = await self.session.scalars(stmt)
23+
return set(result.all())
24+
1625
async def get_accessible_organization(
1726
self,
1827
auth_subject: AuthSubject[User | Organization],

server/polar/authz/service.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,25 @@
11
from uuid import UUID
22

3-
from polar.auth.models import AuthSubject, Organization, User
3+
from polar.auth.models import AuthSubject, Organization, User, is_organization, is_user
44
from polar.models.organization import Organization as OrganizationModel
55
from polar.postgres import AsyncReadSession
66

77
from .repository import AuthzRepository
88

99

10+
async def get_accessible_org_ids(
11+
session: AsyncReadSession,
12+
auth_subject: AuthSubject[User | Organization],
13+
) -> set[UUID]:
14+
"""Resolve which organization IDs this subject can access."""
15+
if is_organization(auth_subject):
16+
return {auth_subject.subject.id}
17+
if is_user(auth_subject):
18+
repository = AuthzRepository(session)
19+
return await repository.get_user_org_ids(auth_subject.subject.id)
20+
return set()
21+
22+
1023
async def get_accessible_organization(
1124
session: AsyncReadSession,
1225
auth_subject: AuthSubject[User | Organization],

server/polar/organization/service.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111

1212
from polar.account.service import account as account_service
1313
from polar.auth.models import AuthSubject
14-
from polar.config import Environment, settings
14+
from polar.authz.service import get_accessible_org_ids
15+
from polar.config import settings
1516
from polar.customer.repository import CustomerRepository
1617
from polar.enums import InvoiceNumbering, SubscriptionProrationBehavior
1718
from polar.exceptions import PolarError, PolarRequestValidationError

0 commit comments

Comments
 (0)