author | Myhailo Danylenko <isbear@ukrpost.net> |
Sat, 30 Jul 2016 05:04:35 +0300 | |
changeset 153 | 8fba61f363a8 |
parent 68 | 742878c74b8e |
permissions | -rw-r--r-- |
41
9e39fd8a20df
Updated to library module ibb
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
1 |
|
68
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
2 |
local lm = require 'lm' |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
3 |
local ibb = require 'lm.ibb' |
41
9e39fd8a20df
Updated to library module ibb
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
4 |
|
68
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
5 |
local mc_incoming_files = { } |
66 | 6 |
|
68
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
7 |
ibb.handler ( |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
8 |
function ( from, accept, reject ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
9 |
local fid = #mc_incoming_files + 1 |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
10 |
mc_incoming_files[fid] = { |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
11 |
from = from, |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
12 |
accept = |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
13 |
function ( name ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
14 |
mc_incoming_files[fid].name = name |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
15 |
accept ( |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
16 |
function ( data ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
17 |
local h = io.open ( mc_incoming_files[fid].name, 'w' ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
18 |
if not h then |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
19 |
print ( 'Cannot open output file: ' .. mc_incoming_files[fid].name ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
20 |
return |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
21 |
end |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
22 |
h:write ( data ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
23 |
h:close () |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
24 |
print ( 'Stream ' .. fid .. ' successfully saved to ' .. mc_incoming_files[fid].name ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
25 |
mc_incoming_files[fid] = nil |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
26 |
end, |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
27 |
function ( mesg ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
28 |
main.print_info ( from, 'Stream error: ' .. mesg ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
29 |
mc_incoming_files[fid] = nil -- XXX |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
30 |
end ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
31 |
end, |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
32 |
reject = |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
33 |
function () |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
34 |
reject () |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
35 |
print ( 'Stream ' .. fid .. ' rejected' ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
36 |
mc_incoming_files[fid] = nil |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
37 |
end, |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
38 |
} |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
39 |
main.print_info ( from, from .. ' wants you to receive stream. Use /ibb [accept|reject] ' .. fid .. ' to process his request.' ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
40 |
end ) |
66 | 41 |
|
68
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
42 |
local ibb_sid = 0 |
41
9e39fd8a20df
Updated to library module ibb
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
43 |
|
68
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
44 |
main.command ( 'ibb', |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
45 |
function ( args ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
46 |
local action = args[1] |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
47 |
if action == 'send' then |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
48 |
local who |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
49 |
if args.t then |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
50 |
who = args.t |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
51 |
else |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
52 |
who = main.full_jid () |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
53 |
end |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
54 |
local fname = args[2] |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
55 |
local conn = lm.connection.bless ( main.connection () ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
56 |
local sid = ibb_sid |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
57 |
ibb_sid = ibb_sid + 1 |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
58 |
local stream = ibb.new ( conn, who, 4096, sid ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
59 |
stream:open ( |
64
bf7521ed96eb
Rewrite of ibb in object style
Myhailo Danylenko <isbear@ukrpost.net>
parents:
51
diff
changeset
|
60 |
function () |
68
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
61 |
main.print_info ( who, 'Stream accepted' ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
62 |
local noerr = true |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
63 |
local h = io.open ( fname, 'r' ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
64 |
if not h then |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
65 |
print ( 'Cannot open file ' .. fname ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
66 |
return |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
67 |
end |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
68 |
local data = h:read ( '*a' ) -- In fact, it is better to read it in chunks :/ |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
69 |
h:close () |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
70 |
local fail = |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
71 |
function ( mesg ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
72 |
noerr = false |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
73 |
main.print_info ( who, 'Stream error: ' .. mesg ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
74 |
end |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
75 |
stream:send ( data, |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
76 |
function ( seq ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
77 |
main.print_info ( who, 'Delivery notification of chunk #' .. seq ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
78 |
end, fail ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
79 |
if noerr then |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
80 |
stream:close ( |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
81 |
function () |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
82 |
main.print_info ( who, 'Stream finalizing notification' ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
83 |
end, fail ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
84 |
end |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
85 |
if noerr then |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
86 |
main.print_info ( who, 'Stream sent' ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
87 |
else |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
88 |
main.print_info ( who, 'Stream error occured' ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
89 |
end |
64
bf7521ed96eb
Rewrite of ibb in object style
Myhailo Danylenko <isbear@ukrpost.net>
parents:
51
diff
changeset
|
90 |
end, |
bf7521ed96eb
Rewrite of ibb in object style
Myhailo Danylenko <isbear@ukrpost.net>
parents:
51
diff
changeset
|
91 |
function ( mesg ) |
68
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
92 |
main.print_info ( who, 'Stream initiation error: ' .. mesg ) |
41
9e39fd8a20df
Updated to library module ibb
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
93 |
end ) |
68
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
94 |
elseif action == 'accept' then |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
95 |
local id = tonumber(args[2]) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
96 |
if mc_incoming_files[id] then |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
97 |
mc_incoming_files[id].accept ( args[3] ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
98 |
end |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
99 |
elseif action == 'reject' then |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
100 |
local id = tonumber(args[2]) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
101 |
if mc_incoming_files[id] then |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
102 |
mc_incoming_files[id].reject () |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
103 |
end |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
104 |
else |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
105 |
local text = '' |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
106 |
for sid, data in pairs ( mc_incoming_files ) do |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
107 |
text = text .. '\n' .. sid .. ': ' .. data.from .. ' --> ' .. ( data.name or '?' ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
108 |
end |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
109 |
if text ~= '' then |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
110 |
print ( 'List of incoming streams:' .. text ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
111 |
else |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
112 |
print ( 'No streams' ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
113 |
end |
64
bf7521ed96eb
Rewrite of ibb in object style
Myhailo Danylenko <isbear@ukrpost.net>
parents:
51
diff
changeset
|
114 |
end |
68
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
115 |
end, true, { "send", "accept", "reject" } ) |
64
bf7521ed96eb
Rewrite of ibb in object style
Myhailo Danylenko <isbear@ukrpost.net>
parents:
51
diff
changeset
|
116 |
|
68
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
117 |
|
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
118 |
commands_help['ibb'] = "[[-t target_jid] send filename | accept sid filename | reject sid]\n\nRequests, accepts or rejects sending file via in-band bytestream." |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
119 |
|
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
120 |
local ibb_handler = lm.message_handler.new ( ibb.iq_handler ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
121 |
local ibb_handler_registered = false |
41
9e39fd8a20df
Updated to library module ibb
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
122 |
|
68
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
123 |
hooks_d['hook-post-connect'].ibb = |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
124 |
function ( args ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
125 |
lm.connection.bless( main.connection () ):handler ( ibb_handler, 'iq', 'normal' ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
126 |
ibb_handler_registered = true |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
127 |
hooks_d['hook-post-connect'].ibb = nil |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
128 |
hooks_d['hook-quit'].ibb = |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
129 |
function ( args ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
130 |
if ibb_handler_registered then |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
131 |
lm.connection.bless( main.connection () ):handler ( ibb_handler, 'iq' ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
132 |
end |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
133 |
end |
64
bf7521ed96eb
Rewrite of ibb in object style
Myhailo Danylenko <isbear@ukrpost.net>
parents:
51
diff
changeset
|
134 |
end |
41
9e39fd8a20df
Updated to library module ibb
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
135 |
|
68
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
136 |
main.add_feature ( 'http://jabber.org/protocol/ibb' ) |
41
9e39fd8a20df
Updated to library module ibb
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
137 |
|
9e39fd8a20df
Updated to library module ibb
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
138 |
-- vim: se ts=4: -- |