Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
gajim
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
eta
gajim
Commits
acf31c15
Commit
acf31c15
authored
19 years ago
by
Yann Leboulanger
Browse files
Options
Downloads
Patches
Plain Diff
don't send more than 5 (by default) stanza per seconde
parent
6a4214fc
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
src/common/config.py
+1
-0
1 addition, 0 deletions
src/common/config.py
src/common/connection.py
+68
-46
68 additions, 46 deletions
src/common/connection.py
with
69 additions
and
46 deletions
src/common/config.py
+
1
−
0
View file @
acf31c15
...
...
@@ -138,6 +138,7 @@ class Config:
'
keep_alive_disconnect_secs
'
:
[
opt_int
,
120
],
# try for 2 minutes before giving up (aka. timeout after those seconds)
'
try_connecting_for_foo_secs
'
:
[
opt_int
,
120
],
'
max_stanza_per_sec
'
:
[
opt_int
,
5
],
},
{}),
'
statusmsg
'
:
({
'
message
'
:
[
opt_str
,
''
],
...
...
This diff is collapsed.
Click to expand it.
src/common/connection.py
+
68
−
46
View file @
acf31c15
...
...
@@ -101,7 +101,8 @@ def get_os_info():
# sourcemage_version has all the info we need
if
not
os
.
path
.
basename
(
path_to_file
).
startswith
(
'
sourcemage
'
):
text
=
distro_name
+
'
'
+
text
elif
path_to_file
.
endswith
(
'
aurox-release
'
):
# file doesn't have version
elif
path_to_file
.
endswith
(
'
aurox-release
'
):
# file doesn't have version
text
=
distro_name
elif
path_to_file
.
endswith
(
'
lfs-release
'
):
# file just has version
text
=
distro_name
+
'
'
+
text
...
...
@@ -130,6 +131,8 @@ class Connection:
self
.
on_purpose
=
False
self
.
last_incoming
=
time
.
time
()
self
.
keep_alive_sent
=
False
self
.
to_be_sent
=
[]
self
.
last_sent
=
[]
self
.
password
=
gajim
.
config
.
get_per
(
'
accounts
'
,
name
,
'
password
'
)
if
USE_GPG
:
self
.
gpg
=
GnuPG
.
GnuPG
()
...
...
@@ -151,7 +154,7 @@ class Connection:
iq
=
common
.
xmpp
.
Iq
(
typ
=
'
get
'
,
to
=
jid
,
queryNS
=
ns
)
if
node
:
iq
.
setQuerynode
(
node
)
self
.
connection
.
send
(
iq
)
self
.
to_be_sent
.
insert
(
0
,
iq
)
def
discoverItems
(
self
,
jid
,
node
=
None
):
'''
According to JEP-0030: jid is mandatory,
...
...
@@ -279,10 +282,12 @@ class Connection:
gajim
.
log
.
debug
(
'
subscribe request from %s
'
%
who
)
if
gajim
.
config
.
get
(
'
alwaysauth
'
)
or
who
.
find
(
"
@
"
)
<=
0
:
if
self
.
connection
:
self
.
connection
.
send
(
common
.
xmpp
.
Presence
(
who
,
'
subscribed
'
))
self
.
to_be_sent
.
insert
(
0
,
common
.
xmpp
.
Presence
(
who
,
'
subscribed
'
))
if
who
.
find
(
"
@
"
)
<=
0
:
self
.
dispatch
(
'
NOTIFY
'
,
(
prs
.
getFrom
().
getStripped
().
encode
(
'
utf8
'
),
\
'
offline
'
,
'
offline
'
,
prs
.
getFrom
().
getResource
().
encode
(
'
utf8
'
),
prio
,
\
self
.
dispatch
(
'
NOTIFY
'
,
(
prs
.
getFrom
().
getStripped
().
encode
(
'
utf8
'
),
'
offline
'
,
'
offline
'
,
prs
.
getFrom
().
getResource
().
encode
(
'
utf8
'
),
prio
,
keyID
,
None
,
None
,
None
,
None
,
None
,
None
))
else
:
if
not
status
:
...
...
@@ -290,9 +295,10 @@ class Connection:
self
.
dispatch
(
'
SUBSCRIBE
'
,
(
who
,
status
))
elif
ptype
==
'
subscribed
'
:
jid
=
prs
.
getFrom
()
self
.
dispatch
(
'
SUBSCRIBED
'
,
(
jid
.
getStripped
().
encode
(
'
utf8
'
),
jid
.
getResource
().
encode
(
'
utf8
'
)))
self
.
dispatch
(
'
UPDUSER
'
,
(
jid
.
getStripped
().
encode
(
'
utf8
'
),
jid
.
getNode
(),
\
[
'
General
'
]))
self
.
dispatch
(
'
SUBSCRIBED
'
,
(
jid
.
getStripped
().
encode
(
'
utf8
'
),
jid
.
getResource
().
encode
(
'
utf8
'
)))
self
.
dispatch
(
'
UPDUSER
'
,
(
jid
.
getStripped
().
encode
(
'
utf8
'
),
jid
.
getNode
(),
[
'
General
'
]))
#BE CAREFUL : no con.updateRosterItem() in a callback
gajim
.
log
.
debug
(
'
we are now subscribed to %s
'
%
who
)
elif
ptype
==
'
unsubscribe
'
:
...
...
@@ -401,7 +407,7 @@ class Connection:
gajim
.
log
.
debug
(
'
DiscoverInfoErrorCB
'
)
iq
=
common
.
xmpp
.
Iq
(
to
=
iq_obj
.
getFrom
(),
typ
=
'
get
'
,
queryNS
=
\
common
.
xmpp
.
NS_AGENTS
)
con
.
send
(
iq
)
self
.
to_be_sent
.
insert
(
0
,
iq
)
def
_DiscoverInfoCB
(
self
,
con
,
iq_obj
):
gajim
.
log
.
debug
(
'
DiscoverInfoCB
'
)
...
...
@@ -426,7 +432,7 @@ class Connection:
features
.
append
(
i
.
getAttr
(
'
var
'
))
jid
=
str
(
iq_obj
.
getFrom
())
if
not
identities
:
self
.
connection
.
send
(
common
.
xmpp
.
Iq
(
typ
=
'
get
'
,
queryNS
=
\
self
.
to_be_sent
.
insert
(
0
,
common
.
xmpp
.
Iq
(
typ
=
'
get
'
,
queryNS
=
\
common
.
xmpp
.
NS_AGENTS
))
else
:
self
.
dispatch
(
'
AGENT_INFO_INFO
'
,
(
jid
,
node
,
identities
,
features
))
...
...
@@ -441,7 +447,7 @@ class Connection:
send_os
=
gajim
.
config
.
get
(
'
send_os_info
'
)
if
send_os
:
qp
.
setTagData
(
'
os
'
,
get_os_info
())
con
.
send
(
iq_obj
)
self
.
to_be_sent
.
insert
(
0
,
iq_obj
)
raise
common
.
xmpp
.
NodeProcessed
def
_VersionResultCB
(
self
,
con
,
iq_obj
):
...
...
@@ -540,11 +546,12 @@ class Connection:
for
i
in
roster
.
keys
():
props
=
roster
[
i
]
if
props
.
has_key
(
'
name
'
)
and
props
[
'
name
'
]:
props
[
'
name
'
]
=
props
[
'
name
'
].
encode
(
'
utf8
'
)
props
[
'
name
'
]
=
props
[
'
name
'
].
encode
(
'
utf8
'
)
if
props
.
has_key
(
'
groups
'
)
and
props
[
'
groups
'
]:
props
[
'
groups
'
]
=
map
(
lambda
e
:
e
.
encode
(
'
utf8
'
),
props
[
'
groups
'
])
props
[
'
groups
'
]
=
map
(
lambda
e
:
e
.
encode
(
'
utf8
'
),
props
[
'
groups
'
])
if
props
.
has_key
(
'
resources
'
)
and
props
[
'
resources
'
]:
props
[
'
resources
'
]
=
map
(
lambda
e
:
e
.
encode
(
'
utf8
'
),
props
[
'
resources
'
])
props
[
'
resources
'
]
=
map
(
lambda
e
:
e
.
encode
(
'
utf8
'
),
props
[
'
resources
'
])
del
roster
[
i
]
roster
[
i
.
encode
(
'
utf8
'
)]
=
props
...
...
@@ -706,7 +713,8 @@ class Connection:
gajim
.
log
.
debug
(
"
Couldn
'
t authenticate to %s
"
%
self
.
name
)
self
.
connected
=
0
self
.
dispatch
(
'
STATUS
'
,
'
offline
'
)
self
.
dispatch
(
'
ERROR
'
,
(
_
(
'
Authentication failed with
"
%s
"'
)
%
self
.
name
,
self
.
dispatch
(
'
ERROR
'
,
(
_
(
'
Authentication failed with
"
%s
"'
)
%
\
self
.
name
,
_
(
'
Please check your login and password for correctness.
'
)))
return
None
# END connect
...
...
@@ -749,7 +757,8 @@ class Connection:
signed
=
''
keyID
=
gajim
.
config
.
get_per
(
'
accounts
'
,
self
.
name
,
'
keyid
'
)
if
keyID
and
USE_GPG
:
if
self
.
connected
<
2
and
self
.
gpg
.
passphrase
==
None
:
# We didn't set a passphrase
if
self
.
connected
<
2
and
self
.
gpg
.
passphrase
==
None
:
# We didn't set a passphrase
self
.
dispatch
(
'
ERROR
'
,
(
_
(
'
OpenPGP Key was not given
'
),
_
(
'
You will be connected to %s without OpenPGP.
'
)
%
self
.
name
))
else
:
...
...
@@ -828,7 +837,7 @@ class Connection:
msg_iq
=
common
.
xmpp
.
Message
(
to
=
jid
,
body
=
msgtxt
,
typ
=
'
chat
'
)
if
msgenc
:
msg_iq
.
setTag
(
common
.
xmpp
.
NS_ENCRYPTED
+
'
x
'
).
setData
(
msgenc
)
self
.
connection
.
send
(
msg_iq
)
self
.
to_be_sent
.
insert
(
0
,
msg_iq
)
gajim
.
logger
.
write
(
'
outgoing
'
,
msg
,
jid
)
self
.
dispatch
(
'
MSGSENT
'
,
(
jid
,
msg
,
keyID
))
...
...
@@ -840,17 +849,17 @@ class Connection:
if
not
msg
:
msg
=
_
(
'
I would like to add you to my roster.
'
)
pres
.
setStatus
(
msg
)
self
.
connection
.
send
(
pres
)
self
.
to_be_sent
.
insert
(
0
,
pres
)
def
send_authorization
(
self
,
jid
):
if
not
self
.
connection
:
return
self
.
connection
.
send
(
common
.
xmpp
.
Presence
(
jid
,
'
subscribed
'
))
self
.
to_be_sent
.
insert
(
0
,
common
.
xmpp
.
Presence
(
jid
,
'
subscribed
'
))
def
refuse_authorization
(
self
,
jid
):
if
not
self
.
connection
:
return
self
.
connection
.
send
(
common
.
xmpp
.
Presence
(
jid
,
'
unsubscribed
'
))
self
.
to_be_sent
.
insert
(
0
,
common
.
xmpp
.
Presence
(
jid
,
'
unsubscribed
'
))
def
unsubscribe
(
self
,
jid
):
if
not
self
.
connection
:
...
...
@@ -882,7 +891,7 @@ class Connection:
def
request_agents
(
self
,
jid
,
node
):
if
self
.
connection
:
self
.
connection
.
send
(
common
.
xmpp
.
Iq
(
to
=
jid
,
typ
=
'
get
'
,
self
.
to_be_sent
.
insert
(
0
,
common
.
xmpp
.
Iq
(
to
=
jid
,
typ
=
'
get
'
,
queryNS
=
common
.
xmpp
.
NS_BROWSE
))
self
.
discoverInfo
(
jid
,
node
)
...
...
@@ -960,7 +969,7 @@ class Connection:
return
iq
=
common
.
xmpp
.
Iq
(
to
=
jid
+
'
/
'
+
resource
,
typ
=
'
get
'
,
queryNS
=
\
common
.
xmpp
.
NS_VERSION
)
self
.
connection
.
send
(
iq
)
self
.
to_be_sent
.
insert
(
0
,
iq
)
def
request_vcard
(
self
,
jid
=
None
):
'''
request the VCARD and return the iq
'''
...
...
@@ -970,7 +979,7 @@ class Connection:
if
jid
:
iq
.
setTo
(
jid
)
iq
.
setTag
(
common
.
xmpp
.
NS_VCARD
+
'
vCard
'
)
self
.
connection
.
send
(
iq
)
self
.
to_be_sent
.
insert
(
0
,
iq
)
return
iq
#('VCARD', {entry1: data, entry2: {entry21: data, ...}, ...})
...
...
@@ -993,7 +1002,7 @@ class Connection:
iq3
.
addChild
(
k
).
setData
(
j
[
k
])
else
:
iq2
.
addChild
(
i
).
setData
(
vcard
[
i
])
self
.
connection
.
send
(
iq
)
self
.
to_be_sent
.
insert
(
0
,
iq
)
def
get_settings
(
self
):
'''
Get Gajim settings as described in JEP 0049
'''
...
...
@@ -1002,7 +1011,7 @@ class Connection:
iq
=
common
.
xmpp
.
Iq
(
typ
=
'
get
'
)
iq2
=
iq
.
addChild
(
name
=
'
query
'
,
namespace
=
'
jabber:iq:private
'
)
iq3
=
iq2
.
addChild
(
name
=
'
gajim
'
,
namespace
=
'
gajim:prefs
'
)
self
.
connection
.
send
(
iq
)
self
.
to_be_sent
.
insert
(
0
,
iq
)
def
get_bookmarks
(
self
):
'''
Get Bookmarks from storage as described in JEP 0048
'''
...
...
@@ -1012,7 +1021,7 @@ class Connection:
iq
=
common
.
xmpp
.
Iq
(
typ
=
'
get
'
)
iq2
=
iq
.
addChild
(
name
=
"
query
"
,
namespace
=
"
jabber:iq:private
"
)
iq3
=
iq2
.
addChild
(
name
=
"
storage
"
,
namespace
=
"
storage:bookmarks
"
)
self
.
connection
.
send
(
iq
)
self
.
to_be_sent
.
insert
(
0
,
iq
)
def
store_bookmarks
(
self
):
'''
Send bookmarks to the storage namespace
'''
...
...
@@ -1028,14 +1037,13 @@ class Connection:
iq4
.
setAttr
(
'
name
'
,
bm
[
'
name
'
])
iq5
=
iq4
.
setTagData
(
'
nick
'
,
bm
[
'
nick
'
])
iq5
=
iq4
.
setTagData
(
'
password
'
,
bm
[
'
password
'
])
self
.
connection
.
send
(
iq
)
self
.
to_be_sent
.
insert
(
0
,
iq
)
def
send_agent_status
(
self
,
agent
,
ptype
):
if
not
self
.
connection
:
return
p
=
common
.
xmpp
.
Presence
(
to
=
agent
,
typ
=
ptype
)
self
.
connection
.
send
(
p
)
self
.
to_be_sent
.
insert
(
0
,
p
)
def
join_gc
(
self
,
nick
,
room
,
server
,
password
):
if
not
self
.
connection
:
...
...
@@ -1049,30 +1057,30 @@ class Connection:
t
=
p
.
setTag
(
common
.
xmpp
.
NS_MUC
+
'
x
'
)
if
password
:
t
.
setTagData
(
'
password
'
,
password
)
self
.
connection
.
send
(
p
)
self
.
to_be_sent
.
insert
(
0
,
p
)
def
send_gc_message
(
self
,
jid
,
msg
):
if
not
self
.
connection
:
return
msg_iq
=
common
.
xmpp
.
Message
(
jid
,
msg
,
typ
=
'
groupchat
'
)
self
.
connection
.
send
(
msg_iq
)
self
.
to_be_sent
.
insert
(
0
,
msg_iq
)
self
.
dispatch
(
'
MSGSENT
'
,
(
jid
,
msg
))
def
send_gc_subject
(
self
,
jid
,
subject
):
if
not
self
.
connection
:
return
msg_iq
=
common
.
xmpp
.
Message
(
jid
,
typ
=
'
groupchat
'
,
subject
=
subject
)
self
.
connection
.
send
(
msg_iq
)
self
.
to_be_sent
.
insert
(
0
,
msg_iq
)
def
request_gc_config
(
self
,
room_jid
):
iq
=
common
.
xmpp
.
Iq
(
typ
=
'
get
'
,
queryNS
=
common
.
xmpp
.
NS_MUC_OWNER
,
to
=
room_jid
)
self
.
connection
.
send
(
iq
)
self
.
to_be_sent
.
insert
(
0
,
iq
)
def
change_gc_nick
(
self
,
room_jid
,
nick
):
if
not
self
.
connection
:
return
self
.
connection
.
send
(
common
.
xmpp
.
Presence
(
to
=
'
%s/%s
'
%
(
room_jid
,
self
.
to_be_sent
.
insert
(
0
,
common
.
xmpp
.
Presence
(
to
=
'
%s/%s
'
%
(
room_jid
,
nick
)))
def
send_gc_status
(
self
,
nick
,
jid
,
show
,
status
):
...
...
@@ -1084,7 +1092,7 @@ class Connection:
show
=
None
if
show
==
'
online
'
:
show
=
None
self
.
connection
.
send
(
common
.
xmpp
.
Presence
(
to
=
'
%s/%s
'
%
(
jid
,
nick
),
self
.
to_be_sent
.
insert
(
0
,
common
.
xmpp
.
Presence
(
to
=
'
%s/%s
'
%
(
jid
,
nick
),
typ
=
ptype
,
show
=
show
,
status
=
status
))
def
gc_set_role
(
self
,
room_jid
,
nick
,
role
):
...
...
@@ -1095,7 +1103,7 @@ class Connection:
item
=
iq
.
getTag
(
'
query
'
).
setTag
(
'
item
'
)
item
.
setAttr
(
'
nick
'
,
nick
)
item
.
setAttr
(
'
role
'
,
role
)
self
.
connection
.
send
(
iq
)
self
.
to_be_sent
.
insert
(
0
,
iq
)
def
gc_set_affiliation
(
self
,
room_jid
,
jid
,
affiliation
):
if
not
self
.
connection
:
...
...
@@ -1105,7 +1113,7 @@ class Connection:
item
=
iq
.
getTag
(
'
query
'
).
setTag
(
'
item
'
)
item
.
setAttr
(
'
jid
'
,
jid
)
item
.
setAttr
(
'
affiliation
'
,
affiliation
)
self
.
connection
.
send
(
iq
)
self
.
to_be_sent
.
insert
(
0
,
iq
)
def
send_gc_config
(
self
,
room_jid
,
config
):
iq
=
common
.
xmpp
.
Iq
(
typ
=
'
set
'
,
to
=
room_jid
,
queryNS
=
\
...
...
@@ -1132,7 +1140,7 @@ class Connection:
val
=
'
1
'
tag
.
setTagData
(
'
value
'
,
val
)
i
+=
1
self
.
connection
.
send
(
iq
)
self
.
to_be_sent
.
insert
(
0
,
iq
)
def
gpg_passphrase
(
self
,
passphrase
):
if
USE_GPG
:
...
...
@@ -1158,7 +1166,7 @@ class Connection:
q
=
iq
.
setTag
(
common
.
xmpp
.
NS_REGISTER
+
'
query
'
)
q
.
setTagData
(
'
username
'
,
username
)
q
.
setTagData
(
'
password
'
,
password
)
self
.
connection
.
send
(
iq
)
self
.
to_be_sent
.
insert
(
0
,
iq
)
def
unregister_account
(
self
):
if
self
.
connected
==
0
:
...
...
@@ -1167,33 +1175,47 @@ class Connection:
hostname
=
gajim
.
config
.
get_per
(
'
accounts
'
,
self
.
name
,
'
hostname
'
)
iq
=
common
.
xmpp
.
Iq
(
typ
=
'
set
'
,
to
=
hostname
)
q
=
iq
.
setTag
(
common
.
xmpp
.
NS_REGISTER
+
'
query
'
).
setTag
(
'
remove
'
)
self
.
connection
.
send
(
iq
)
self
.
to_be_sent
.
insert
(
0
,
iq
)
def
send_keepalive
(
self
):
# we received nothing for the last foo seconds (60 secs by default)
hostname
=
gajim
.
config
.
get_per
(
'
accounts
'
,
self
.
name
,
'
hostname
'
)
iq
=
common
.
xmpp
.
Iq
(
'
get
'
,
common
.
xmpp
.
NS_LAST
,
to
=
hostname
)
self
.
connection
.
send
(
iq
)
self
.
to_be_sent
.
insert
(
0
,
iq
)
self
.
keep_alive_sent
=
True
def
process
(
self
,
timeout
):
if
not
self
.
connection
:
return
if
self
.
connected
:
now
=
time
.
time
()
l
=
[]
for
t
in
self
.
last_sent
:
if
(
now
-
t
)
<
1
:
l
.
append
(
t
)
self
.
last_sent
=
l
t_limit
=
time
.
time
()
+
timeout
while
time
.
time
()
<
t_limit
and
len
(
self
.
to_be_sent
)
and
\
len
(
self
.
last_sent
)
<
gajim
.
config
.
get_per
(
'
accounts
'
,
self
.
name
,
'
max_stanza_per_sec
'
):
self
.
connection
.
send
(
self
.
to_be_sent
.
pop
())
self
.
last_sent
.
append
(
time
.
time
())
try
:
if
gajim
.
config
.
get_per
(
'
accounts
'
,
self
.
name
,
'
keep_alives_enabled
'
):
# do we want keepalives?
keep_alive_every_foo_secs
=
gajim
.
config
.
get_per
(
'
accounts
'
,
self
.
name
,
'
keep_alive_every_foo_secs
'
)
if
time
.
time
()
>
(
self
.
last_incoming
+
keep_alive_every_foo_secs
)
\
and
not
self
.
keep_alive_sent
:
#should we send keepalive?
#should we send keepalive?
if
time
.
time
()
>
(
self
.
last_incoming
+
\
keep_alive_every_foo_secs
)
and
not
self
.
keep_alive_sent
:
self
.
send_keepalive
()
# did the server reply to the keepalive? if no disconnect
keep_alive_disconnect_secs
=
gajim
.
config
.
get_per
(
'
accounts
'
,
self
.
name
,
'
keep_alive_disconnect_secs
'
)
# 2 mins by default
if
time
.
time
()
>
(
self
.
last_incoming
+
keep_alive_disconnect_secs
):
if
time
.
time
()
>
(
self
.
last_incoming
+
\
keep_alive_disconnect_secs
):
self
.
connection
.
disconnect
()
# disconnect if no answer
msg
=
'
%s seconds have passed and server did not reply to our keepalive. Gajim disconnected from %s
'
%
(
str
(
keep_alive_disconnect_secs
),
self
.
name
)
gajim
.
log
.
debug
(
msg
)
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment