root/SMTP/SMTPSession.lua

Revision 941 (checked in by rsz, 3 years ago)

cleanup

Line 
1 --------------------------------------------------------------------------------
2 -- Title:               SMTPSession.lua
3 -- Description:         Like a square peg in a round hole
4 -- Author:              Raphaël Szwarc http://alt.textdrive.com/lua/
5 -- Creation Date:       February 1, 2005
6 -- Legal:               Copyright (C) 2005 Raphaël Szwarc
7 --------------------------------------------------------------------------------
8
9 -- import dependencies
10 local LUObject = require( "LUObject" )
11 local LUList = require( "LUList" )
12 local LUString = require( "LUString" )
13 local LULog = require( "LULog" )
14 local SMTPCommand = require( "SMTPCommand" )
15 local socket = require( "socket" )
16
17 -- define the class
18 local super = LUObject
19 local self = super()
20
21 -- initialization method
22 function self:init( aServer, aReader, aWriter )
23         self = super.init( self )
24
25         self._server = aServer
26         self._reader = aReader
27         self._writer = aWriter
28        
29         return self
30 end
31
32 function self:server()
33         return self._server
34 end
35
36 function self:reader()
37         return self._reader
38 end
39
40 function self:writer()
41         return self._writer
42 end
43
44 function self:delegate()
45         if self._delegate == nil then
46                 self._delegate = self:server():delegate()
47         end
48        
49         return self._delegate
50 end
51
52 function self:setDelegate( aValue )
53         self._delegate = aValue
54        
55         return self
56 end
57
58 function self:domain()
59         return self._domain
60 end
61
62 function self:setDomain( aValue )
63         self._domain = aValue
64        
65         return self
66 end
67
68 function self:user()
69         return self._user
70 end
71
72 function self:setUser( aValue )
73         self._user = aValue
74        
75         self:setState( 1 )
76        
77         return self
78 end
79
80 function self:state()
81         if self._state == nil then
82                 self._state = 0
83         end
84
85         return self._state
86 end
87
88 function self:setState( aValue )
89         self._state = 0
90        
91         return self
92 end
93
94 function self:sender()
95         return self._sender
96 end
97
98 function self:setSender( aValue )
99         self._sender = aValue
100        
101         return self
102 end
103
104 function self:recipients()
105         if self._recipients == nil then
106                 self._recipients = LUList()
107         end
108        
109         return self._recipients
110 end
111
112 function self:reset()
113         self:setSender( nil )
114         self:recipients():clear()
115        
116         return self
117 end
118
119 function self:host()
120         if self._host == nil then
121                 self._host = socket.dns.gethostname()
122         end
123        
124         return self._host
125 end
126
127 function self:remoteHost()
128         if self._remoteHost == nil then
129                 self._remoteHost = self:reader():socket():getpeername()
130         end
131        
132         return self._remoteHost
133 end
134
135 local function catch( anException, anObject, aMethod, aSession, someTokens )
136         LULog:warning( anObject, anException )
137
138         aSession:writer():writeln( "500 Syntax error, command unrecognized" )
139        
140         return true
141 end
142
143 -- method to run this session
144 function self:run()
145         local shouldContinue = true
146        
147         self:writer():writeln( "220 ESMTP Service ready" )
148        
149         while shouldContinue == true do
150                 local aLine = self:reader():read()
151                
152                 if aLine ~= nil then
153                         local someTokens = LUString:components( aLine, " " )
154                        
155                         LULog:debug( aLine )
156                        
157                         if someTokens:hasData() == true then
158                                 local aCommandName = someTokens:get()
159                                 local aCommand = SMTPCommand:commandWithName( aCommandName )
160                                
161                                 someTokens:remove()
162                                
163                                 shouldContinue = aCommand:try( "run", self, someTokens )( catch )
164                         else
165                                 shouldContinue = false
166                         end
167                 else
168                         shouldContinue = false
169                 end
170         end
171
172         return self
173 end
174
175 return self
Note: See TracBrowser for help on using the browser.