mirror of
https://github.com/nonebot/nonebot2.git
synced 2024-11-27 18:45:05 +08:00
🐛 fix nested user permission update (#1208)
This commit is contained in:
parent
f150a9ee89
commit
cd30be21ba
@ -44,7 +44,7 @@ from nonebot.exception import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
from .rule import Rule
|
from .rule import Rule
|
||||||
from .permission import USER, Permission
|
from .permission import USER, User, Permission
|
||||||
from .adapter import Bot, Event, Message, MessageSegment, MessageTemplate
|
from .adapter import Bot, Event, Message, MessageSegment, MessageTemplate
|
||||||
from .params import (
|
from .params import (
|
||||||
Depends,
|
Depends,
|
||||||
@ -635,15 +635,21 @@ class Matcher(metaclass=MatcherMeta):
|
|||||||
|
|
||||||
async def update_type(self, bot: Bot, event: Event) -> str:
|
async def update_type(self, bot: Bot, event: Event) -> str:
|
||||||
updater = self.__class__._default_type_updater
|
updater = self.__class__._default_type_updater
|
||||||
if not updater:
|
return (
|
||||||
return "message"
|
await updater(bot=bot, event=event, state=self.state, matcher=self)
|
||||||
return await updater(bot=bot, event=event, state=self.state, matcher=self)
|
if updater
|
||||||
|
else "message"
|
||||||
|
)
|
||||||
|
|
||||||
async def update_permission(self, bot: Bot, event: Event) -> Permission:
|
async def update_permission(self, bot: Bot, event: Event) -> Permission:
|
||||||
updater = self.__class__._default_permission_updater
|
if updater := self.__class__._default_permission_updater:
|
||||||
if not updater:
|
return await updater(bot=bot, event=event, state=self.state, matcher=self)
|
||||||
return USER(event.get_session_id(), perm=self.permission)
|
permission = self.permission
|
||||||
return await updater(bot=bot, event=event, state=self.state, matcher=self)
|
if len(permission.checkers) == 1 and isinstance(
|
||||||
|
user_perm := tuple(permission.checkers)[0].call, User
|
||||||
|
):
|
||||||
|
permission = user_perm.perm
|
||||||
|
return USER(event.get_session_id(), perm=permission)
|
||||||
|
|
||||||
async def resolve_reject(self):
|
async def resolve_reject(self):
|
||||||
handler = current_handler.get()
|
handler = current_handler.get()
|
||||||
|
@ -1,10 +1,14 @@
|
|||||||
from nonebot.matcher import Matcher
|
from nonebot.matcher import Matcher
|
||||||
from nonebot.permission import Permission
|
from nonebot.permission import USER, Permission
|
||||||
|
|
||||||
default_permission = Permission()
|
default_permission = Permission()
|
||||||
|
|
||||||
test_permission_updater = Matcher.new(permission=default_permission)
|
test_permission_updater = Matcher.new(permission=default_permission)
|
||||||
|
|
||||||
|
test_user_permission_updater = Matcher.new(
|
||||||
|
permission=USER("test", perm=default_permission)
|
||||||
|
)
|
||||||
|
|
||||||
test_custom_updater = Matcher.new(permission=default_permission)
|
test_custom_updater = Matcher.new(permission=default_permission)
|
||||||
|
|
||||||
|
|
||||||
|
@ -104,6 +104,7 @@ async def test_permission_updater(app: App, load_plugin):
|
|||||||
default_permission,
|
default_permission,
|
||||||
test_custom_updater,
|
test_custom_updater,
|
||||||
test_permission_updater,
|
test_permission_updater,
|
||||||
|
test_user_permission_updater,
|
||||||
)
|
)
|
||||||
|
|
||||||
event = make_fake_event(_session_id="test")()
|
event = make_fake_event(_session_id="test")()
|
||||||
@ -119,6 +120,19 @@ async def test_permission_updater(app: App, load_plugin):
|
|||||||
assert checker.users == ("test",)
|
assert checker.users == ("test",)
|
||||||
assert checker.perm is default_permission
|
assert checker.perm is default_permission
|
||||||
|
|
||||||
|
user_permission = list(test_user_permission_updater.permission.checkers)[0].call
|
||||||
|
assert isinstance(user_permission, User)
|
||||||
|
assert user_permission.perm is default_permission
|
||||||
|
async with app.test_api() as ctx:
|
||||||
|
bot = ctx.create_bot()
|
||||||
|
matcher = test_user_permission_updater()
|
||||||
|
new_perm = await matcher.update_permission(bot, event)
|
||||||
|
assert len(new_perm.checkers) == 1
|
||||||
|
checker = list(new_perm.checkers)[0].call
|
||||||
|
assert isinstance(checker, User)
|
||||||
|
assert checker.users == ("test",)
|
||||||
|
assert checker.perm is default_permission
|
||||||
|
|
||||||
assert test_custom_updater.permission is default_permission
|
assert test_custom_updater.permission is default_permission
|
||||||
async with app.test_api() as ctx:
|
async with app.test_api() as ctx:
|
||||||
bot = ctx.create_bot()
|
bot = ctx.create_bot()
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
from typing import Tuple
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
from nonebug import App
|
from nonebug import App
|
||||||
|
|
||||||
@ -145,7 +147,7 @@ async def test_metaevent(
|
|||||||
("notice", "test", False),
|
("notice", "test", False),
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
async def test_startswith(
|
async def test_superuser(
|
||||||
app: App,
|
app: App,
|
||||||
type: str,
|
type: str,
|
||||||
user_id: str,
|
user_id: str,
|
||||||
@ -163,3 +165,28 @@ async def test_startswith(
|
|||||||
async with app.test_api() as ctx:
|
async with app.test_api() as ctx:
|
||||||
bot = ctx.create_bot()
|
bot = ctx.create_bot()
|
||||||
assert await dependent(bot=bot, event=event) == expected
|
assert await dependent(bot=bot, event=event) == expected
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.asyncio
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
"session_ids,session_id,expected",
|
||||||
|
[
|
||||||
|
(("user", "foo"), "user", True),
|
||||||
|
(("user", "foo"), "bar", False),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
async def test_user(
|
||||||
|
app: App, session_ids: Tuple[str, ...], session_id: str, expected: bool
|
||||||
|
):
|
||||||
|
from nonebot.permission import USER, User
|
||||||
|
|
||||||
|
dependent = list(USER(*session_ids).checkers)[0]
|
||||||
|
checker = dependent.call
|
||||||
|
|
||||||
|
assert isinstance(checker, User)
|
||||||
|
|
||||||
|
event = make_fake_event(_session_id=session_id)()
|
||||||
|
|
||||||
|
async with app.test_api() as ctx:
|
||||||
|
bot = ctx.create_bot()
|
||||||
|
assert await dependent(bot=bot, event=event) == expected
|
||||||
|
Loading…
Reference in New Issue
Block a user