]> git.somenet.org - irc/pjirc-ng.git/blob - src/main/java/irc/ident/prv/IdentServer.java
Pjirc 2.2.1 as available on the net, reformatted and made it compile.
[irc/pjirc-ng.git] / src / main / java / irc / ident / prv / IdentServer.java
1 /*****************************************************/\r
2 /*          This java file is a part of the          */\r
3 /*                                                   */\r
4 /*           -  Plouf's Java IRC Client  -           */\r
5 /*                                                   */\r
6 /*   Copyright (C)  2002 - 2005 Philippe Detournay   */\r
7 /*                                                   */\r
8 /*         All contacts : theplouf@yahoo.com         */\r
9 /*                                                   */\r
10 /*  PJIRC is free software; you can redistribute     */\r
11 /*  it and/or modify it under the terms of the GNU   */\r
12 /*  General Public License as published by the       */\r
13 /*  Free Software Foundation; version 2 or later of  */\r
14 /*  the License.                                     */\r
15 /*                                                   */\r
16 /*  PJIRC is distributed in the hope that it will    */\r
17 /*  be useful, but WITHOUT ANY WARRANTY; without     */\r
18 /*  even the implied warranty of MERCHANTABILITY or  */\r
19 /*  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU   */\r
20 /*  General Public License for more details.         */\r
21 /*                                                   */\r
22 /*  You should have received a copy of the GNU       */\r
23 /*  General Public License along with PJIRC; if      */\r
24 /*  not, write to the Free Software Foundation,      */\r
25 /*  Inc., 59 Temple Place, Suite 330, Boston,        */\r
26 /*  MA  02111-1307  USA                              */\r
27 /*                                                   */\r
28 /*****************************************************/\r
29 \r
30 package irc.ident.prv;\r
31 \r
32 import irc.IRCConfiguration;\r
33 import irc.IRCObject;\r
34 import irc.IRCTextProvider;\r
35 import irc.ListenerGroup;\r
36 import irc.ident.IdentListener;\r
37 \r
38 import java.io.BufferedReader;\r
39 import java.io.BufferedWriter;\r
40 import java.io.InputStreamReader;\r
41 import java.io.OutputStreamWriter;\r
42 import java.net.ServerSocket;\r
43 import java.net.Socket;\r
44 import java.util.Hashtable;\r
45 \r
46 /**\r
47  * LocalInfo.\r
48  */\r
49 class LocalInfo {\r
50         /**\r
51          * Create a new LocalInfo\r
52          * \r
53          * @param alocalPort\r
54          *          local port.\r
55          * @param asystem\r
56          *          system name.\r
57          * @param aid\r
58          *          user id.\r
59          */\r
60         public LocalInfo(int alocalPort, String asystem, String aid) {\r
61                 localPort = alocalPort;\r
62                 system = asystem;\r
63                 id = aid;\r
64         }\r
65 \r
66         /**\r
67          * Local port.\r
68          */\r
69         public int localPort;\r
70         /**\r
71          * System name.\r
72          */\r
73         public String system;\r
74         /**\r
75          * User id.\r
76          */\r
77         public String id;\r
78 }\r
79 \r
80 /**\r
81  * The built-in pjirc ident server.\r
82  */\r
83 public class IdentServer extends IRCObject implements Runnable {\r
84         private Thread _thread;\r
85         private boolean _running;\r
86         private Hashtable _table;\r
87         private ServerSocket _serverSocket;\r
88         private boolean _defaultUser;\r
89         private String _system;\r
90         private String _id;\r
91         private ListenerGroup _listeners;\r
92         private int _port;\r
93 \r
94         /**\r
95          * Create a new IdentServer.\r
96          * \r
97          * @param config\r
98          *          global irc configuration.\r
99          */\r
100         public IdentServer(IRCConfiguration config) {\r
101                 super(config);\r
102                 resetDefaultUser();\r
103                 _table = new Hashtable();\r
104                 _listeners = new ListenerGroup();\r
105                 _thread = null;\r
106         }\r
107 \r
108         /**\r
109          * Start the ident server.\r
110          * \r
111          * @throws Exception\r
112          */\r
113         public void start() throws Exception {\r
114                 start(113);\r
115         }\r
116 \r
117         /**\r
118          * Erase the default user configuration.\r
119          */\r
120         public void resetDefaultUser() {\r
121                 _defaultUser = false;\r
122         }\r
123 \r
124         /**\r
125          * Set the default user configuration.\r
126          * \r
127          * @param system\r
128          *          user system.\r
129          * @param id\r
130          *          user id.\r
131          */\r
132         public void setDefaultUser(String system, String id) {\r
133                 _defaultUser = true;\r
134                 _system = system;\r
135                 _id = id;\r
136         }\r
137 \r
138         /**\r
139          * Start the ident server on the given port.\r
140          * \r
141          * @param port\r
142          *          ident server port.\r
143          * @throws Exception\r
144          */\r
145         public void start(int port) throws Exception {\r
146                 _port = port;\r
147                 _running = false;\r
148                 _serverSocket = _ircConfiguration.getSecurityProvider().getServerSocket(_port);\r
149                 _thread = new Thread(this, "IDENT server");\r
150                 _thread.start();\r
151                 while (!_running)\r
152                         Thread.yield();\r
153         }\r
154 \r
155         /**\r
156          * Stop the execution of the ident server.\r
157          */\r
158         public void stop() {\r
159                 if (_thread == null)\r
160                         return;\r
161                 try {\r
162                         _serverSocket.close();\r
163                         _thread.join();\r
164                         _thread = null;\r
165                 } catch (Exception e) {\r
166                         // e.printStackTrace();\r
167                 }\r
168         }\r
169 \r
170         /**\r
171          * Register a new local connection.\r
172          * \r
173          * @param localPort\r
174          *          the local port of this connection.\r
175          * @param system\r
176          *          user system on this connection.\r
177          * @param id\r
178          *          user id on this connection.\r
179          */\r
180         public synchronized void registerLocalConnection(int localPort, String system, String id) {\r
181                 _table.put(new Integer(localPort), new LocalInfo(localPort, system, id));\r
182         }\r
183 \r
184         /**\r
185          * Unregister a local connection.\r
186          * \r
187          * @param localPort\r
188          *          local port.\r
189          */\r
190         public synchronized void unregisterLocalConnection(int localPort) {\r
191                 _table.remove(new Integer(localPort));\r
192         }\r
193 \r
194         private synchronized LocalInfo processRequest(int localPort) {\r
195                 return (LocalInfo) _table.get(new Integer(localPort));\r
196         }\r
197 \r
198         /**\r
199          * Add a listener.\r
200          * \r
201          * @param lis\r
202          *          listener to add.\r
203          */\r
204         public synchronized void addIdentListener(IdentListener lis) {\r
205                 _listeners.addListener(lis);\r
206         }\r
207 \r
208         /**\r
209          * Remove a listener.\r
210          * \r
211          * @param lis\r
212          *          listener to remove.\r
213          */\r
214         public synchronized void removeIdentListener(IdentListener lis) {\r
215                 _listeners.removeListener(lis);\r
216         }\r
217 \r
218         @Override\r
219         public void run() {\r
220                 boolean terminated = false;\r
221 \r
222                 _running = true;\r
223                 _listeners.sendEventAsync("identRunning", new Integer(_port));\r
224                 while (!terminated) {\r
225                         try {\r
226                                 Socket s = _serverSocket.accept();\r
227                                 String from = getText(IRCTextProvider.IDENT_UNKNOWN);\r
228                                 int result = IdentListener.IDENT_ERROR;\r
229                                 String reply = getText(IRCTextProvider.IDENT_NONE);\r
230                                 try {\r
231                                         try {\r
232                                                 from = _ircConfiguration.getSecurityProvider().resolve(s.getInetAddress());\r
233                                         } catch (Exception e) {\r
234                                                 from = s.getInetAddress().getHostAddress();\r
235                                         }\r
236                                         BufferedReader reader = new BufferedReader(new InputStreamReader(s.getInputStream()));\r
237                                         BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));\r
238                                         String request = reader.readLine();\r
239                                         int pos = request.indexOf(',');\r
240                                         String serverSide = request.substring(0, pos).trim();\r
241                                         String clientSide = request.substring(pos + 1).trim();\r
242 \r
243                                         LocalInfo info = processRequest(new Integer(serverSide).intValue());\r
244                                         reply = serverSide + " , " + clientSide + " : ";\r
245                                         if (info == null) {\r
246                                                 if (!_defaultUser) {\r
247                                                         result = IdentListener.IDENT_NOT_FOUND;\r
248                                                         reply += "ERROR : NO-USER";\r
249                                                 } else {\r
250                                                         result = IdentListener.IDENT_DEFAULT;\r
251                                                         reply += "USERID : " + _system + " : " + _id;\r
252                                                 }\r
253                                         } else {\r
254                                                 result = IdentListener.IDENT_OK;\r
255                                                 reply += "USERID : " + info.system + " : " + info.id;\r
256                                         }\r
257 \r
258                                         writer.write(reply + "\n");\r
259                                         writer.flush();\r
260                                         reader.close();\r
261                                         writer.close();\r
262                                         s.close();\r
263                                         _listeners.sendEventAsync("identRequested", from, new Integer(result), reply);\r
264 \r
265                                 } catch (Exception e) {\r
266                                         _listeners.sendEventAsync("identRequested", from, new Integer(IdentListener.IDENT_ERROR), e.getMessage());\r
267                                 }\r
268                         } catch (Exception e) {\r
269                                 _listeners.sendEventAsync("identLeaving", e.getMessage());\r
270                                 terminated = true;\r
271                         }\r
272                 }\r
273         }\r
274 \r
275 }\r