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
Weblate
gajim
Commits
2c1f20b7
Commit
2c1f20b7
authored
14 years ago
by
Yann Leboulanger
Browse files
Options
Downloads
Patches
Plain Diff
use NEC to handle file request (error) events
parent
f6a13970
No related branches found
No related tags found
No related merge requests found
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
src/common/connection_handlers_events.py
+61
-0
61 additions, 0 deletions
src/common/connection_handlers_events.py
src/common/protocol/bytestream.py
+24
-51
24 additions, 51 deletions
src/common/protocol/bytestream.py
src/gui_interface.py
+30
-33
30 additions, 33 deletions
src/gui_interface.py
with
115 additions
and
84 deletions
src/common/connection_handlers_events.py
+
61
−
0
View file @
2c1f20b7
...
...
@@ -1691,3 +1691,64 @@ class AgentInfoErrorReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
self
.
get_jid_resource
()
self
.
get_id
()
return
True
class
FileRequestReceivedEvent
(
nec
.
NetworkIncomingEvent
,
HelperEvent
):
name
=
'
file-request-received
'
base_network_events
=
[]
def
generate
(
self
):
self
.
get_id
()
self
.
fjid
=
self
.
conn
.
_ft_get_from
(
self
.
stanza
)
self
.
jid
=
gajim
.
get_jid_without_resource
(
self
.
fjid
)
self
.
file_props
=
{
'
type
'
:
'
r
'
}
self
.
file_props
[
'
sender
'
]
=
self
.
fjid
self
.
file_props
[
'
request-id
'
]
=
self
.
id_
si
=
self
.
stanza
.
getTag
(
'
si
'
)
profile
=
si
.
getAttr
(
'
profile
'
)
if
profile
!=
xmpp
.
NS_FILE
:
self
.
conn
.
send_file_rejection
(
self
.
file_props
,
code
=
'
400
'
,
typ
=
'
profile
'
)
raise
xmpp
.
NodeProcessed
feature_tag
=
si
.
getTag
(
'
feature
'
,
namespace
=
xmpp
.
NS_FEATURE
)
if
not
feature_tag
:
return
form_tag
=
feature_tag
.
getTag
(
'
x
'
,
namespace
=
xmpp
.
NS_DATA
)
if
not
form_tag
:
return
self
.
dataform
=
dataforms
.
ExtendForm
(
node
=
form_tag
)
for
f
in
self
.
dataform
.
iter_fields
():
if
f
.
var
==
'
stream-method
'
and
f
.
type
==
'
list-single
'
:
values
=
[
o
[
1
]
for
o
in
f
.
options
]
self
.
file_props
[
'
stream-methods
'
]
=
'
'
.
join
(
values
)
if
xmpp
.
NS_BYTESTREAM
in
values
or
xmpp
.
NS_IBB
in
values
:
break
else
:
self
.
conn
.
send_file_rejection
(
self
.
file_props
,
code
=
'
400
'
,
typ
=
'
stream
'
)
raise
xmpp
.
NodeProcessed
file_tag
=
si
.
getTag
(
'
file
'
)
for
attribute
in
file_tag
.
getAttrs
():
if
attribute
in
(
'
name
'
,
'
size
'
,
'
hash
'
,
'
date
'
):
val
=
file_tag
.
getAttr
(
attribute
)
if
val
is
None
:
continue
self
.
file_props
[
attribute
]
=
val
file_desc_tag
=
file_tag
.
getTag
(
'
desc
'
)
if
file_desc_tag
is
not
None
:
self
.
file_props
[
'
desc
'
]
=
file_desc_tag
.
getData
()
mime_type
=
si
.
getAttr
(
'
mime-type
'
)
if
mime_type
is
not
None
:
self
.
file_props
[
'
mime-type
'
]
=
mime_type
self
.
file_props
[
'
receiver
'
]
=
self
.
conn
.
_ft_get_our_jid
()
self
.
file_props
[
'
sid
'
]
=
unicode
(
si
.
getAttr
(
'
id
'
))
self
.
file_props
[
'
transfered_size
'
]
=
[]
return
True
class
FileRequestErrorEvent
(
nec
.
NetworkIncomingEvent
):
name
=
'
file-request-error
'
base_network_events
=
[]
def
generate
(
self
):
self
.
jid
=
gajim
.
get_jid_without_resource
(
self
.
jid
)
return
True
This diff is collapsed.
Click to expand it.
src/common/protocol/bytestream.py
+
24
−
51
View file @
2c1f20b7
...
...
@@ -37,6 +37,8 @@ from common import xmpp
from
common
import
gajim
from
common
import
helpers
from
common
import
dataforms
from
common.connection_handlers_events
import
FileRequestReceivedEvent
from
common
import
ged
from
common.socks5
import
Socks5Receiver
...
...
@@ -79,6 +81,8 @@ class ConnectionBytestream:
def
__init__
(
self
):
self
.
files_props
=
{}
gajim
.
ged
.
register_event_handler
(
'
file-request-received
'
,
ged
.
GUI1
,
self
.
_nec_file_request_received
)
def
_ft_get_our_jid
(
self
):
our_jid
=
gajim
.
get_jid_from_account
(
self
.
name
)
...
...
@@ -212,52 +216,15 @@ class ConnectionBytestream:
raise
xmpp
.
NodeProcessed
def
_siSetCB
(
self
,
con
,
iq_obj
):
jid
=
self
.
_ft_get_from
(
iq_obj
)
file_props
=
{
'
type
'
:
'
r
'
}
file_props
[
'
sender
'
]
=
jid
file_props
[
'
request-id
'
]
=
unicode
(
iq_obj
.
getAttr
(
'
id
'
))
si
=
iq_obj
.
getTag
(
'
si
'
)
profile
=
si
.
getAttr
(
'
profile
'
)
mime_type
=
si
.
getAttr
(
'
mime-type
'
)
if
profile
!=
xmpp
.
NS_FILE
:
self
.
send_file_rejection
(
file_props
,
code
=
'
400
'
,
typ
=
'
profile
'
)
raise
xmpp
.
NodeProcessed
feature_tag
=
si
.
getTag
(
'
feature
'
,
namespace
=
xmpp
.
NS_FEATURE
)
if
not
feature_tag
:
return
form_tag
=
feature_tag
.
getTag
(
'
x
'
,
namespace
=
xmpp
.
NS_DATA
)
if
not
form_tag
:
return
form
=
dataforms
.
ExtendForm
(
node
=
form_tag
)
for
f
in
form
.
iter_fields
():
if
f
.
var
==
'
stream-method
'
and
f
.
type
==
'
list-single
'
:
values
=
[
o
[
1
]
for
o
in
f
.
options
]
file_props
[
'
stream-methods
'
]
=
'
'
.
join
(
values
)
if
xmpp
.
NS_BYTESTREAM
in
values
or
xmpp
.
NS_IBB
in
values
:
break
else
:
self
.
send_file_rejection
(
file_props
,
code
=
'
400
'
,
typ
=
'
stream
'
)
raise
xmpp
.
NodeProcessed
file_tag
=
si
.
getTag
(
'
file
'
)
for
attribute
in
file_tag
.
getAttrs
():
if
attribute
in
(
'
name
'
,
'
size
'
,
'
hash
'
,
'
date
'
):
val
=
file_tag
.
getAttr
(
attribute
)
if
val
is
None
:
continue
file_props
[
attribute
]
=
val
file_desc_tag
=
file_tag
.
getTag
(
'
desc
'
)
if
file_desc_tag
is
not
None
:
file_props
[
'
desc
'
]
=
file_desc_tag
.
getData
()
if
mime_type
is
not
None
:
file_props
[
'
mime-type
'
]
=
mime_type
file_props
[
'
receiver
'
]
=
self
.
_ft_get_our_jid
()
file_props
[
'
sid
'
]
=
unicode
(
si
.
getAttr
(
'
id
'
))
file_props
[
'
transfered_size
'
]
=
[]
gajim
.
socks5queue
.
add_file_props
(
self
.
name
,
file_props
)
self
.
dispatch
(
'
FILE_REQUEST
'
,
(
jid
,
file_props
))
gajim
.
nec
.
push_incoming_event
(
FileRequestReceivedEvent
(
None
,
conn
=
self
,
stanza
=
iq_obj
))
raise
xmpp
.
NodeProcessed
def
_nec_file_request_received
(
self
,
obj
):
if
obj
.
conn
.
name
!=
self
.
name
:
return
gajim
.
socks5queue
.
add_file_props
(
self
.
name
,
obj
.
file_props
)
def
_siErrorCB
(
self
,
con
,
iq_obj
):
si
=
iq_obj
.
getTag
(
'
si
'
)
profile
=
si
.
getAttr
(
'
profile
'
)
...
...
@@ -268,7 +235,8 @@ class ConnectionBytestream:
return
jid
=
self
.
_ft_get_from
(
iq_obj
)
file_props
[
'
error
'
]
=
-
3
self
.
dispatch
(
'
FILE_REQUEST_ERROR
'
,
(
jid
,
file_props
,
''
))
gajim
.
nec
.
push_incoming_event
(
FileRequestErrorEvent
(
None
,
conn
=
self
,
jid
=
jid
,
file_props
=
file_props
,
error_msg
=
''
))
raise
xmpp
.
NodeProcessed
class
ConnectionSocks5Bytestream
(
ConnectionBytestream
):
...
...
@@ -300,7 +268,9 @@ class ConnectionSocks5Bytestream(ConnectionBytestream):
if
contact
.
get_full_jid
()
==
receiver_jid
:
file_props
[
'
error
'
]
=
-
5
self
.
remove_transfer
(
file_props
)
self
.
dispatch
(
'
FILE_REQUEST_ERROR
'
,
(
contact
.
jid
,
file_props
,
''
))
gajim
.
nec
.
push_incoming_event
(
FileRequestErrorEvent
(
None
,
conn
=
self
,
jid
=
contact
.
jid
,
file_props
=
file_props
,
error_msg
=
''
))
sender_jid
=
unicode
(
file_props
[
'
sender
'
])
if
contact
.
get_full_jid
()
==
sender_jid
:
file_props
[
'
error
'
]
=
-
3
...
...
@@ -336,7 +306,7 @@ class ConnectionSocks5Bytestream(ConnectionBytestream):
if
'
idx
'
in
host
and
host
[
'
idx
'
]
>
0
:
gajim
.
socks5queue
.
remove_receiver
(
host
[
'
idx
'
])
gajim
.
socks5queue
.
remove_sender
(
host
[
'
idx
'
])
if
'
direction
'
in
file_props
:
# it's a IBB
sid
=
file_props
[
'
sid
'
]
...
...
@@ -360,7 +330,8 @@ class ConnectionSocks5Bytestream(ConnectionBytestream):
self
.
_result_socks5_sid
,
file_props
[
'
sid
'
])
if
not
listener
:
file_props
[
'
error
'
]
=
-
5
self
.
dispatch
(
'
FILE_REQUEST_ERROR
'
,
(
unicode
(
receiver
),
file_props
,
''
))
gajim
.
nec
.
push_incoming_event
(
FileRequestErrorEvent
(
None
,
conn
=
self
,
jid
=
unicode
(
receiver
),
file_props
=
file_props
,
error_msg
=
''
))
self
.
_connect_error
(
unicode
(
receiver
),
file_props
[
'
sid
'
],
file_props
[
'
sid
'
],
code
=
406
)
else
:
...
...
@@ -490,7 +461,8 @@ class ConnectionSocks5Bytestream(ConnectionBytestream):
if
file_props
is
not
None
:
self
.
disconnect_transfer
(
file_props
)
file_props
[
'
error
'
]
=
-
3
self
.
dispatch
(
'
FILE_REQUEST_ERROR
'
,
(
to
,
file_props
,
msg
))
gajim
.
nec
.
push_incoming_event
(
FileRequestErrorEvent
(
None
,
conn
=
self
,
jid
=
to
,
file_props
=
file_props
,
error_msg
=
msg
))
def
_proxy_auth_ok
(
self
,
proxy
):
"""
...
...
@@ -521,7 +493,8 @@ class ConnectionSocks5Bytestream(ConnectionBytestream):
return
file_props
=
self
.
files_props
[
id_
]
file_props
[
'
error
'
]
=
-
4
self
.
dispatch
(
'
FILE_REQUEST_ERROR
'
,
(
jid
,
file_props
,
''
))
gajim
.
nec
.
push_incoming_event
(
FileRequestErrorEvent
(
None
,
conn
=
self
,
jid
=
jid
,
file_props
=
file_props
,
error_msg
=
''
))
raise
xmpp
.
NodeProcessed
def
_bytestreamSetCB
(
self
,
con
,
iq_obj
):
...
...
@@ -799,7 +772,7 @@ class ConnectionIBBytestream(ConnectionBytestream):
{
'
sid
'
:
sid
})]))
file_props
[
'
completed
'
]
=
True
del
self
.
files_props
[
sid
]
def
IBBMessageHandler
(
self
,
conn
,
stanza
):
"""
Receive next portion of incoming datastream and store it write
...
...
This diff is collapsed.
Click to expand it.
src/gui_interface.py
+
30
−
33
View file @
2c1f20b7
...
...
@@ -166,8 +166,9 @@ class Interface:
file_props
[
'
error
'
]
=
-
3
else
:
file_props
[
'
error
'
]
=
-
4
self
.
handle_event_file_request_error
(
obj
.
conn
.
name
,
(
obj
.
fjid
,
file_props
,
obj
.
errmsg
))
gajim
.
nec
.
push_incoming_event
(
FileRequestErrorEvent
(
None
,
conn
=
self
,
jid
=
obj
.
jid
,
file_props
=
file_props
,
error_msg
=
obj
.
errmsg
))
obj
.
conn
.
disconnect_transfer
(
file_props
)
return
elif
unicode
(
obj
.
errcode
)
==
'
404
'
:
...
...
@@ -819,19 +820,17 @@ class Interface:
notify
.
popup
(
_
(
'
New E-mail
'
),
jid
,
obj
.
conn
.
name
,
'
gmail
'
,
path_to_image
=
path
,
title
=
title
,
text
=
text
)
def
handle_event_file_request_error
(
self
,
account
,
array
):
def
handle_event_file_request_error
(
self
,
obj
):
# ('FILE_REQUEST_ERROR', account, (jid, file_props, error_msg))
jid
,
file_props
,
errmsg
=
array
jid
=
gajim
.
get_jid_without_resource
(
jid
)
ft
=
self
.
instances
[
'
file_transfers
'
]
ft
.
set_status
(
file_props
[
'
type
'
],
file_props
[
'
sid
'
],
'
stop
'
)
errno
=
file_props
[
'
error
'
]
ft
.
set_status
(
obj
.
file_props
[
'
type
'
],
obj
.
file_props
[
'
sid
'
],
'
stop
'
)
errno
=
obj
.
file_props
[
'
error
'
]
if
helpers
.
allow_popup_window
(
account
):
if
helpers
.
allow_popup_window
(
obj
.
conn
.
name
):
if
errno
in
(
-
4
,
-
5
):
ft
.
show_stopped
(
jid
,
file_props
,
err
msg
)
ft
.
show_stopped
(
obj
.
jid
,
obj
.
file_props
,
obj
.
error_
msg
)
else
:
ft
.
show_request_error
(
file_props
)
ft
.
show_request_error
(
obj
.
file_props
)
return
if
errno
in
(
-
4
,
-
5
):
...
...
@@ -839,45 +838,43 @@ class Interface:
else
:
msg_type
=
'
file-request-error
'
self
.
add_event
(
account
,
jid
,
msg_type
,
file_props
)
self
.
add_event
(
obj
.
conn
.
name
,
obj
.
jid
,
msg_type
,
obj
.
file_props
)
if
helpers
.
allow_showing_notification
(
account
):
if
helpers
.
allow_showing_notification
(
obj
.
conn
.
name
):
# check if we should be notified
path
=
gtkgui_helpers
.
get_icon_path
(
'
gajim-ft_error
'
,
48
)
event_type
=
_
(
'
File Transfer Error
'
)
notify
.
popup
(
event_type
,
jid
,
account
,
msg_type
,
path
,
title
=
event_type
,
text
=
file_props
[
'
name
'
])
notify
.
popup
(
event_type
,
obj
.
jid
,
obj
.
conn
.
name
,
msg_type
,
path
,
title
=
event_type
,
text
=
obj
.
file_props
[
'
name
'
])
def
handle_event_file_request
(
self
,
account
,
array
):
jid
=
array
[
0
]
jid
=
gajim
.
get_jid_without_resource
(
jid
)
if
jid
not
in
gajim
.
contacts
.
get_jid_list
(
account
):
def
handle_event_file_request
(
self
,
obj
):
account
=
obj
.
conn
.
name
if
obj
.
jid
not
in
gajim
.
contacts
.
get_jid_list
(
account
):
keyID
=
''
attached_keys
=
gajim
.
config
.
get_per
(
'
accounts
'
,
account
,
'
attached_gpg_keys
'
).
split
()
if
jid
in
attached_keys
:
keyID
=
attached_keys
[
attached_keys
.
index
(
jid
)
+
1
]
contact
=
gajim
.
contacts
.
create_not_in_roster_contact
(
jid
=
jid
,
account
=
account
,
keyID
=
keyID
)
'
attached_gpg_keys
'
).
split
()
if
obj
.
jid
in
attached_keys
:
keyID
=
attached_keys
[
attached_keys
.
index
(
obj
.
jid
)
+
1
]
contact
=
gajim
.
contacts
.
create_not_in_roster_contact
(
jid
=
obj
.
jid
,
account
=
account
,
keyID
=
keyID
)
gajim
.
contacts
.
add_contact
(
account
,
contact
)
self
.
roster
.
add_contact
(
contact
.
jid
,
account
)
file_props
=
array
[
1
]
contact
=
gajim
.
contacts
.
get_first_contact_from_jid
(
account
,
jid
)
self
.
roster
.
add_contact
(
obj
.
jid
,
account
)
contact
=
gajim
.
contacts
.
get_first_contact_from_jid
(
account
,
obj
.
jid
)
if
helpers
.
allow_popup_window
(
account
):
self
.
instances
[
'
file_transfers
'
].
show_file_request
(
account
,
contact
,
file_props
)
obj
.
file_props
)
return
self
.
add_event
(
account
,
jid
,
'
file-request
'
,
file_props
)
self
.
add_event
(
account
,
obj
.
jid
,
'
file-request
'
,
obj
.
file_props
)
if
helpers
.
allow_showing_notification
(
account
):
path
=
gtkgui_helpers
.
get_icon_path
(
'
gajim-ft_request
'
,
48
)
txt
=
_
(
'
%s wants to send you a file.
'
)
%
gajim
.
get_name_from_jid
(
account
,
jid
)
account
,
obj
.
jid
)
event_type
=
_
(
'
File Transfer Request
'
)
notify
.
popup
(
event_type
,
jid
,
account
,
'
file-request
'
,
path_to_image
=
path
,
title
=
event_type
,
text
=
txt
)
notify
.
popup
(
event_type
,
obj
.
jid
,
account
,
'
file-request
'
,
path_to_image
=
path
,
title
=
event_type
,
text
=
txt
)
def
handle_event_file_error
(
self
,
title
,
message
):
dialogs
.
ErrorDialog
(
title
,
message
)
...
...
@@ -1376,14 +1373,14 @@ class Interface:
'
ERROR
'
:
[
self
.
handle_event_error
],
'
DB_ERROR
'
:
[
self
.
handle_event_db_error
],
'
INFORMATION
'
:
[
self
.
handle_event_information
],
'
FILE_REQUEST
'
:
[
self
.
handle_event_file_request
],
'
FILE_REQUEST_ERROR
'
:
[
self
.
handle_event_file_request_error
],
'
FILE_SEND_ERROR
'
:
[
self
.
handle_event_file_send_error
],
'
atom-entry-received
'
:
[
self
.
handle_atom_entry
],
'
bad-gpg-passphrase
'
:
[
self
.
handle_event_bad_gpg_passphrase
],
'
bookmarks-received
'
:
[
self
.
handle_event_bookmarks
],
'
connection-lost
'
:
[
self
.
handle_event_connection_lost
],
'
failed-decrypt
'
:
[(
self
.
handle_event_failed_decrypt
,
ged
.
GUI2
)],
'
file-request-error
'
:
[
self
.
handle_event_file_request_error
],
'
file-request-received
'
:
[
self
.
handle_event_file_request
],
'
fingerprint-error
'
:
[
self
.
handle_event_fingerprint_error
],
'
gc-invitation-received
'
:
[
self
.
handle_event_gc_invitation
],
'
gc-presence-received
'
:
[
self
.
handle_event_gc_presence
],
...
...
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