aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDiego Nehab <diego@tecgraf.puc-rio.br>2004-06-16 04:28:21 +0000
committerDiego Nehab <diego@tecgraf.puc-rio.br>2004-06-16 04:28:21 +0000
commit0a4c1534f39511894728da193ab8225ad6022de9 (patch)
tree683b711accf64eca486b138cbc034c609f93a53a /src
parent8e80e38f2c3121242b3b2f7a45a960c9af4d1a68 (diff)
downloadluasocket-0a4c1534f39511894728da193ab8225ad6022de9.tar.gz
luasocket-0a4c1534f39511894728da193ab8225ad6022de9.tar.bz2
luasocket-0a4c1534f39511894728da193ab8225ad6022de9.zip
Still work to do in the manual...
Diffstat (limited to 'src')
-rw-r--r--src/ltn12.lua8
-rw-r--r--src/smtp.lua33
2 files changed, 38 insertions, 3 deletions
diff --git a/src/ltn12.lua b/src/ltn12.lua
index bb527bd..09771d4 100644
--- a/src/ltn12.lua
+++ b/src/ltn12.lua
@@ -23,6 +23,7 @@ BLOCKSIZE = 2048
23----------------------------------------------------------------------------- 23-----------------------------------------------------------------------------
24-- returns a high level filter that cycles a low-level filter 24-- returns a high level filter that cycles a low-level filter
25function filter.cycle(low, ctx, extra) 25function filter.cycle(low, ctx, extra)
26 assert(low)
26 return function(chunk) 27 return function(chunk)
27 local ret 28 local ret
28 ret, ctx = low(ctx, chunk, extra) 29 ret, ctx = low(ctx, chunk, extra)
@@ -32,6 +33,7 @@ end
32 33
33-- chains two filters together 34-- chains two filters together
34local function chain2(f1, f2) 35local function chain2(f1, f2)
36 assert(f1 and f2)
35 local co = coroutine.create(function(chunk) 37 local co = coroutine.create(function(chunk)
36 while true do 38 while true do
37 local filtered1 = f1(chunk) 39 local filtered1 = f1(chunk)
@@ -95,6 +97,7 @@ end
95 97
96-- turns a fancy source into a simple source 98-- turns a fancy source into a simple source
97function source.simplify(src) 99function source.simplify(src)
100 assert(src)
98 return function() 101 return function()
99 local chunk, err_or_new = src() 102 local chunk, err_or_new = src()
100 src = err_or_new or src 103 src = err_or_new or src
@@ -118,6 +121,7 @@ end
118 121
119-- creates rewindable source 122-- creates rewindable source
120function source.rewind(src) 123function source.rewind(src)
124 assert(src)
121 local t = {} 125 local t = {}
122 return function(chunk) 126 return function(chunk)
123 if not chunk then 127 if not chunk then
@@ -132,6 +136,7 @@ end
132 136
133-- chains a source with a filter 137-- chains a source with a filter
134function source.chain(src, f) 138function source.chain(src, f)
139 assert(src and f)
135 local co = coroutine.create(function() 140 local co = coroutine.create(function()
136 while true do 141 while true do
137 local chunk, err = src() 142 local chunk, err = src()
@@ -186,6 +191,7 @@ end
186 191
187-- turns a fancy sink into a simple sink 192-- turns a fancy sink into a simple sink
188function sink.simplify(snk) 193function sink.simplify(snk)
194 assert(snk)
189 return function(chunk, err) 195 return function(chunk, err)
190 local ret, err_or_new = snk(chunk, err) 196 local ret, err_or_new = snk(chunk, err)
191 if not ret then return nil, err_or_new end 197 if not ret then return nil, err_or_new end
@@ -224,6 +230,7 @@ end
224 230
225-- chains a sink with a filter 231-- chains a sink with a filter
226function sink.chain(f, snk) 232function sink.chain(f, snk)
233 assert(f and snk)
227 return function(chunk, err) 234 return function(chunk, err)
228 local filtered = f(chunk) 235 local filtered = f(chunk)
229 local done = chunk and "" 236 local done = chunk and ""
@@ -248,6 +255,7 @@ end
248 255
249-- pumps all data from a source to a sink, using a step function 256-- pumps all data from a source to a sink, using a step function
250function pump.all(src, snk, step) 257function pump.all(src, snk, step)
258 assert(src and snk)
251 step = step or pump.step 259 step = step or pump.step
252 while true do 260 while true do
253 local ret, err = step(src, snk) 261 local ret, err = step(src, snk)
diff --git a/src/smtp.lua b/src/smtp.lua
index fb76ea4..2ea6097 100644
--- a/src/smtp.lua
+++ b/src/smtp.lua
@@ -11,6 +11,7 @@
11local smtp = requirelib("smtp", "luaopen_smtp", getfenv(1)) 11local smtp = requirelib("smtp", "luaopen_smtp", getfenv(1))
12local socket = require("socket") 12local socket = require("socket")
13local ltn12 = require("ltn12") 13local ltn12 = require("ltn12")
14local mime = require("mime")
14local tp = require("tp") 15local tp = require("tp")
15 16
16----------------------------------------------------------------------------- 17-----------------------------------------------------------------------------
@@ -43,7 +44,7 @@ local metat = { __index = {} }
43function metat.__index:greet(domain) 44function metat.__index:greet(domain)
44 socket.try(self.tp:check("2..")) 45 socket.try(self.tp:check("2.."))
45 socket.try(self.tp:command("EHLO", domain or DOMAIN)) 46 socket.try(self.tp:command("EHLO", domain or DOMAIN))
46 return socket.try(self.tp:check("2..")) 47 return socket.skip(1, socket.try(self.tp:check("2..")))
47end 48end
48 49
49function metat.__index:mail(from) 50function metat.__index:mail(from)
@@ -73,6 +74,32 @@ function metat.__index:close()
73 return socket.try(self.tp:close()) 74 return socket.try(self.tp:close())
74end 75end
75 76
77function metat.__index:login(user, password)
78 socket.try(self.tp:command("AUTH", "LOGIN"))
79 socket.try(self.tp:check("3.."))
80 socket.try(self.tp:command(mime.b64(user)))
81 socket.try(self.tp:check("3.."))
82 socket.try(self.tp:command(mime.b64(password)))
83 return socket.try(self.tp:check("2.."))
84end
85
86function metat.__index:plain(user, password)
87 local auth = "PLAIN " .. mime.b64("\0" .. user .. "\0" .. password)
88 socket.try(self.tp:command("AUTH", auth))
89 return socket.try(self.tp:check("2.."))
90end
91
92function metat.__index:auth(user, password, ext)
93 if not user or not password then return 1 end
94 if string.find(ext, "AUTH[^\n]+LOGIN") then
95 return self:login(user, password)
96 elseif string.find(ext, "AUTH[^\n]+PLAIN") then
97 return self:plain(user, password)
98 else
99 socket.try(nil, "authentication not supported")
100 end
101end
102
76-- send message or throw an exception 103-- send message or throw an exception
77function metat.__index:send(mailt) 104function metat.__index:send(mailt)
78 self:mail(mailt.from) 105 self:mail(mailt.from)
@@ -205,10 +232,10 @@ end
205--------------------------------------------------------------------------- 232---------------------------------------------------------------------------
206-- High level SMTP API 233-- High level SMTP API
207----------------------------------------------------------------------------- 234-----------------------------------------------------------------------------
208socket.protect = function(a) return a end
209send = socket.protect(function(mailt) 235send = socket.protect(function(mailt)
210 local con = open(mailt.server, mailt.port) 236 local con = open(mailt.server, mailt.port)
211 con:greet(mailt.domain) 237 local ext = con:greet(mailt.domain)
238 con:auth(mailt.user, mailt.password, ext)
212 con:send(mailt) 239 con:send(mailt)
213 con:quit() 240 con:quit()
214 return con:close() 241 return con:close()