Commit fc1eca7a authored by mathieui's avatar mathieui

fix: remove all remaining safejids (fix #3457)

parent e6510792
Pipeline #3876 passed with stages
in 6 minutes and 56 seconds
......@@ -184,7 +184,6 @@ and :term:`log` configuration parameters are tab-specific.
from gettext import gettext as _
import logging
log = logging.getLogger(__name__)
import os
import html
import curses
......@@ -194,10 +193,11 @@ import potr
from potr.context import NotEncryptedError, UnencryptedMessage, ErrorReceived, NotOTRMessage,\
STATE_ENCRYPTED, STATE_PLAINTEXT, STATE_FINISHED, Context, Account, crypt
from slixmpp import JID, InvalidJID
from poezio import common
from poezio import xdg
from poezio import xhtml
from poezio.common import safeJID
from poezio.config import config
from poezio.plugin import BasePlugin
from poezio.roster import roster
......@@ -207,6 +207,8 @@ from poezio.decorators import command_args_parser
from poezio.core.structs import Completion
from poezio.ui.types import InfoMessage, Message
log = logging.getLogger(__name__)
POLICY_FLAGS = {
'ALLOW_V1': False,
'ALLOW_V2': True,
......@@ -345,7 +347,7 @@ class PoezioContext(Context):
self.xmpp = xmpp
self.core = core
self.flags = {}
self.trustName = safeJID(peer).bare
self.trustName = JID(peer).bare
self.in_smp = False
self.smp_own = False
self.log = 0
......@@ -375,7 +377,7 @@ class PoezioContext(Context):
'info': '\x19%s}' % dump_tuple(get_theme().COLOR_INFORMATION_TEXT),
'normal': '\x19%s}' % dump_tuple(get_theme().COLOR_NORMAL_TEXT),
'jid': self.peer,
'bare_jid': safeJID(self.peer).bare
'bare_jid': JID(self.peer).bare
}
tab = self.core.tabs.by_name(self.peer)
......@@ -461,8 +463,9 @@ class PoezioAccount(Account):
if acc != self.name or proto != 'xmpp':
continue
jid = safeJID(ctx).bare
if not jid:
try:
jid = JID(ctx).bare
except InvalidJID:
continue
self.setTrust(jid, fpr, trust)
except:
......@@ -595,7 +598,7 @@ class Plugin(BasePlugin):
"""
Retrieve or create an OTR context
"""
jid = safeJID(jid)
jid = JID(jid)
if jid.full not in self.contexts:
flags = POLICY_FLAGS.copy()
require = self.config.get_by_tabname(
......@@ -806,9 +809,11 @@ class Plugin(BasePlugin):
Find an OTR session from a bare JID.
"""
for ctx in self.contexts:
if safeJID(
ctx
).bare == bare_jid and self.contexts[ctx].state == STATE_ENCRYPTED:
try:
jid = JID(ctx).bare
except InvalidJID:
continue
if jid == bare_jid and self.contexts[ctx].state == STATE_ENCRYPTED:
return self.contexts[ctx]
return None
......@@ -880,7 +885,11 @@ class Plugin(BasePlugin):
Returns the text to display in the infobar (the OTR status)
"""
context = self.get_context(jid)
if safeJID(jid).bare == jid and context.state != STATE_ENCRYPTED:
try:
bare_jid = JID(jid).bare
except InvalidJID:
bare_jid = ''
if bare_jid == jid and context.state != STATE_ENCRYPTED:
ctx = self.find_encrypted_context_with_matching(jid)
if ctx:
context = ctx
......
......@@ -6,9 +6,10 @@ import qrcode
from typing import Dict, Callable
from slixmpp import JID, InvalidJID
from poezio import windows
from poezio.tabs import Tab
from poezio.common import safeJID
from poezio.core.structs import Command
from poezio.decorators import command_args_parser
from poezio.plugin import BasePlugin
......@@ -170,7 +171,11 @@ class Plugin(BasePlugin):
def command_invite(self, args):
server = self.core.xmpp.boundjid.domain
if len(args) > 0:
server = safeJID(args[0])
try:
server = JID(args[0])
except InvalidJID:
self.api.information(f'Invalid JID: {args[0]}', 'Error')
return
session = {
'next' : self.on_next,
'error': self.core.handler.adhoc_error
......
......@@ -16,10 +16,10 @@ Command
"""
from slixmpp import JID, InvalidJID
from poezio.plugin import BasePlugin
from poezio.tabs import MucTab
from poezio.decorators import command_args_parser
from poezio.common import safeJID
from poezio.core.structs import Completion
......@@ -42,13 +42,15 @@ class Plugin(BasePlugin):
jid = current_tab.jid.bare
message = None
elif len(args) == 1:
jid = safeJID(args[0]).domain
if not jid:
try:
jid = JID(args[0]).domain
except InvalidJID:
return self.core.command_help('server_part')
message = None
else:
jid = safeJID(args[0]).domain
if not jid:
try:
jid = JID(args[0]).domain
except InvalidJID:
return self.core.command_help('server_part')
message = args[1]
......
......@@ -12,7 +12,7 @@ Command
Retrieve the uptime of the server of ``jid``.
"""
from poezio.plugin import BasePlugin
from poezio.common import parse_secs_to_str, safeJID
from poezio.common import parse_secs_to_str
from slixmpp.xmlstream import ET
from slixmpp import JID, InvalidJID
from slixmpp.exceptions import IqError, IqTimeout
......
......@@ -459,24 +459,6 @@ def format_gaming_string(infos: Dict[str, str]) -> str:
return name
def safeJID(*args: Any, **kwargs: Any) -> JID:
"""
Construct a :py:class:`slixmpp.JID` object from a string.
Used to avoid tracebacks during is stringprep fails
(fall back to a JID with an empty string).
"""
try:
return JID(*args, **kwargs)
except InvalidJID:
log.debug(
'safeJID caught an invalidJID exception: %r, %r',
args, kwargs,
exc_info=True,
)
return JID('')
def unique_prefix_of(a: str, b: str) -> str:
"""
Return the unique prefix of `a` with `b`.
......
......@@ -2,25 +2,23 @@
Completions for the global commands
"""
import logging
from typing import List, Optional
log = logging.getLogger(__name__)
import os
from pathlib import Path
from functools import reduce
from pathlib import Path
from typing import List, Optional
from slixmpp import JID
from slixmpp import JID, InvalidJID
from poezio import common
from poezio import tabs
from poezio import xdg
from poezio.common import safeJID
from poezio.config import config
from poezio.roster import roster
from poezio.core.structs import POSSIBLE_SHOW, Completion
log = logging.getLogger(__name__)
class CompletionCore:
def __init__(self, core):
......@@ -124,9 +122,12 @@ class CompletionCore:
return False
if len(args) == 1:
args.append('')
jid = safeJID(args[1])
if args[1].endswith('@') and not jid.user and not jid.server:
jid.user = args[1][:-1]
try:
jid = JID(args[1])
except InvalidJID:
jid = JID('')
if args[1].endswith('@'):
jid.user = args[1][:-1]
relevant_rooms = []
relevant_rooms.extend(sorted(self.core.pending_invites.keys()))
......@@ -149,7 +150,8 @@ class CompletionCore:
for tab in self.core.get_tabs(tabs.MucTab):
if tab.joined:
serv_list.append(
'%s@%s' % (jid.user, safeJID(tab.name).host))
'%s@%s' % (jid.user, tab.general_jid.server)
)
serv_list.extend(relevant_rooms)
return Completion(
the_input.new_completion, serv_list, 1, quotify=True)
......@@ -213,9 +215,8 @@ class CompletionCore:
if len(args) == 1:
args.append('')
jid = safeJID(args[1])
if jid.server and (jid.resource or jid.full.endswith('/')):
try:
jid = JID(args[1])
tab = self.core.tabs.by_name_and_class(jid.bare, tabs.MucTab)
nicks = [tab.own_nick] if tab else []
default = os.environ.get('USER') if os.environ.get(
......@@ -230,6 +231,8 @@ class CompletionCore:
jids_list = ['%s/%s' % (jid.bare, nick) for nick in nicks]
return Completion(
the_input.new_completion, jids_list, 1, quotify=True)
except InvalidJID:
pass
muc_list = [tab.name for tab in self.core.get_tabs(tabs.MucTab)]
muc_list.sort()
muc_list.append('*')
......@@ -429,9 +432,8 @@ class CompletionCore:
return False
if len(args) == 1:
args.append('')
jid = safeJID(args[1])
if jid.server and (jid.resource or jid.full.endswith('/')):
try:
jid = JID(args[1])
tab = self.core.tabs.by_name_and_class(jid.bare, tabs.MucTab)
nicks = [tab.own_nick] if tab else []
default = os.environ.get('USER') if os.environ.get(
......@@ -446,6 +448,8 @@ class CompletionCore:
jids_list = ['%s/%s' % (jid.bare, nick) for nick in nicks]
return Completion(
the_input.new_completion, jids_list, 1, quotify=True)
except InvalidJID:
pass
muc_list = [tab.name for tab in self.core.get_tabs(tabs.MucTab)]
muc_list.append('*')
return Completion(the_input.new_completion, muc_list, 1, quotify=True)
......
......@@ -3,7 +3,6 @@ XMPP-related handlers for the Core class
"""
import logging
log = logging.getLogger(__name__)
from typing import Optional
......@@ -30,7 +29,7 @@ from poezio import fixes
from poezio import tabs
from poezio import xhtml
from poezio import multiuserchat as muc
from poezio.common import safeJID, get_error_message
from poezio.common import get_error_message
from poezio.config import config, get_image_cache
from poezio.core.structs import Status
from poezio.contact import Resource
......@@ -58,6 +57,8 @@ try:
except ImportError:
PYGMENTS = False
log = logging.getLogger(__name__)
CERT_WARNING_TEXT = """
WARNING: CERTIFICATE FOR %s CHANGED
......@@ -249,7 +250,10 @@ class HandlerCore:
"""
Direct invitation received
"""
room = safeJID(message['groupchat_invite']['jid'])
try:
room = JID(message['groupchat_invite']['jid'])
except InvalidJID:
return
if room.bare in self.core.pending_invites:
return
......
......@@ -19,7 +19,6 @@ from typing import (
TYPE_CHECKING,
)
from poezio.common import safeJID
from slixmpp import (
JID,
ClientXMPP,
......@@ -45,7 +44,7 @@ def change_show(
"""
Change our 'Show'
"""
jid = safeJID(jid)
jid = JID(jid)
pres = xmpp.make_presence(pto='%s/%s' % (jid, own_nick))
if show: # if show is None, don't put a <show /> tag. It means "available"
pres['type'] = show
......@@ -66,7 +65,7 @@ def change_nick(
"""
xmpp = core.xmpp
presence = xmpp.make_presence(
pshow=show, pstatus=status, pto=safeJID('%s/%s' % (jid, nick)))
pshow=show, pstatus=status, pto=JID('%s/%s' % (jid, nick)))
core.events.trigger('changing_nick', presence)
presence.send()
......@@ -122,7 +121,7 @@ def leave_groupchat(
"""
Leave the groupchat
"""
jid = safeJID(jid)
jid = JID(jid)
try:
xmpp.plugin['xep_0045'].leave_muc(jid, own_nick, msg)
except KeyError:
......
......@@ -8,7 +8,6 @@
Defines the Roster and RosterGroup classes
"""
import logging
log = logging.getLogger(__name__)
from typing import List
......@@ -18,10 +17,10 @@ from poezio.roster_sorting import SORTING_METHODS, GROUP_SORTING_METHODS
from os import path as p
from datetime import datetime
from poezio.common import safeJID
from slixmpp.exceptions import IqError, IqTimeout
from slixmpp import JID
from slixmpp import JID, InvalidJID
log = logging.getLogger(__name__)
class Roster:
"""
......@@ -77,7 +76,10 @@ class Roster:
def __getitem__(self, key):
"""Get a Contact from his bare JID"""
key = safeJID(key).bare
try:
key = JID(key).bare
except InvalidJID:
return None
if key in self.contacts and self.contacts[key] is not None:
return self.contacts[key]
if key in self.jids():
......@@ -91,7 +93,10 @@ class Roster:
def remove(self, jid):
"""Send a removal iq to the server"""
jid = safeJID(jid).bare
try:
jid = JID(jid).bare
except InvalidJID:
return
if self.__node[jid]:
try:
self.__node[jid].send_presence(ptype='unavailable')
......@@ -101,7 +106,10 @@ class Roster:
def __delitem__(self, jid):
"""Remove a contact from the roster view"""
jid = safeJID(jid).bare
try:
jid = JID(jid).bare
except InvalidJID:
return
contact = self[jid]
if not contact:
return
......@@ -119,7 +127,10 @@ class Roster:
def __contains__(self, key):
"""True if the bare jid is in the roster, false otherwise"""
return safeJID(key).bare in self.jids()
try:
return JID(key).bare in self.jids()
except InvalidJID:
return False
@property
def jid(self):
......
......@@ -12,9 +12,8 @@ from poezio import windows
from poezio.bookmarks import Bookmark, BookmarkList
from poezio.core.structs import Command
from poezio.tabs import Tab
from poezio.common import safeJID
from slixmpp import JID
from slixmpp import JID, InvalidJID
log = logging.getLogger(__name__)
......@@ -82,10 +81,11 @@ class BookmarksTab(Tab):
'Duplicate bookmarks in list (saving aborted)', 'Error')
return
for bm in self.new_bookmarks:
if safeJID(bm.jid):
try:
JID(bm.jid)
if not self.bookmarks[bm.jid]:
self.bookmarks.append(bm)
else:
except InvalidJID:
self.core.information(
'Invalid JID for bookmark: %s/%s' % (bm.jid, bm.nick),
'Error')
......
......@@ -11,17 +11,17 @@ There are two different instances of a ConversationTab:
the time.
"""
import asyncio
import curses
import logging
from typing import Dict, Callable
from slixmpp import JID, InvalidJID
from poezio.tabs.basetabs import OneToOneTab, Tab
from poezio import common
from poezio import windows
from poezio import xhtml
from poezio.common import safeJID
from poezio.config import config
from poezio.core.structs import Command
from poezio.decorators import refresh_wrapper
......@@ -166,7 +166,13 @@ class ConversationTab(OneToOneTab):
status = iq['last_activity']['status']
from_ = iq['from']
msg = '\x19%s}The last activity of %s was %s ago%s'
if not safeJID(from_).user:
user = ''
try:
user = JID(from_).user
except InvalidJID:
pass
if not user:
msg = '\x19%s}The uptime of %s is %s.' % (
dump_tuple(get_theme().COLOR_INFORMATION_TEXT), from_,
common.parse_secs_to_str(seconds))
......@@ -188,7 +194,10 @@ class ConversationTab(OneToOneTab):
@command_args_parser.ignored
def command_info(self):
contact = roster[self.get_dest_jid()]
jid = safeJID(self.get_dest_jid())
try:
jid = JID(self.get_dest_jid())
except InvalidJID:
jid = JID('')
if contact:
if jid.resource:
resource = contact[jid.full]
......@@ -300,7 +309,10 @@ class ConversationTab(OneToOneTab):
def on_lose_focus(self):
contact = roster[self.get_dest_jid()]
jid = safeJID(self.get_dest_jid())
try:
jid = JID(self.get_dest_jid())
except InvalidJID:
jid = JID('')
if contact:
if jid.resource:
resource = contact[jid.full]
......@@ -321,7 +333,10 @@ class ConversationTab(OneToOneTab):
def on_gain_focus(self):
contact = roster[self.get_dest_jid()]
jid = safeJID(self.get_dest_jid())
try:
jid = JID(self.get_dest_jid())
except InvalidJID:
jid = JID('')
if contact:
if jid.resource:
resource = contact[jid.full]
......
......@@ -16,11 +16,11 @@ from os import getenv, path
from pathlib import Path
from typing import Dict, Callable
from slixmpp import JID, InvalidJID
from slixmpp.exceptions import IqError, IqTimeout
from poezio import common
from poezio import windows
from poezio.common import safeJID, shell_split
from poezio.common import shell_split
from poezio.config import config
from poezio.contact import Contact, Resource
from poezio.decorators import refresh_wrapper
......@@ -531,7 +531,11 @@ class RosterInfoTab(Tab):
"""
if args is None:
return self.core.command.help('name')
jid = safeJID(args[0]).bare
try:
jid = JID(args[0]).bare
except InvalidJID:
self.core.information(f'Invalid JID: {args[0]}', 'Error')
return
name = args[1] if len(args) == 2 else ''
contact = roster[jid]
......@@ -571,7 +575,11 @@ class RosterInfoTab(Tab):
else:
return self.core.command.help('groupadd')
else:
jid = safeJID(args[0]).bare
try:
jid = JID(args[0]).bare
except InvalidJID:
self.core.information(f'Invalid JID: {args[0]}', 'Error')
return
group = args[1]
contact = roster[jid]
......@@ -614,7 +622,11 @@ class RosterInfoTab(Tab):
"""
if args is None:
return self.core.command.help('groupmove')
jid = safeJID(args[0]).bare
try:
jid = JID(args[0]).bare
except InvalidJID:
self.core.information(f'Invalid JID: {args[0]}', 'Error')
return
group_from = args[1]
group_to = args[2]
......@@ -671,7 +683,11 @@ class RosterInfoTab(Tab):
if args is None:
return self.core.command.help('groupremove')
jid = safeJID(args[0]).bare
try:
jid = JID(args[0]).bare
except InvalidJID:
self.core.information(f'Invalid JID: {args[0]}', 'Error')
return
group = args[1]
contact = roster[jid]
......@@ -1037,7 +1053,7 @@ class RosterInfoTab(Tab):
if isinstance(selected_row, Contact):
jid = selected_row.bare_jid
elif isinstance(selected_row, Resource):
jid = safeJID(selected_row.jid).bare
jid = JID(selected_row.jid).bare
else:
return
self.on_slash()
......@@ -1119,8 +1135,11 @@ def jid_and_name_match(contact, txt):
if not txt:
return True
txt = txt.lower()
if txt in safeJID(contact.bare_jid).bare.lower():
return True
try:
if txt in JID(contact.bare_jid).bare.lower():
return True
except InvalidJID:
pass
if txt in contact.name.lower():
return True
return False
......@@ -1133,9 +1152,12 @@ def jid_and_name_match_slow(contact, txt):
"""
if not txt:
return True # Everything matches when search is empty
user = safeJID(contact.bare_jid).bare
if diffmatch(txt, user):
return True
try:
user = JID(contact.bare_jid).bare
if diffmatch(txt, user):
return True
except InvalidJID:
pass
if contact.name and diffmatch(txt, contact.name):
return True
return False
......@@ -4,13 +4,13 @@ Windows used inthe bookmarkstab
import curses
from typing import List, Tuple, Optional
from poezio.windows import base_wins
from slixmpp import JID, InvalidJID
from poezio.windows.base_wins import Win
from poezio.windows.inputs import Input
from poezio.windows.data_forms import FieldInput, FieldInputMixin
from poezio.theming import to_curses_attr, get_theme
from poezio.common import safeJID
from poezio.bookmarks import Bookmark, BookmarkList
......@@ -33,14 +33,20 @@ class BookmarkJIDInput(FieldInput, Input):
def __init__(self, field: Bookmark) -> None:
FieldInput.__init__(self, field)
Input.__init__(self)
jid = safeJID(field.jid)
try:
jid = JID(field.jid)
except InvalidJID:
jid = JID('')
jid.resource = field.nick or None
self.text = jid.full