100 lines
3.5 KiB
Python
100 lines
3.5 KiB
Python
import os
|
|
import unittest
|
|
|
|
os.environ.setdefault("DATABASE_URL", "sqlite://")
|
|
os.environ.setdefault("APP_ENCRYPTION_KEY", "MDEyMzQ1Njc4OWFiY2RlZjAxMjM0NTY3ODlhYmNkZWY=")
|
|
|
|
from sqlalchemy import create_engine
|
|
from sqlalchemy.orm import sessionmaker
|
|
from fastapi import HTTPException
|
|
|
|
from web.backend.database import Base
|
|
from web.backend.models import Account, User
|
|
from web.backend.routers.accounts import list_accounts, set_account_tag
|
|
from web.backend.schemas import AccountTag
|
|
|
|
|
|
class AccountSensitiveFieldsTests(unittest.TestCase):
|
|
def setUp(self):
|
|
self.engine = create_engine("sqlite://")
|
|
Base.metadata.create_all(self.engine)
|
|
self.session = sessionmaker(bind=self.engine)()
|
|
self.admin = User(username="admin", password_hash="hash", role="super_admin")
|
|
self.session.add(self.admin)
|
|
self.session.add(Account(
|
|
username="account",
|
|
password="account-password",
|
|
email="account@example.com",
|
|
email_password="email-password",
|
|
))
|
|
self.session.commit()
|
|
|
|
def tearDown(self):
|
|
self.session.close()
|
|
Base.metadata.drop_all(self.engine)
|
|
self.engine.dispose()
|
|
|
|
def test_sensitive_fields_are_hidden_by_default_even_for_admin(self):
|
|
result = list_accounts(
|
|
assigned_only=False,
|
|
tag=None,
|
|
has_cookie=False,
|
|
search="",
|
|
page=1,
|
|
page_size=20,
|
|
include_sensitive=False,
|
|
db=self.session,
|
|
current=self.admin,
|
|
)
|
|
|
|
item = result["items"][0]
|
|
self.assertIsNone(item.password)
|
|
self.assertIsNone(item.email)
|
|
self.assertIsNone(item.email_password)
|
|
|
|
def test_admin_can_explicitly_request_sensitive_fields(self):
|
|
result = list_accounts(
|
|
assigned_only=False,
|
|
tag=None,
|
|
has_cookie=False,
|
|
search="",
|
|
page=1,
|
|
page_size=20,
|
|
include_sensitive=True,
|
|
db=self.session,
|
|
current=self.admin,
|
|
)
|
|
|
|
item = result["items"][0]
|
|
self.assertEqual(item.password, "account-password")
|
|
self.assertEqual(item.email, "account@example.com")
|
|
self.assertEqual(item.email_password, "email-password")
|
|
|
|
def test_support_can_only_change_tags_on_assigned_accounts(self):
|
|
support = User(username="support", password_hash="hash", role="support")
|
|
other_support = User(username="other-support", password_hash="hash", role="support")
|
|
self.session.add_all([support, other_support])
|
|
self.session.commit()
|
|
assigned = Account(
|
|
username="assigned", password="password", email="assigned@example.com",
|
|
email_password="mail-password", assigned_to=support.id,
|
|
)
|
|
other = Account(
|
|
username="other", password="password", email="other@example.com",
|
|
email_password="mail-password", assigned_to=other_support.id,
|
|
)
|
|
self.session.add_all([assigned, other])
|
|
self.session.commit()
|
|
|
|
set_account_tag(assigned.id, AccountTag(tag="客服组"), db=self.session, current=support)
|
|
self.session.refresh(assigned)
|
|
self.assertEqual(assigned.tag, "客服组")
|
|
|
|
with self.assertRaises(HTTPException) as context:
|
|
set_account_tag(other.id, AccountTag(tag="越权"), db=self.session, current=support)
|
|
self.assertEqual(context.exception.status_code, 404)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|