1116 lines
28 KiB
Python
1116 lines
28 KiB
Python
|
from enum import IntEnum, Enum, unique
|
|||
|
from collections import namedtuple
|
|||
|
|
|||
|
from gi.repository import Gio
|
|||
|
|
|||
|
from nbxmpp.namespaces import Namespace
|
|||
|
|
|||
|
from gajim.common.i18n import _
|
|||
|
from gajim.common.i18n import Q_
|
|||
|
|
|||
|
EncryptionData = namedtuple('EncryptionData', 'additional_data')
|
|||
|
EncryptionData.__new__.__defaults__ = (None,) # type: ignore
|
|||
|
|
|||
|
Entity = namedtuple('Entity', 'jid node hash method')
|
|||
|
|
|||
|
|
|||
|
class AvatarSize(IntEnum):
|
|||
|
TAB = 16
|
|||
|
ROSTER = 32
|
|||
|
CHAT = 48
|
|||
|
NOTIFICATION = 48
|
|||
|
GROUP_INFO = 100
|
|||
|
TOOLTIP = 125
|
|||
|
VCARD = 200
|
|||
|
PUBLISH = 200
|
|||
|
|
|||
|
|
|||
|
class ArchiveState(IntEnum):
|
|||
|
NEVER = 0
|
|||
|
ALL = 1
|
|||
|
|
|||
|
|
|||
|
@unique
|
|||
|
class PathLocation(IntEnum):
|
|||
|
CONFIG = 0
|
|||
|
CACHE = 1
|
|||
|
DATA = 2
|
|||
|
|
|||
|
|
|||
|
@unique
|
|||
|
class PathType(IntEnum):
|
|||
|
FILE = 0
|
|||
|
FOLDER = 1
|
|||
|
FOLDER_OPTIONAL = 2
|
|||
|
|
|||
|
|
|||
|
@unique
|
|||
|
class KindConstant(IntEnum):
|
|||
|
STATUS = 0
|
|||
|
GCSTATUS = 1
|
|||
|
GC_MSG = 2
|
|||
|
SINGLE_MSG_RECV = 3
|
|||
|
CHAT_MSG_RECV = 4
|
|||
|
SINGLE_MSG_SENT = 5
|
|||
|
CHAT_MSG_SENT = 6
|
|||
|
ERROR = 7
|
|||
|
|
|||
|
def __str__(self):
|
|||
|
return str(self.value)
|
|||
|
|
|||
|
|
|||
|
@unique
|
|||
|
class ShowConstant(IntEnum):
|
|||
|
ONLINE = 0
|
|||
|
CHAT = 1
|
|||
|
AWAY = 2
|
|||
|
XA = 3
|
|||
|
DND = 4
|
|||
|
OFFLINE = 5
|
|||
|
|
|||
|
|
|||
|
@unique
|
|||
|
class TypeConstant(IntEnum):
|
|||
|
AIM = 0
|
|||
|
GG = 1
|
|||
|
HTTP_WS = 2
|
|||
|
ICQ = 3
|
|||
|
MSN = 4
|
|||
|
QQ = 5
|
|||
|
SMS = 6
|
|||
|
SMTP = 7
|
|||
|
TLEN = 8
|
|||
|
YAHOO = 9
|
|||
|
NEWMAIL = 10
|
|||
|
RSS = 11
|
|||
|
WEATHER = 12
|
|||
|
MRIM = 13
|
|||
|
NO_TRANSPORT = 14
|
|||
|
|
|||
|
|
|||
|
@unique
|
|||
|
class SubscriptionConstant(IntEnum):
|
|||
|
NONE = 0
|
|||
|
TO = 1
|
|||
|
FROM = 2
|
|||
|
BOTH = 3
|
|||
|
|
|||
|
|
|||
|
@unique
|
|||
|
class JIDConstant(IntEnum):
|
|||
|
NORMAL_TYPE = 0
|
|||
|
ROOM_TYPE = 1
|
|||
|
|
|||
|
@unique
|
|||
|
class StyleAttr(Enum):
|
|||
|
COLOR = 'color'
|
|||
|
BACKGROUND = 'background'
|
|||
|
FONT = 'font'
|
|||
|
|
|||
|
@unique
|
|||
|
class CSSPriority(IntEnum):
|
|||
|
APPLICATION = 600
|
|||
|
APPLICATION_DARK = 601
|
|||
|
DEFAULT_THEME = 610
|
|||
|
DEFAULT_THEME_DARK = 611
|
|||
|
USER_THEME = 650
|
|||
|
|
|||
|
@unique
|
|||
|
class ButtonAction(Enum):
|
|||
|
DESTRUCTIVE = 'destructive-action'
|
|||
|
SUGGESTED = 'suggested-action'
|
|||
|
|
|||
|
@unique
|
|||
|
class IdleState(Enum):
|
|||
|
UNKNOWN = 'unknown'
|
|||
|
XA = 'xa'
|
|||
|
AWAY = 'away'
|
|||
|
AWAKE = 'online'
|
|||
|
|
|||
|
|
|||
|
@unique
|
|||
|
class PEPEventType(IntEnum):
|
|||
|
ABSTRACT = 0
|
|||
|
ACTIVITY = 1
|
|||
|
TUNE = 2
|
|||
|
MOOD = 3
|
|||
|
LOCATION = 4
|
|||
|
NICKNAME = 5
|
|||
|
AVATAR = 6
|
|||
|
ATOM = 7
|
|||
|
BOOKMARKS = 8
|
|||
|
|
|||
|
|
|||
|
@unique
|
|||
|
class Chatstate(IntEnum):
|
|||
|
COMPOSING = 0
|
|||
|
PAUSED = 1
|
|||
|
ACTIVE = 2
|
|||
|
INACTIVE = 3
|
|||
|
GONE = 4
|
|||
|
|
|||
|
def __str__(self):
|
|||
|
return self.name.lower()
|
|||
|
|
|||
|
|
|||
|
class SyncThreshold(IntEnum):
|
|||
|
NO_SYNC = -1
|
|||
|
NO_THRESHOLD = 0
|
|||
|
|
|||
|
def __str__(self):
|
|||
|
return str(self.value)
|
|||
|
|
|||
|
|
|||
|
class MUCUser(IntEnum):
|
|||
|
JID = 0
|
|||
|
NICK = 1
|
|||
|
REASON = 1
|
|||
|
NICK_OR_REASON = 1
|
|||
|
ROLE = 2
|
|||
|
AFFILIATION = 3
|
|||
|
AFFILIATION_TEXT = 4
|
|||
|
|
|||
|
|
|||
|
@unique
|
|||
|
class Trust(IntEnum):
|
|||
|
UNTRUSTED = 0
|
|||
|
UNDECIDED = 1
|
|||
|
BLIND = 2
|
|||
|
VERIFIED = 3
|
|||
|
|
|||
|
|
|||
|
class Display(Enum):
|
|||
|
X11 = 'X11Display'
|
|||
|
WAYLAND = 'GdkWaylandDisplay'
|
|||
|
WIN32 = 'GdkWin32Display'
|
|||
|
QUARTZ = 'GdkQuartzDisplay'
|
|||
|
|
|||
|
|
|||
|
class URIType(Enum):
|
|||
|
UNKNOWN = 'unknown'
|
|||
|
XMPP = 'xmpp'
|
|||
|
MAIL = 'mail'
|
|||
|
GEO = 'geo'
|
|||
|
WEB = 'web'
|
|||
|
FILE = 'file'
|
|||
|
AT = 'at'
|
|||
|
TEL = 'tel'
|
|||
|
|
|||
|
|
|||
|
class URIAction(Enum):
|
|||
|
MESSAGE = 'message'
|
|||
|
JOIN = 'join'
|
|||
|
SUBSCRIBE = 'subscribe'
|
|||
|
|
|||
|
|
|||
|
class MUCJoinedState(Enum):
|
|||
|
JOINED = 'joined'
|
|||
|
NOT_JOINED = 'not joined'
|
|||
|
JOINING = 'joining'
|
|||
|
CREATING = 'creating'
|
|||
|
CAPTCHA_REQUEST = 'captcha in progress'
|
|||
|
CAPTCHA_FAILED = 'captcha failed'
|
|||
|
|
|||
|
def __str__(self):
|
|||
|
return self.name
|
|||
|
|
|||
|
@property
|
|||
|
def is_joined(self):
|
|||
|
return self == MUCJoinedState.JOINED
|
|||
|
|
|||
|
@property
|
|||
|
def is_not_joined(self):
|
|||
|
return self == MUCJoinedState.NOT_JOINED
|
|||
|
|
|||
|
@property
|
|||
|
def is_joining(self):
|
|||
|
return self == MUCJoinedState.JOINING
|
|||
|
|
|||
|
@property
|
|||
|
def is_creating(self):
|
|||
|
return self == MUCJoinedState.CREATING
|
|||
|
|
|||
|
@property
|
|||
|
def is_captcha_request(self):
|
|||
|
return self == MUCJoinedState.CAPTCHA_REQUEST
|
|||
|
|
|||
|
@property
|
|||
|
def is_captcha_failed(self):
|
|||
|
return self == MUCJoinedState.CAPTCHA_FAILED
|
|||
|
|
|||
|
|
|||
|
class ClientState(IntEnum):
|
|||
|
DISCONNECTING = 0
|
|||
|
DISCONNECTED = 1
|
|||
|
RECONNECT_SCHEDULED = 2
|
|||
|
CONNECTING = 3
|
|||
|
CONNECTED = 4
|
|||
|
AVAILABLE = 5
|
|||
|
|
|||
|
@property
|
|||
|
def is_disconnecting(self):
|
|||
|
return self == ClientState.DISCONNECTING
|
|||
|
|
|||
|
@property
|
|||
|
def is_disconnected(self):
|
|||
|
return self == ClientState.DISCONNECTED
|
|||
|
|
|||
|
@property
|
|||
|
def is_reconnect_scheduled(self):
|
|||
|
return self == ClientState.RECONNECT_SCHEDULED
|
|||
|
|
|||
|
@property
|
|||
|
def is_connecting(self):
|
|||
|
return self == ClientState.CONNECTING
|
|||
|
|
|||
|
@property
|
|||
|
def is_connected(self):
|
|||
|
return self == ClientState.CONNECTED
|
|||
|
|
|||
|
@property
|
|||
|
def is_available(self):
|
|||
|
return self == ClientState.AVAILABLE
|
|||
|
|
|||
|
|
|||
|
class JingleState(Enum):
|
|||
|
NULL = 'stop'
|
|||
|
CONNECTING = 'connecting'
|
|||
|
CONNECTION_RECEIVED = 'connection_received'
|
|||
|
CONNECTED = 'connected'
|
|||
|
ERROR = 'error'
|
|||
|
|
|||
|
def __str__(self):
|
|||
|
return self.value
|
|||
|
|
|||
|
|
|||
|
MUC_CREATION_EXAMPLES = [
|
|||
|
(Q_('?Group chat name:Team'),
|
|||
|
Q_('?Group chat description:Project discussion'),
|
|||
|
Q_('?Group chat address:team')),
|
|||
|
(Q_('?Group chat name:Family'),
|
|||
|
Q_('?Group chat description:Spring gathering'),
|
|||
|
Q_('?Group chat address:family')),
|
|||
|
(Q_('?Group chat name:Vacation'),
|
|||
|
Q_('?Group chat description:Trip planning'),
|
|||
|
Q_('?Group chat address:vacation')),
|
|||
|
(Q_('?Group chat name:Repairs'),
|
|||
|
Q_('?Group chat description:Local help group'),
|
|||
|
Q_('?Group chat address:repairs')),
|
|||
|
(Q_('?Group chat name:News'),
|
|||
|
Q_('?Group chat description:Local news and reports'),
|
|||
|
Q_('?Group chat address:news')),
|
|||
|
]
|
|||
|
|
|||
|
|
|||
|
MUC_DISCO_ERRORS = {
|
|||
|
'remote-server-not-found': _('Remote server not found'),
|
|||
|
'remote-server-timeout': _('Remote server timeout'),
|
|||
|
'service-unavailable': _('Address does not belong to a group chat server'),
|
|||
|
'subscription-required': _('Address does not belong to a group chat server'),
|
|||
|
'not-muc-service': _('Address does not belong to a group chat server'),
|
|||
|
'already-exists': _('Group chat already exists'),
|
|||
|
'item-not-found': _('Group chat does not exist'),
|
|||
|
'gone': _('Group chat is closed'),
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
EME_MESSAGES = {
|
|||
|
'urn:xmpp:otr:0':
|
|||
|
_('This message was encrypted with OTR '
|
|||
|
'and could not be decrypted.'),
|
|||
|
'jabber:x:encrypted':
|
|||
|
_('This message was encrypted with Legacy '
|
|||
|
'OpenPGP and could not be decrypted. You can install '
|
|||
|
'the PGP plugin to handle those messages.'),
|
|||
|
'urn:xmpp:openpgp:0':
|
|||
|
_('This message was encrypted with '
|
|||
|
'OpenPGP for XMPP and could not be decrypted. You can install '
|
|||
|
'the OpenPGP plugin to handle those messages.'),
|
|||
|
'fallback':
|
|||
|
_('This message was encrypted with %s '
|
|||
|
'and could not be decrypted.')
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
ACTIVITIES = {
|
|||
|
'doing_chores': {
|
|||
|
'category': _('Doing Chores'),
|
|||
|
'buying_groceries': _('Buying Groceries'),
|
|||
|
'cleaning': _('Cleaning'),
|
|||
|
'cooking': _('Cooking'),
|
|||
|
'doing_maintenance': _('Doing Maintenance'),
|
|||
|
'doing_the_dishes': _('Doing the Dishes'),
|
|||
|
'doing_the_laundry': _('Doing the Laundry'),
|
|||
|
'gardening': _('Gardening'),
|
|||
|
'running_an_errand': _('Running an Errand'),
|
|||
|
'walking_the_dog': _('Walking the Dog')},
|
|||
|
'drinking': {
|
|||
|
'category': _('Drinking'),
|
|||
|
'having_a_beer': _('Having a Beer'),
|
|||
|
'having_coffee': _('Having Coffee'),
|
|||
|
'having_tea': _('Having Tea')},
|
|||
|
'eating': {
|
|||
|
'category': _('Eating'),
|
|||
|
'having_a_snack': _('Having a Snack'),
|
|||
|
'having_breakfast': _('Having Breakfast'),
|
|||
|
'having_dinner': _('Having Dinner'),
|
|||
|
'having_lunch': _('Having Lunch')},
|
|||
|
'exercising': {
|
|||
|
'category': _('Exercising'),
|
|||
|
'cycling': _('Cycling'),
|
|||
|
'dancing': _('Dancing'),
|
|||
|
'hiking': _('Hiking'),
|
|||
|
'jogging': _('Jogging'),
|
|||
|
'playing_sports': _('Playing Sports'),
|
|||
|
'running': _('Running'),
|
|||
|
'skiing': _('Skiing'),
|
|||
|
'swimming': _('Swimming'),
|
|||
|
'working_out': _('Working out')},
|
|||
|
'grooming': {
|
|||
|
'category': _('Grooming'),
|
|||
|
'at_the_spa': _('At the Spa'),
|
|||
|
'brushing_teeth': _('Brushing Teeth'),
|
|||
|
'getting_a_haircut': _('Getting a Haircut'),
|
|||
|
'shaving': _('Shaving'),
|
|||
|
'taking_a_bath': _('Taking a Bath'),
|
|||
|
'taking_a_shower': _('Taking a Shower')},
|
|||
|
'having_appointment': {
|
|||
|
'category': _('Having an Appointment')},
|
|||
|
'inactive': {
|
|||
|
'category': _('Inactive'),
|
|||
|
'day_off': _('Day Off'),
|
|||
|
'hanging_out': _('Hanging out'),
|
|||
|
'hiding': _('Hiding'),
|
|||
|
'on_vacation': _('On Vacation'),
|
|||
|
'praying': _('Praying'),
|
|||
|
'scheduled_holiday': _('Scheduled Holiday'),
|
|||
|
'sleeping': _('Sleeping'),
|
|||
|
'thinking': _('Thinking')},
|
|||
|
'relaxing': {
|
|||
|
'category': _('Relaxing'),
|
|||
|
'fishing': _('Fishing'),
|
|||
|
'gaming': _('Gaming'),
|
|||
|
'going_out': _('Going out'),
|
|||
|
'partying': _('Partying'),
|
|||
|
'reading': _('Reading'),
|
|||
|
'rehearsing': _('Rehearsing'),
|
|||
|
'shopping': _('Shopping'),
|
|||
|
'smoking': _('Smoking'),
|
|||
|
'socializing': _('Socializing'),
|
|||
|
'sunbathing': _('Sunbathing'),
|
|||
|
'watching_tv': _('Watching TV'),
|
|||
|
'watching_a_movie': _('Watching a Movie')},
|
|||
|
'talking': {
|
|||
|
'category': _('Talking'),
|
|||
|
'in_real_life': _('In Real Life'),
|
|||
|
'on_the_phone': _('On the Phone'),
|
|||
|
'on_video_phone': _('On Video Phone')},
|
|||
|
'traveling': {
|
|||
|
'category': _('Traveling'),
|
|||
|
'commuting': _('Commuting'),
|
|||
|
'cycling': _('Cycling'),
|
|||
|
'driving': _('Driving'),
|
|||
|
'in_a_car': _('In a Car'),
|
|||
|
'on_a_bus': _('On a Bus'),
|
|||
|
'on_a_plane': _('On a Plane'),
|
|||
|
'on_a_train': _('On a Train'),
|
|||
|
'on_a_trip': _('On a Trip'),
|
|||
|
'walking': _('Walking')},
|
|||
|
'working': {
|
|||
|
'category': _('Working'),
|
|||
|
'coding': _('Coding'),
|
|||
|
'in_a_meeting': _('In a Meeting'),
|
|||
|
'studying': _('Studying'),
|
|||
|
'writing': _('Writing')}}
|
|||
|
|
|||
|
MOODS = {
|
|||
|
'afraid': _('Afraid'),
|
|||
|
'amazed': _('Amazed'),
|
|||
|
'amorous': _('Amorous'),
|
|||
|
'angry': _('Angry'),
|
|||
|
'annoyed': _('Annoyed'),
|
|||
|
'anxious': _('Anxious'),
|
|||
|
'aroused': _('Aroused'),
|
|||
|
'ashamed': _('Ashamed'),
|
|||
|
'bored': _('Bored'),
|
|||
|
'brave': _('Brave'),
|
|||
|
'calm': _('Calm'),
|
|||
|
'cautious': _('Cautious'),
|
|||
|
'cold': _('Cold'),
|
|||
|
'confident': _('Confident'),
|
|||
|
'confused': _('Confused'),
|
|||
|
'contemplative': _('Contemplative'),
|
|||
|
'contented': _('Contented'),
|
|||
|
'cranky': _('Cranky'),
|
|||
|
'crazy': _('Crazy'),
|
|||
|
'creative': _('Creative'),
|
|||
|
'curious': _('Curious'),
|
|||
|
'dejected': _('Dejected'),
|
|||
|
'depressed': _('Depressed'),
|
|||
|
'disappointed': _('Disappointed'),
|
|||
|
'disgusted': _('Disgusted'),
|
|||
|
'dismayed': _('Dismayed'),
|
|||
|
'distracted': _('Distracted'),
|
|||
|
'embarrassed': _('Embarrassed'),
|
|||
|
'envious': _('Envious'),
|
|||
|
'excited': _('Excited'),
|
|||
|
'flirtatious': _('Flirtatious'),
|
|||
|
'frustrated': _('Frustrated'),
|
|||
|
'grateful': _('Grateful'),
|
|||
|
'grieving': _('Grieving'),
|
|||
|
'grumpy': _('Grumpy'),
|
|||
|
'guilty': _('Guilty'),
|
|||
|
'happy': _('Happy'),
|
|||
|
'hopeful': _('Hopeful'),
|
|||
|
'hot': _('Hot'),
|
|||
|
'humbled': _('Humbled'),
|
|||
|
'humiliated': _('Humiliated'),
|
|||
|
'hungry': _('Hungry'),
|
|||
|
'hurt': _('Hurt'),
|
|||
|
'impressed': _('Impressed'),
|
|||
|
'in_awe': _('In Awe'),
|
|||
|
'in_love': _('In Love'),
|
|||
|
'indignant': _('Indignant'),
|
|||
|
'interested': _('Interested'),
|
|||
|
'intoxicated': _('Intoxicated'),
|
|||
|
'invincible': _('Invincible'),
|
|||
|
'jealous': _('Jealous'),
|
|||
|
'lonely': _('Lonely'),
|
|||
|
'lost': _('Lost'),
|
|||
|
'lucky': _('Lucky'),
|
|||
|
'mean': _('Mean'),
|
|||
|
'moody': _('Moody'),
|
|||
|
'nervous': _('Nervous'),
|
|||
|
'neutral': _('Neutral'),
|
|||
|
'offended': _('Offended'),
|
|||
|
'outraged': _('Outraged'),
|
|||
|
'playful': _('Playful'),
|
|||
|
'proud': _('Proud'),
|
|||
|
'relaxed': _('Relaxed'),
|
|||
|
'relieved': _('Relieved'),
|
|||
|
'remorseful': _('Remorseful'),
|
|||
|
'restless': _('Restless'),
|
|||
|
'sad': _('Sad'),
|
|||
|
'sarcastic': _('Sarcastic'),
|
|||
|
'satisfied': _('Satisfied'),
|
|||
|
'serious': _('Serious'),
|
|||
|
'shocked': _('Shocked'),
|
|||
|
'shy': _('Shy'),
|
|||
|
'sick': _('Sick'),
|
|||
|
'sleepy': _('Sleepy'),
|
|||
|
'spontaneous': _('Spontaneous'),
|
|||
|
'stressed': _('Stressed'),
|
|||
|
'strong': _('Strong'),
|
|||
|
'surprised': _('Surprised'),
|
|||
|
'thankful': _('Thankful'),
|
|||
|
'thirsty': _('Thirsty'),
|
|||
|
'tired': _('Tired'),
|
|||
|
'undefined': _('Undefined'),
|
|||
|
'weak': _('Weak'),
|
|||
|
'worried': _('Worried')
|
|||
|
}
|
|||
|
|
|||
|
LOCATION_DATA = {
|
|||
|
'accuracy': _('accuracy'),
|
|||
|
'alt': _('alt'),
|
|||
|
'area': _('area'),
|
|||
|
'bearing': _('bearing'),
|
|||
|
'building': _('building'),
|
|||
|
'country': _('country'),
|
|||
|
'countrycode': _('countrycode'),
|
|||
|
'datum': _('datum'),
|
|||
|
'description': _('description'),
|
|||
|
'error': _('error'),
|
|||
|
'floor': _('floor'),
|
|||
|
'lat': _('lat'),
|
|||
|
'locality': _('locality'),
|
|||
|
'lon': _('lon'),
|
|||
|
'postalcode': _('postalcode'),
|
|||
|
'region': _('region'),
|
|||
|
'room': _('room'),
|
|||
|
'speed': _('speed'),
|
|||
|
'street': _('street'),
|
|||
|
'text': _('text'),
|
|||
|
'timestamp': _('timestamp'),
|
|||
|
'uri': _('URI')
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
SSLError = {
|
|||
|
2: _("Unable to get issuer certificate"),
|
|||
|
3: _("Unable to get certificate CRL"),
|
|||
|
4: _("Unable to decrypt certificate's signature"),
|
|||
|
5: _("Unable to decrypt CRL's signature"),
|
|||
|
6: _("Unable to decode issuer public key"),
|
|||
|
7: _("Certificate signature failure"),
|
|||
|
8: _("CRL signature failure"),
|
|||
|
9: _("Certificate is not yet valid"),
|
|||
|
10: _("Certificate has expired"),
|
|||
|
11: _("CRL is not yet valid"),
|
|||
|
12: _("CRL has expired"),
|
|||
|
13: _("Format error in certificate's notBefore field"),
|
|||
|
14: _("Format error in certificate's notAfter field"),
|
|||
|
15: _("Format error in CRL's lastUpdate field"),
|
|||
|
16: _("Format error in CRL's nextUpdate field"),
|
|||
|
17: _("Out of memory"),
|
|||
|
18: _("Self signed certificate"),
|
|||
|
19: _("Self signed certificate in certificate chain"),
|
|||
|
20: _("Unable to get local issuer certificate"),
|
|||
|
21: _("Unable to verify the first certificate"),
|
|||
|
22: _("Certificate chain too long"),
|
|||
|
23: _("Certificate revoked"),
|
|||
|
24: _("Invalid CA certificate"),
|
|||
|
25: _("Path length constraint exceeded"),
|
|||
|
26: _("Unsupported certificate purpose"),
|
|||
|
27: _("Certificate not trusted"),
|
|||
|
28: _("Certificate rejected"),
|
|||
|
29: _("Subject issuer mismatch"),
|
|||
|
30: _("Authority and subject key identifier mismatch"),
|
|||
|
31: _("Authority and issuer serial number mismatch"),
|
|||
|
32: _("Key usage does not include certificate signing"),
|
|||
|
50: _("Application verification failure"),
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
THANKS = u"""\
|
|||
|
Alexander Futász
|
|||
|
Alexander V. Butenko
|
|||
|
Alexey Nezhdanov
|
|||
|
Alfredo Junix
|
|||
|
Anaël Verrier
|
|||
|
Anders Ström
|
|||
|
Andrew Sayman
|
|||
|
Anton Shmigirilov
|
|||
|
Christian Bjälevik
|
|||
|
Christophe Got
|
|||
|
Christoph Neuroth
|
|||
|
David Campey
|
|||
|
Dennis Craven
|
|||
|
Fabian Neumann
|
|||
|
Filippos Papadopoulos
|
|||
|
Francisco Alburquerque Parra (Membris Khan)
|
|||
|
Frederic Lory
|
|||
|
Fridtjof Bussefor
|
|||
|
Geobert Quach
|
|||
|
Guillaume Morin
|
|||
|
Gustavo J. A. M. Carneiro
|
|||
|
Ivo Anjo
|
|||
|
Josef Vybíral
|
|||
|
Juraj Michalek
|
|||
|
Kjell Braden
|
|||
|
Luis Peralta
|
|||
|
Michael Scherer
|
|||
|
Michele Campeotto
|
|||
|
Mike Albon
|
|||
|
Miguel Fonseca
|
|||
|
Norman Rasmussen
|
|||
|
Oscar Hellström
|
|||
|
Peter Saint-Andre
|
|||
|
Petr Menšík
|
|||
|
Sergey Kuleshov
|
|||
|
Stavros Giannouris
|
|||
|
Stian B. Barmen
|
|||
|
Thilo Molitor
|
|||
|
Thomas Klein-Hitpaß
|
|||
|
Urtzi Alfaro
|
|||
|
Witold Kieraś
|
|||
|
Yakov Bezrukov
|
|||
|
Yavor Doganov
|
|||
|
""".strip().split("\n")
|
|||
|
|
|||
|
ARTISTS = u"""\
|
|||
|
Anders Ström
|
|||
|
Christophe Got
|
|||
|
Dennis Craven
|
|||
|
Dmitry Korzhevin
|
|||
|
Guillaume Morin
|
|||
|
Gvorcek Spajreh
|
|||
|
Josef Vybíral
|
|||
|
Membris Khan
|
|||
|
Rederick Asher
|
|||
|
Jakub Szypulka
|
|||
|
""".strip().split("\n")
|
|||
|
|
|||
|
DEVS_CURRENT = u"""\
|
|||
|
Yann Leboulanger (asterix AT lagaule.org)
|
|||
|
Philipp Hörist (philipp AT hoerist.com)
|
|||
|
Daniel Brötzmann (wurstsalat AT posteo.de)
|
|||
|
André Apitzsch
|
|||
|
""".strip().split("\n")
|
|||
|
|
|||
|
DEVS_PAST = u"""\
|
|||
|
Stefan Bethge (stefan AT lanpartei.de)
|
|||
|
Alexander Cherniuk (ts33kr AT gmail.com)
|
|||
|
Stephan Erb (steve-e AT h3c.de)
|
|||
|
Vincent Hanquez (tab AT snarc.org)
|
|||
|
Dimitur Kirov (dkirov AT gmail.com)
|
|||
|
Nikos Kouremenos (kourem AT gmail.com)
|
|||
|
Julien Pivotto (roidelapluie AT gmail.com)
|
|||
|
Jonathan Schleifer (js-gajim AT webkeks.org)
|
|||
|
Travis Shirk (travis AT pobox.com)
|
|||
|
Brendan Taylor (whateley AT gmail.com)
|
|||
|
Jean-Marie Traissard (jim AT lapin.org)
|
|||
|
""".strip().split("\n")
|
|||
|
|
|||
|
|
|||
|
RFC5646_LANGUAGE_TAGS = {
|
|||
|
'af': 'Afrikaans',
|
|||
|
'af-ZA': 'Afrikaans (South Africa)',
|
|||
|
'ar': 'Arabic',
|
|||
|
'ar-AE': 'Arabic (U.A.E.)',
|
|||
|
'ar-BH': 'Arabic (Bahrain)',
|
|||
|
'ar-DZ': 'Arabic (Algeria)',
|
|||
|
'ar-EG': 'Arabic (Egypt)',
|
|||
|
'ar-IQ': 'Arabic (Iraq)',
|
|||
|
'ar-JO': 'Arabic (Jordan)',
|
|||
|
'ar-KW': 'Arabic (Kuwait)',
|
|||
|
'ar-LB': 'Arabic (Lebanon)',
|
|||
|
'ar-LY': 'Arabic (Libya)',
|
|||
|
'ar-MA': 'Arabic (Morocco)',
|
|||
|
'ar-OM': 'Arabic (Oman)',
|
|||
|
'ar-QA': 'Arabic (Qatar)',
|
|||
|
'ar-SA': 'Arabic (Saudi Arabia)',
|
|||
|
'ar-SY': 'Arabic (Syria)',
|
|||
|
'ar-TN': 'Arabic (Tunisia)',
|
|||
|
'ar-YE': 'Arabic (Yemen)',
|
|||
|
'az': 'Azeri (Latin)',
|
|||
|
'az-AZ': 'Azeri (Latin) (Azerbaijan)',
|
|||
|
'az-Cyrl-AZ': 'Azeri (Cyrillic) (Azerbaijan)',
|
|||
|
'be': 'Belarusian',
|
|||
|
'be-BY': 'Belarusian (Belarus)',
|
|||
|
'bg': 'Bulgarian',
|
|||
|
'bg-BG': 'Bulgarian (Bulgaria)',
|
|||
|
'bs-BA': 'Bosnian (Bosnia and Herzegovina)',
|
|||
|
'ca': 'Catalan',
|
|||
|
'ca-ES': 'Catalan (Spain)',
|
|||
|
'cs': 'Czech',
|
|||
|
'cs-CZ': 'Czech (Czech Republic)',
|
|||
|
'cy': 'Welsh',
|
|||
|
'cy-GB': 'Welsh (United Kingdom)',
|
|||
|
'da': 'Danish',
|
|||
|
'da-DK': 'Danish (Denmark)',
|
|||
|
'de': 'German',
|
|||
|
'de-AT': 'German (Austria)',
|
|||
|
'de-CH': 'German (Switzerland)',
|
|||
|
'de-DE': 'German (Germany)',
|
|||
|
'de-LI': 'German (Liechtenstein)',
|
|||
|
'de-LU': 'German (Luxembourg)',
|
|||
|
'dv': 'Divehi',
|
|||
|
'dv-MV': 'Divehi (Maldives)',
|
|||
|
'el': 'Greek',
|
|||
|
'el-GR': 'Greek (Greece)',
|
|||
|
'en': 'English',
|
|||
|
'en-AU': 'English (Australia)',
|
|||
|
'en-BZ': 'English (Belize)',
|
|||
|
'en-CA': 'English (Canada)',
|
|||
|
'en-CB': 'English (Caribbean)',
|
|||
|
'en-GB': 'English (United Kingdom)',
|
|||
|
'en-IE': 'English (Ireland)',
|
|||
|
'en-JM': 'English (Jamaica)',
|
|||
|
'en-NZ': 'English (New Zealand)',
|
|||
|
'en-PH': 'English (Republic of the Philippines)',
|
|||
|
'en-TT': 'English (Trinidad and Tobago)',
|
|||
|
'en-US': 'English (United States)',
|
|||
|
'en-ZA': 'English (South Africa)',
|
|||
|
'en-ZW': 'English (Zimbabwe)',
|
|||
|
'eo': 'Esperanto',
|
|||
|
'es': 'Spanish',
|
|||
|
'es-AR': 'Spanish (Argentina)',
|
|||
|
'es-BO': 'Spanish (Bolivia)',
|
|||
|
'es-CL': 'Spanish (Chile)',
|
|||
|
'es-CO': 'Spanish (Colombia)',
|
|||
|
'es-CR': 'Spanish (Costa Rica)',
|
|||
|
'es-DO': 'Spanish (Dominican Republic)',
|
|||
|
'es-EC': 'Spanish (Ecuador)',
|
|||
|
'es-ES': 'Spanish (Spain)',
|
|||
|
'es-GT': 'Spanish (Guatemala)',
|
|||
|
'es-HN': 'Spanish (Honduras)',
|
|||
|
'es-MX': 'Spanish (Mexico)',
|
|||
|
'es-NI': 'Spanish (Nicaragua)',
|
|||
|
'es-PA': 'Spanish (Panama)',
|
|||
|
'es-PE': 'Spanish (Peru)',
|
|||
|
'es-PR': 'Spanish (Puerto Rico)',
|
|||
|
'es-PY': 'Spanish (Paraguay)',
|
|||
|
'es-SV': 'Spanish (El Salvador)',
|
|||
|
'es-UY': 'Spanish (Uruguay)',
|
|||
|
'es-VE': 'Spanish (Venezuela)',
|
|||
|
'et': 'Estonian',
|
|||
|
'et-EE': 'Estonian (Estonia)',
|
|||
|
'eu': 'Basque',
|
|||
|
'eu-ES': 'Basque (Spain)',
|
|||
|
'fa': 'Farsi',
|
|||
|
'fa-IR': 'Farsi (Iran)',
|
|||
|
'fi': 'Finnish',
|
|||
|
'fi-FI': 'Finnish (Finland)',
|
|||
|
'fo': 'Faroese',
|
|||
|
'fo-FO': 'Faroese (Faroe Islands)',
|
|||
|
'fr': 'French',
|
|||
|
'fr-BE': 'French (Belgium)',
|
|||
|
'fr-CA': 'French (Canada)',
|
|||
|
'fr-CH': 'French (Switzerland)',
|
|||
|
'fr-FR': 'French (France)',
|
|||
|
'fr-LU': 'French (Luxembourg)',
|
|||
|
'fr-MC': 'French (Principality of Monaco)',
|
|||
|
'gl': 'Galician',
|
|||
|
'gl-ES': 'Galician (Spain)',
|
|||
|
'gu': 'Gujarati',
|
|||
|
'gu-IN': 'Gujarati (India)',
|
|||
|
'he': 'Hebrew',
|
|||
|
'he-IL': 'Hebrew (Israel)',
|
|||
|
'hi': 'Hindi',
|
|||
|
'hi-IN': 'Hindi (India)',
|
|||
|
'hr': 'Croatian',
|
|||
|
'hr-BA': 'Croatian (Bosnia and Herzegovina)',
|
|||
|
'hr-HR': 'Croatian (Croatia)',
|
|||
|
'hu': 'Hungarian',
|
|||
|
'hu-HU': 'Hungarian (Hungary)',
|
|||
|
'hy': 'Armenian',
|
|||
|
'hy-AM': 'Armenian (Armenia)',
|
|||
|
'id': 'Indonesian',
|
|||
|
'id-ID': 'Indonesian (Indonesia)',
|
|||
|
'is': 'Icelandic',
|
|||
|
'is-IS': 'Icelandic (Iceland)',
|
|||
|
'it': 'Italian',
|
|||
|
'it-CH': 'Italian (Switzerland)',
|
|||
|
'it-IT': 'Italian (Italy)',
|
|||
|
'ja': 'Japanese',
|
|||
|
'ja-JP': 'Japanese (Japan)',
|
|||
|
'ka': 'Georgian',
|
|||
|
'ka-GE': 'Georgian (Georgia)',
|
|||
|
'kk': 'Kazakh',
|
|||
|
'kk-KZ': 'Kazakh (Kazakhstan)',
|
|||
|
'kn': 'Kannada',
|
|||
|
'kn-IN': 'Kannada (India)',
|
|||
|
'ko': 'Korean',
|
|||
|
'ko-KR': 'Korean (Korea)',
|
|||
|
'kok': 'Konkani',
|
|||
|
'kok-IN': 'Konkani (India)',
|
|||
|
'ky': 'Kyrgyz',
|
|||
|
'ky-KG': 'Kyrgyz (Kyrgyzstan)',
|
|||
|
'lt': 'Lithuanian',
|
|||
|
'lt-LT': 'Lithuanian (Lithuania)',
|
|||
|
'lv': 'Latvian',
|
|||
|
'lv-LV': 'Latvian (Latvia)',
|
|||
|
'mi': 'Maori',
|
|||
|
'mi-NZ': 'Maori (New Zealand)',
|
|||
|
'mk': 'FYRO Macedonian',
|
|||
|
'mk-MK': 'FYRO Macedonian (Former Yugoslav Republic of Macedonia)',
|
|||
|
'mn': 'Mongolian',
|
|||
|
'mn-MN': 'Mongolian (Mongolia)',
|
|||
|
'mr': 'Marathi',
|
|||
|
'mr-IN': 'Marathi (India)',
|
|||
|
'ms': 'Malay',
|
|||
|
'ms-BN': 'Malay (Brunei Darussalam)',
|
|||
|
'ms-MY': 'Malay (Malaysia)',
|
|||
|
'mt': 'Maltese',
|
|||
|
'mt-MT': 'Maltese (Malta)',
|
|||
|
'nb': 'Norwegian (Bokm?l)',
|
|||
|
'nb-NO': 'Norwegian (Bokm?l) (Norway)',
|
|||
|
'nl': 'Dutch',
|
|||
|
'nl-BE': 'Dutch (Belgium)',
|
|||
|
'nl-NL': 'Dutch (Netherlands)',
|
|||
|
'nn-NO': 'Norwegian (Nynorsk) (Norway)',
|
|||
|
'ns': 'Northern Sotho',
|
|||
|
'ns-ZA': 'Northern Sotho (South Africa)',
|
|||
|
'pa': 'Punjabi',
|
|||
|
'pa-IN': 'Punjabi (India)',
|
|||
|
'pl': 'Polish',
|
|||
|
'pl-PL': 'Polish (Poland)',
|
|||
|
'ps': 'Pashto',
|
|||
|
'ps-AR': 'Pashto (Afghanistan)',
|
|||
|
'pt': 'Portuguese',
|
|||
|
'pt-BR': 'Portuguese (Brazil)',
|
|||
|
'pt-PT': 'Portuguese (Portugal)',
|
|||
|
'qu': 'Quechua',
|
|||
|
'qu-BO': 'Quechua (Bolivia)',
|
|||
|
'qu-EC': 'Quechua (Ecuador)',
|
|||
|
'qu-PE': 'Quechua (Peru)',
|
|||
|
'ro': 'Romanian',
|
|||
|
'ro-RO': 'Romanian (Romania)',
|
|||
|
'ru': 'Russian',
|
|||
|
'ru-RU': 'Russian (Russia)',
|
|||
|
'sa': 'Sanskrit',
|
|||
|
'sa-IN': 'Sanskrit (India)',
|
|||
|
'se': 'Sami',
|
|||
|
'se-FI': 'Sami (Finland)',
|
|||
|
'se-NO': 'Sami (Norway)',
|
|||
|
'se-SE': 'Sami (Sweden)',
|
|||
|
'sk': 'Slovak',
|
|||
|
'sk-SK': 'Slovak (Slovakia)',
|
|||
|
'sl': 'Slovenian',
|
|||
|
'sl-SI': 'Slovenian (Slovenia)',
|
|||
|
'sq': 'Albanian',
|
|||
|
'sq-AL': 'Albanian (Albania)',
|
|||
|
'sr-BA': 'Serbian (Latin) (Bosnia and Herzegovina)',
|
|||
|
'sr-Cyrl-BA': 'Serbian (Cyrillic) (Bosnia and Herzegovina)',
|
|||
|
'sr-SP': 'Serbian (Latin) (Serbia and Montenegro)',
|
|||
|
'sr-Cyrl-SP': 'Serbian (Cyrillic) (Serbia and Montenegro)',
|
|||
|
'sv': 'Swedish',
|
|||
|
'sv-FI': 'Swedish (Finland)',
|
|||
|
'sv-SE': 'Swedish (Sweden)',
|
|||
|
'sw': 'Swahili',
|
|||
|
'sw-KE': 'Swahili (Kenya)',
|
|||
|
'syr': 'Syriac',
|
|||
|
'syr-SY': 'Syriac (Syria)',
|
|||
|
'ta': 'Tamil',
|
|||
|
'ta-IN': 'Tamil (India)',
|
|||
|
'te': 'Telugu',
|
|||
|
'te-IN': 'Telugu (India)',
|
|||
|
'th': 'Thai',
|
|||
|
'th-TH': 'Thai (Thailand)',
|
|||
|
'tl': 'Tagalog',
|
|||
|
'tl-PH': 'Tagalog (Philippines)',
|
|||
|
'tn': 'Tswana',
|
|||
|
'tn-ZA': 'Tswana (South Africa)',
|
|||
|
'tr': 'Turkish',
|
|||
|
'tr-TR': 'Turkish (Turkey)',
|
|||
|
'tt': 'Tatar',
|
|||
|
'tt-RU': 'Tatar (Russia)',
|
|||
|
'ts': 'Tsonga',
|
|||
|
'uk': 'Ukrainian',
|
|||
|
'uk-UA': 'Ukrainian (Ukraine)',
|
|||
|
'ur': 'Urdu',
|
|||
|
'ur-PK': 'Urdu (Islamic Republic of Pakistan)',
|
|||
|
'uz': 'Uzbek (Latin)',
|
|||
|
'uz-UZ': 'Uzbek (Latin) (Uzbekistan)',
|
|||
|
'uz-Cyrl-UZ': 'Uzbek (Cyrillic) (Uzbekistan)',
|
|||
|
'vi': 'Vietnamese',
|
|||
|
'vi-VN': 'Vietnamese (Viet Nam)',
|
|||
|
'xh': 'Xhosa',
|
|||
|
'xh-ZA': 'Xhosa (South Africa)',
|
|||
|
'zh': 'Chinese',
|
|||
|
'zh-CN': 'Chinese (S)',
|
|||
|
'zh-HK': 'Chinese (Hong Kong)',
|
|||
|
'zh-MO': 'Chinese (Macau)',
|
|||
|
'zh-SG': 'Chinese (Singapore)',
|
|||
|
'zh-TW': 'Chinese (T)',
|
|||
|
'zu': 'Zulu',
|
|||
|
'zu-ZA': 'Zulu (South Africa)'
|
|||
|
}
|
|||
|
|
|||
|
# pylint: disable=line-too-long
|
|||
|
GIO_TLS_ERRORS = {
|
|||
|
Gio.TlsCertificateFlags.UNKNOWN_CA: _('The signing certificate authority is not known'),
|
|||
|
Gio.TlsCertificateFlags.REVOKED: _('The certificate has been revoked'),
|
|||
|
Gio.TlsCertificateFlags.BAD_IDENTITY: _('The certificate does not match the expected identity of the site'),
|
|||
|
Gio.TlsCertificateFlags.INSECURE: _('The certificate’s algorithm is insecure'),
|
|||
|
Gio.TlsCertificateFlags.NOT_ACTIVATED: _('The certificate’s activation time is in the future'),
|
|||
|
Gio.TlsCertificateFlags.GENERIC_ERROR: _('Unknown validation error'),
|
|||
|
Gio.TlsCertificateFlags.EXPIRED: _('The certificate has expired'),
|
|||
|
}
|
|||
|
# pylint: enable=line-too-long
|
|||
|
|
|||
|
|
|||
|
class FTState(Enum):
|
|||
|
PREPARING = 'prepare'
|
|||
|
ENCRYPTING = 'encrypting'
|
|||
|
DECRYPTING = 'decrypting'
|
|||
|
STARTED = 'started'
|
|||
|
IN_PROGRESS = 'progress'
|
|||
|
FINISHED = 'finished'
|
|||
|
ERROR = 'error'
|
|||
|
CANCELLED = 'cancelled'
|
|||
|
|
|||
|
@property
|
|||
|
def is_preparing(self):
|
|||
|
return self == FTState.PREPARING
|
|||
|
|
|||
|
@property
|
|||
|
def is_encrypting(self):
|
|||
|
return self == FTState.ENCRYPTING
|
|||
|
|
|||
|
@property
|
|||
|
def is_decrypting(self):
|
|||
|
return self == FTState.DECRYPTING
|
|||
|
|
|||
|
@property
|
|||
|
def is_started(self):
|
|||
|
return self == FTState.STARTED
|
|||
|
|
|||
|
@property
|
|||
|
def is_in_progress(self):
|
|||
|
return self == FTState.IN_PROGRESS
|
|||
|
|
|||
|
@property
|
|||
|
def is_finished(self):
|
|||
|
return self == FTState.FINISHED
|
|||
|
|
|||
|
@property
|
|||
|
def is_error(self):
|
|||
|
return self == FTState.ERROR
|
|||
|
|
|||
|
@property
|
|||
|
def is_cancelled(self):
|
|||
|
return self == FTState.CANCELLED
|
|||
|
|
|||
|
@property
|
|||
|
def is_active(self):
|
|||
|
return not (self.is_error or
|
|||
|
self.is_cancelled or
|
|||
|
self.is_finished)
|
|||
|
|
|||
|
|
|||
|
SASL_ERRORS = {
|
|||
|
'aborted': _('Authentication aborted'),
|
|||
|
'account-disabled': _('Account disabled'),
|
|||
|
'credentials-expired': _('Credentials expired'),
|
|||
|
'encryption-required': _('Encryption required'),
|
|||
|
'incorrect-encoding': _('Authentication failed'),
|
|||
|
'invalid-authzid': _('Authentication failed'),
|
|||
|
'malformed-request': _('Authentication failed'),
|
|||
|
'invalid-mechanism': _('Authentication mechanism not supported'),
|
|||
|
'mechanism-too-weak': _('Authentication mechanism too weak'),
|
|||
|
'not-authorized': _('Authentication failed'),
|
|||
|
'temporary-auth-failure': _('Authentication currently not possible'),
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
COMMON_FEATURES = [
|
|||
|
Namespace.BYTESTREAM,
|
|||
|
Namespace.MUC,
|
|||
|
Namespace.COMMANDS,
|
|||
|
Namespace.DISCO_INFO,
|
|||
|
Namespace.LAST,
|
|||
|
Namespace.DATA,
|
|||
|
Namespace.ENCRYPTED,
|
|||
|
Namespace.PING,
|
|||
|
Namespace.CHATSTATES,
|
|||
|
Namespace.RECEIPTS,
|
|||
|
Namespace.TIME_REVISED,
|
|||
|
Namespace.VERSION,
|
|||
|
Namespace.ROSTERX,
|
|||
|
Namespace.SECLABEL,
|
|||
|
Namespace.CONFERENCE,
|
|||
|
Namespace.CORRECT,
|
|||
|
Namespace.CHATMARKERS,
|
|||
|
Namespace.EME,
|
|||
|
Namespace.XHTML_IM,
|
|||
|
Namespace.HASHES_2,
|
|||
|
Namespace.HASHES_MD5,
|
|||
|
Namespace.HASHES_SHA1,
|
|||
|
Namespace.HASHES_SHA256,
|
|||
|
Namespace.HASHES_SHA512,
|
|||
|
Namespace.HASHES_SHA3_256,
|
|||
|
Namespace.HASHES_SHA3_512,
|
|||
|
Namespace.HASHES_BLAKE2B_256,
|
|||
|
Namespace.HASHES_BLAKE2B_512,
|
|||
|
Namespace.JINGLE,
|
|||
|
Namespace.JINGLE_FILE_TRANSFER_5,
|
|||
|
Namespace.JINGLE_XTLS,
|
|||
|
Namespace.JINGLE_BYTESTREAM,
|
|||
|
Namespace.JINGLE_IBB,
|
|||
|
Namespace.AVATAR_METADATA + '+notify',
|
|||
|
]
|
|||
|
|
|||
|
|
|||
|
SHOW_LIST = [
|
|||
|
'offline',
|
|||
|
'connecting',
|
|||
|
'online',
|
|||
|
'chat',
|
|||
|
'away',
|
|||
|
'xa',
|
|||
|
'dnd',
|
|||
|
'error'
|
|||
|
]
|
|||
|
|
|||
|
|
|||
|
URI_SCHEMES = {
|
|||
|
'aaa://',
|
|||
|
'aaas://',
|
|||
|
'acap://',
|
|||
|
'cap://',
|
|||
|
'cid:',
|
|||
|
'crid://',
|
|||
|
'data:',
|
|||
|
'dav:',
|
|||
|
'dict://',
|
|||
|
'dns:',
|
|||
|
'fax:',
|
|||
|
'file:/',
|
|||
|
'ftp://',
|
|||
|
'geo:',
|
|||
|
'go:',
|
|||
|
'gopher://',
|
|||
|
'h323:',
|
|||
|
'http://',
|
|||
|
'https://',
|
|||
|
'iax:',
|
|||
|
'icap://',
|
|||
|
'im:',
|
|||
|
'imap://',
|
|||
|
'info:',
|
|||
|
'ipp://',
|
|||
|
'iris:',
|
|||
|
'iris.beep:',
|
|||
|
'iris.xpc:',
|
|||
|
'iris.xpcs:',
|
|||
|
'iris.lwz:',
|
|||
|
'ldap://',
|
|||
|
'mid:',
|
|||
|
'modem:',
|
|||
|
'msrp://',
|
|||
|
'msrps://',
|
|||
|
'mtqp://',
|
|||
|
'mupdate://',
|
|||
|
'news:',
|
|||
|
'nfs://',
|
|||
|
'nntp://',
|
|||
|
'opaquelocktoken:',
|
|||
|
'pop://',
|
|||
|
'pres:',
|
|||
|
'prospero://',
|
|||
|
'rtsp://',
|
|||
|
'service:',
|
|||
|
'sip:',
|
|||
|
'sips:',
|
|||
|
'sms:',
|
|||
|
'snmp://',
|
|||
|
'soap.beep://',
|
|||
|
'soap.beeps://',
|
|||
|
'tag:',
|
|||
|
'tel:',
|
|||
|
'telnet://',
|
|||
|
'tftp://',
|
|||
|
'thismessage:/',
|
|||
|
'tip://',
|
|||
|
'tv:',
|
|||
|
'urn://',
|
|||
|
'vemmi://',
|
|||
|
'xmlrpc.beep://',
|
|||
|
'xmlrpc.beeps://',
|
|||
|
'z39.50r://',
|
|||
|
'z39.50s://',
|
|||
|
'about:',
|
|||
|
'apt:',
|
|||
|
'cvs://',
|
|||
|
'daap://',
|
|||
|
'ed2k://',
|
|||
|
'feed:',
|
|||
|
'fish://',
|
|||
|
'git://',
|
|||
|
'iax2:',
|
|||
|
'irc://',
|
|||
|
'ircs://',
|
|||
|
'ldaps://',
|
|||
|
'magnet:',
|
|||
|
'mms://',
|
|||
|
'rsync://',
|
|||
|
'ssh://',
|
|||
|
'svn://',
|
|||
|
'sftp://',
|
|||
|
'smb://',
|
|||
|
'webcal://',
|
|||
|
'aesgcm://',
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
THRESHOLD_OPTIONS = {
|
|||
|
-1: _('No Sync'),
|
|||
|
1: _('1 Day'),
|
|||
|
2: _('2 Days'),
|
|||
|
7: _('1 Week'),
|
|||
|
30: _('1 Month'),
|
|||
|
0: _('No Threshold'),
|
|||
|
}
|