mirror of https://gitlab.com/litecord/litecord.git
channel.reactions: add permission checks
- channel.reactions: add special case for when adding the first
reaction in a message
This commit is contained in:
parent
a0ad3a74b8
commit
ba253f6ce4
|
|
@ -6,7 +6,7 @@ from logbook import Logger
|
||||||
|
|
||||||
from litecord.utils import async_map
|
from litecord.utils import async_map
|
||||||
from litecord.blueprints.auth import token_check
|
from litecord.blueprints.auth import token_check
|
||||||
from litecord.blueprints.checks import channel_check
|
from litecord.blueprints.checks import channel_check, channel_perm_check
|
||||||
from litecord.blueprints.channel.messages import (
|
from litecord.blueprints.channel.messages import (
|
||||||
query_tuple_from_args, extract_limit
|
query_tuple_from_args, extract_limit
|
||||||
)
|
)
|
||||||
|
|
@ -68,12 +68,28 @@ async def add_reaction(channel_id: int, message_id: int, emoji: str):
|
||||||
"""Put a reaction."""
|
"""Put a reaction."""
|
||||||
user_id = await token_check()
|
user_id = await token_check()
|
||||||
|
|
||||||
# TODO: check READ_MESSAGE_HISTORY permission
|
|
||||||
# and ADD_REACTIONS. look on route docs.
|
|
||||||
ctype, guild_id = await channel_check(user_id, channel_id)
|
ctype, guild_id = await channel_check(user_id, channel_id)
|
||||||
|
await channel_perm_check(user_id, channel_id, 'read_history')
|
||||||
|
|
||||||
emoji_type, emoji_id, emoji_name = emoji_info_from_str(emoji)
|
emoji_type, emoji_id, emoji_name = emoji_info_from_str(emoji)
|
||||||
|
|
||||||
|
emoji_id = emoji_id if emoji_type == EmojiType.CUSTOM else None
|
||||||
|
emoji_text = emoji_id if emoji_type == EmojiType.UNICODE else None
|
||||||
|
|
||||||
|
# ADD_REACTIONS is only checked when this is the first
|
||||||
|
# reaction in a message.
|
||||||
|
reaction_count = await app.db.fetchval("""
|
||||||
|
SELECT COUNT(*)
|
||||||
|
FROM message_reactions
|
||||||
|
WHERE message_id = $1
|
||||||
|
AND emoji_type = $2
|
||||||
|
AND emoji_id = $3
|
||||||
|
AND emoji_text = $4
|
||||||
|
""", message_id, emoji_type, emoji_id, emoji_text)
|
||||||
|
|
||||||
|
if reaction_count == 0:
|
||||||
|
await channel_perm_check(user_id, channel_id, 'add_reactions')
|
||||||
|
|
||||||
await app.db.execute(
|
await app.db.execute(
|
||||||
"""
|
"""
|
||||||
INSERT INTO message_reactions (message_id, user_id,
|
INSERT INTO message_reactions (message_id, user_id,
|
||||||
|
|
@ -84,8 +100,7 @@ async def add_reaction(channel_id: int, message_id: int, emoji: str):
|
||||||
# if it is custom, we put the emoji_id on emoji_id
|
# if it is custom, we put the emoji_id on emoji_id
|
||||||
# column, if it isn't, we put it on emoji_text
|
# column, if it isn't, we put it on emoji_text
|
||||||
# column.
|
# column.
|
||||||
emoji_id if emoji_type == EmojiType.CUSTOM else None,
|
emoji_id, emoji_text
|
||||||
emoji_id if emoji_type == EmojiType.UNICODE else None
|
|
||||||
)
|
)
|
||||||
|
|
||||||
partial = partial_emoji(emoji_type, emoji_id, emoji_name)
|
partial = partial_emoji(emoji_type, emoji_id, emoji_name)
|
||||||
|
|
@ -162,12 +177,10 @@ async def remove_own_reaction(channel_id, message_id, emoji):
|
||||||
@bp.route(f'{BASEPATH}/<emoji>/<int:other_id>', methods=['DELETE'])
|
@bp.route(f'{BASEPATH}/<emoji>/<int:other_id>', methods=['DELETE'])
|
||||||
async def remove_user_reaction(channel_id, message_id, emoji, other_id):
|
async def remove_user_reaction(channel_id, message_id, emoji, other_id):
|
||||||
"""Remove a reaction made by another user."""
|
"""Remove a reaction made by another user."""
|
||||||
await token_check()
|
user_id = await token_check()
|
||||||
|
await channel_perm_check(user_id, channel_id, 'manage_messages')
|
||||||
|
|
||||||
# TODO: check MANAGE_MESSAGES permission (and use user_id
|
|
||||||
# from token_check to do it)
|
|
||||||
await remove_reaction(channel_id, message_id, other_id, emoji)
|
await remove_reaction(channel_id, message_id, other_id, emoji)
|
||||||
|
|
||||||
return '', 204
|
return '', 204
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -204,8 +217,8 @@ async def remove_all_reactions(channel_id, message_id):
|
||||||
"""Remove all reactions in a message."""
|
"""Remove all reactions in a message."""
|
||||||
user_id = await token_check()
|
user_id = await token_check()
|
||||||
|
|
||||||
# TODO: check MANAGE_MESSAGES permission
|
|
||||||
ctype, guild_id = await channel_check(user_id, channel_id)
|
ctype, guild_id = await channel_check(user_id, channel_id)
|
||||||
|
await channel_perm_check(user_id, channel_id, 'manage_messages')
|
||||||
|
|
||||||
await app.db.execute("""
|
await app.db.execute("""
|
||||||
DELETE FROM message_reactions
|
DELETE FROM message_reactions
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue