Skip to content
Snippets Groups Projects
Commit b6e6692c authored by Sven Mäder's avatar Sven Mäder :speech_balloon:
Browse files

Add number sanitation

parent 44028870
No related branches found
No related tags found
No related merge requests found
...@@ -5,7 +5,7 @@ maubot: 0.1.0 ...@@ -5,7 +5,7 @@ maubot: 0.1.0
id: isg.rda.rtlinks id: isg.rda.rtlinks
# A PEP 440 compliant version string. # A PEP 440 compliant version string.
version: 0.2.6 version: 0.2.7
# The SPDX license identifier for the plugin. https://spdx.org/licenses/ # The SPDX license identifier for the plugin. https://spdx.org/licenses/
# Optional, assumes all rights reserved if omitted. # Optional, assumes all rights reserved if omitted.
......
...@@ -18,7 +18,8 @@ class Config(BaseProxyConfig): ...@@ -18,7 +18,8 @@ class Config(BaseProxyConfig):
class RTLinksPlugin(Plugin): class RTLinksPlugin(Plugin):
prefix: str prefix: str
whitelist: Set[UserID] whitelist: Set[UserID]
regex = re.compile(r'([a-zA-z]+): (.+)') regex_properties = re.compile(r'([a-zA-z]+): (.+)')
regex_number = re.compile(r'[0-9]{6}')
async def start(self) -> None: async def start(self) -> None:
#await super().start() #await super().start()
...@@ -38,6 +39,11 @@ class RTLinksPlugin(Plugin): ...@@ -38,6 +39,11 @@ class RTLinksPlugin(Plugin):
return True return True
return False return False
def is_valid_number(self, number: str) -> bool:
if self.regex_number.match(number):
return True
return False
async def show_ticket(self, number: str) -> dict: async def show_ticket(self, number: str) -> dict:
headers = {"User-agent": "rtlinksmaubot"} headers = {"User-agent": "rtlinksmaubot"}
api = '{}/REST/1.0/'.format(self.config['url']) api = '{}/REST/1.0/'.format(self.config['url'])
...@@ -46,7 +52,7 @@ class RTLinksPlugin(Plugin): ...@@ -46,7 +52,7 @@ class RTLinksPlugin(Plugin):
api_show = '{}ticket/{}/show'.format(api, number) api_show = '{}ticket/{}/show'.format(api, number)
async with self.http.get(api_show, headers=headers) as response: async with self.http.get(api_show, headers=headers) as response:
content = await response.text() content = await response.text()
ticket = dict(self.regex.findall(content)) ticket = dict(self.regex_properties.findall(content))
return ticket return ticket
async def get_markdown_link(self, number: str) -> str: async def get_markdown_link(self, number: str) -> str:
...@@ -97,7 +103,7 @@ class RTLinksPlugin(Plugin): ...@@ -97,7 +103,7 @@ class RTLinksPlugin(Plugin):
@rt.subcommand("show", help="Show all ticket properties.") @rt.subcommand("show", help="Show all ticket properties.")
@command.argument("number", "ticket number", pass_raw=True) @command.argument("number", "ticket number", pass_raw=True)
async def show(self, evt: MessageEvent, number: str) -> None: async def show(self, evt: MessageEvent, number: str) -> None:
if not await self.can_manage(evt): if not await self.can_manage(evt) or not self.is_valid_number(number):
return return
await evt.mark_read() await evt.mark_read()
await self.show_ticket(number) await self.show_ticket(number)
...@@ -113,9 +119,46 @@ class RTLinksPlugin(Plugin): ...@@ -113,9 +119,46 @@ class RTLinksPlugin(Plugin):
@rt.subcommand("resolve", help="Mark the ticket as resolved.") @rt.subcommand("resolve", help="Mark the ticket as resolved.")
@command.argument("number", "ticket number", pass_raw=True) @command.argument("number", "ticket number", pass_raw=True)
async def resolve(self, evt: MessageEvent, number: str) -> None: async def resolve(self, evt: MessageEvent, number: str) -> None:
if not await self.can_manage(evt): if not await self.can_manage(evt) or not self.is_valid_number(number):
return return
await evt.mark_read() await evt.mark_read()
await self.edit_ticket(number, 'resolved') await self.edit_ticket(number, 'resolved')
markdown_link = await self.get_markdown_link(number) markdown_link = await self.get_markdown_link(number)
await evt.respond('{} resolved'.format(markdown_link)) await evt.respond('{} resolved'.format(markdown_link))
@rt.subcommand("open", help="Mark the ticket as open.")
@command.argument("number", "ticket number", pass_raw=True)
async def open(self, evt: MessageEvent, number: str) -> None:
if not await self.can_manage(evt) or not self.is_valid_number(number):
return
await evt.mark_read()
await self.edit_ticket(number, 'open')
markdown_link = await self.get_markdown_link(number)
await evt.respond('{} opened'.format(markdown_link))
@rt.subcommand("stall", help="Mark the ticket as stalled.")
@command.argument("number", "ticket number", pass_raw=True)
async def stall(self, evt: MessageEvent, number: str) -> None:
if not await self.can_manage(evt) or not self.is_valid_number(number):
return
await evt.mark_read()
await self.edit_ticket(number, 'stalled')
markdown_link = await self.get_markdown_link(number)
await evt.respond('{} stalled'.format(markdown_link))
@rt.subcommand("delete", help="Mark the ticket as deleted.")
@command.argument("number", "ticket number", pass_raw=True)
async def delete(self, evt: MessageEvent, number: str) -> None:
if not await self.can_manage(evt) or not self.is_valid_number(number):
return
await evt.mark_read()
await self.edit_ticket(number, 'deleted')
markdown_link = await self.get_markdown_link(number)
await evt.respond('{} deleted'.format(markdown_link))
@rt.subcommand("autoresolve", help="Enable automatic ticket resolve mode.")
async def autoresolve(self, evt: MessageEvent) -> None:
if not await self.can_manage(evt):
return
await evt.mark_read()
await evt.reply('😂 lol, this is your job!')
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment