/src/uk/org/whoami/easyban/datasource/SQLDataSource.java

https://github.com/airguru/EasyBan · Java · 647 lines · 590 code · 42 blank · 15 comment · 80 complexity · 8e8c966452d473fe4b77eff69b1024fa MD5 · raw file

  1. /*
  2. * Copyright 2011 Sebastian Köhler <sebkoehler@whoami.org.uk>.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package uk.org.whoami.easyban.datasource;
  17. import java.net.InetAddress;
  18. import java.net.UnknownHostException;
  19. import java.sql.Connection;
  20. import java.sql.PreparedStatement;
  21. import java.sql.ResultSet;
  22. import java.sql.SQLException;
  23. import java.sql.Statement;
  24. import java.sql.Timestamp;
  25. import java.util.ArrayList;
  26. import java.util.Calendar;
  27. import java.util.HashMap;
  28. import org.hsqldb.types.Types;
  29. import uk.org.whoami.easyban.ConsoleLogger;
  30. import uk.org.whoami.easyban.util.Subnet;
  31. public abstract class SQLDataSource implements DataSource {
  32. protected Connection con;
  33. protected abstract void connect() throws ClassNotFoundException,
  34. SQLException;
  35. protected abstract void setup() throws SQLException;
  36. @Override
  37. public abstract void close();
  38. private synchronized void createNick(String nick) throws SQLException {
  39. PreparedStatement pst = null;
  40. try {
  41. pst = con.prepareStatement("INSERT INTO player (player) VALUES(?);");
  42. pst.setString(1, nick);
  43. pst.executeUpdate();
  44. } catch (SQLException ex) {
  45. if (ex.getErrorCode() != 1062) { //Duplicate nick
  46. throw ex;
  47. }
  48. } finally {
  49. if (pst != null) {
  50. try {
  51. pst.close();
  52. } catch (SQLException ex) {
  53. }
  54. }
  55. }
  56. }
  57. @Override
  58. public synchronized void addIpToHistory(String nick, String ip) {
  59. PreparedStatement pst = null;
  60. try {
  61. createNick(nick);
  62. pst = con.prepareStatement("INSERT INTO ip (player_id,ip) VALUES("
  63. + "(SELECT player_id FROM player WHERE player= ? ),"
  64. + "?"
  65. + ");");
  66. pst.setString(1, nick);
  67. pst.setString(2, ip);
  68. pst.executeUpdate();
  69. } catch (SQLException ex) {
  70. if (ex.getErrorCode() != 1062) { //Duplicate nick
  71. ConsoleLogger.info(ex.getMessage());
  72. }
  73. } finally {
  74. if (pst != null) {
  75. try {
  76. pst.close();
  77. } catch (SQLException ex) {
  78. }
  79. }
  80. }
  81. }
  82. @Override
  83. public synchronized void banNick(String nick, String admin, String reason,
  84. Calendar until) {
  85. PreparedStatement pst = null;
  86. try {
  87. createNick(nick);
  88. pst = con.prepareStatement("INSERT INTO player_ban (player_id,admin,reason,until) VALUES("
  89. + "(SELECT player_id FROM player WHERE player= ? ),"
  90. + "?,"
  91. + "?,"
  92. + "?"
  93. + ");");
  94. pst.setString(1, nick);
  95. pst.setString(2, admin);
  96. if (reason != null) {
  97. pst.setString(3, reason);
  98. } else {
  99. pst.setNull(3, Types.VARCHAR);
  100. }
  101. if (until != null) {
  102. pst.setTimestamp(4, new Timestamp(until.getTimeInMillis()));
  103. } else {
  104. pst.setTimestamp(4, new Timestamp(100000));
  105. }
  106. pst.executeUpdate();
  107. } catch (SQLException ex) {
  108. ConsoleLogger.info(ex.getMessage());
  109. } finally {
  110. if (pst != null) {
  111. try {
  112. pst.close();
  113. } catch (SQLException ex) {
  114. }
  115. }
  116. }
  117. }
  118. @Override
  119. public synchronized void unbanNick(String nick) {
  120. PreparedStatement pst = null;
  121. try {
  122. pst = con.prepareStatement(
  123. "DELETE FROM player_ban WHERE "
  124. + "player_id=(SELECT player_id FROM player WHERE player=?);");
  125. pst.setString(1, nick);
  126. pst.executeUpdate();
  127. } catch (SQLException ex) {
  128. ConsoleLogger.info(ex.getMessage());
  129. } finally {
  130. if (pst != null) {
  131. try {
  132. pst.close();
  133. } catch (SQLException ex) {
  134. }
  135. }
  136. }
  137. }
  138. @Override
  139. public synchronized void banSubnet(Subnet subnet, String admin,
  140. String reason) {
  141. PreparedStatement pst = null;
  142. try {
  143. pst = con.prepareStatement("INSERT INTO subnet_ban (subnet,admin,reason) VALUES("
  144. + "?,"
  145. + "?,"
  146. + "?"
  147. + ");");
  148. pst.setString(1, subnet.toString());
  149. pst.setString(2, admin);
  150. if (reason != null) {
  151. pst.setString(3, reason);
  152. } else {
  153. pst.setNull(3, Types.VARCHAR);
  154. }
  155. pst.executeUpdate();
  156. } catch (SQLException ex) {
  157. ConsoleLogger.info(ex.getMessage());
  158. } finally {
  159. if (pst != null) {
  160. try {
  161. pst.close();
  162. } catch (SQLException ex) {
  163. }
  164. }
  165. }
  166. }
  167. @Override
  168. public synchronized void unbanSubnet(Subnet subnet) {
  169. PreparedStatement pst = null;
  170. try {
  171. pst = con.prepareStatement(
  172. "DELETE FROM subnet_ban WHERE subnet=?;");
  173. pst.setString(1, subnet.toString());
  174. pst.executeUpdate();
  175. } catch (SQLException ex) {
  176. ConsoleLogger.info(ex.getMessage());
  177. } finally {
  178. if (pst != null) {
  179. try {
  180. pst.close();
  181. } catch (SQLException ex) {
  182. }
  183. }
  184. }
  185. }
  186. @Override
  187. public synchronized void banCountry(String code) {
  188. PreparedStatement pst = null;
  189. try {
  190. pst = con.prepareStatement(
  191. "INSERT INTO country_ban (country) VALUES(?);");
  192. pst.setString(1, code);
  193. pst.executeUpdate();
  194. } catch (SQLException ex) {
  195. ConsoleLogger.info(ex.getMessage());
  196. } finally {
  197. if (pst != null) {
  198. try {
  199. pst.close();
  200. } catch (SQLException ex) {
  201. }
  202. }
  203. }
  204. }
  205. @Override
  206. public synchronized void unbanCountry(String code) {
  207. PreparedStatement pst = null;
  208. try {
  209. pst = con.prepareStatement(
  210. "DELETE FROM country_ban WHERE country=?;");
  211. pst.setString(1, code);
  212. pst.executeUpdate();
  213. } catch (SQLException ex) {
  214. ConsoleLogger.info(ex.getMessage());
  215. } finally {
  216. if (pst != null) {
  217. try {
  218. pst.close();
  219. } catch (SQLException ex) {
  220. }
  221. }
  222. }
  223. }
  224. @Override
  225. public synchronized void whitelist(String nick) {
  226. PreparedStatement pst = null;
  227. try {
  228. createNick(nick);
  229. pst = con.prepareStatement("INSERT INTO whitelist (player_id) VALUES("
  230. + "SELECT player_id FROM player WHERE player=?"
  231. + ");");
  232. pst.setString(1, nick);
  233. pst.executeUpdate();
  234. } catch (SQLException ex) {
  235. ConsoleLogger.info(ex.getMessage());
  236. } finally {
  237. if (pst != null) {
  238. try {
  239. pst.close();
  240. } catch (SQLException ex) {
  241. }
  242. }
  243. }
  244. }
  245. @Override
  246. public synchronized void unWhitelist(String nick) {
  247. PreparedStatement pst = null;
  248. try {
  249. pst = con.prepareStatement(
  250. "DELETE FROM whitelist "
  251. + "WHERE player_id=(SELECT player_id FROM player WHERE player=?);");
  252. pst.setString(1, nick);
  253. pst.executeUpdate();
  254. } catch (SQLException ex) {
  255. ConsoleLogger.info(ex.getMessage());
  256. } finally {
  257. if (pst != null) {
  258. try {
  259. pst.close();
  260. } catch (SQLException ex) {
  261. }
  262. }
  263. }
  264. }
  265. @Override
  266. public synchronized boolean isIpBanned(String ip) {
  267. PreparedStatement pst = null;
  268. try {
  269. pst = con.prepareStatement(
  270. "SELECT ip FROM ip "
  271. + "WHERE player_id IN (SELECT player_id FROM player_ban) AND ip=?;");
  272. pst.setString(1, ip);
  273. return pst.executeQuery().next();
  274. } catch (SQLException ex) {
  275. ConsoleLogger.info(ex.getMessage());
  276. return false;
  277. } finally {
  278. if (pst != null) {
  279. try {
  280. pst.close();
  281. } catch (SQLException ex) {
  282. }
  283. }
  284. }
  285. }
  286. @Override
  287. public synchronized boolean isSubnetBanned(String ip) {
  288. Statement st = null;
  289. try {
  290. st = con.createStatement();
  291. ResultSet rs = st.executeQuery("SELECT subnet FROM subnet_ban;");
  292. while (rs.next()) {
  293. try {
  294. Subnet sub = new Subnet(rs.getString(1));
  295. if (sub.isIpInSubnet(InetAddress.getByName(ip))) {
  296. return true;
  297. }
  298. } catch (UnknownHostException ex) {
  299. }
  300. }
  301. return false;
  302. } catch (SQLException ex) {
  303. ConsoleLogger.info(ex.getMessage());
  304. return false;
  305. } finally {
  306. if (st != null) {
  307. try {
  308. st.close();
  309. } catch (SQLException ex) {
  310. }
  311. }
  312. }
  313. }
  314. @Override
  315. public synchronized boolean isNickBanned(String nick) {
  316. PreparedStatement pst = null;
  317. try {
  318. pst = con.prepareStatement(
  319. "SELECT player_id FROM player_ban "
  320. + "WHERE player_id=(SELECT player_id FROM player WHERE player=?);");
  321. pst.setString(1, nick);
  322. return pst.executeQuery().next();
  323. } catch (SQLException ex) {
  324. ConsoleLogger.info(ex.getMessage());
  325. return false;
  326. } finally {
  327. if (pst != null) {
  328. try {
  329. pst.close();
  330. } catch (SQLException ex) {
  331. }
  332. }
  333. }
  334. }
  335. @Override
  336. public synchronized boolean isCountryBanned(String code) {
  337. PreparedStatement pst = null;
  338. try {
  339. pst = con.prepareStatement(
  340. "SELECT country FROM country_ban WHERE country=?;");
  341. pst.setString(1, code);
  342. return pst.executeQuery().next();
  343. } catch (SQLException ex) {
  344. ConsoleLogger.info(ex.getMessage());
  345. return false;
  346. } finally {
  347. if (pst != null) {
  348. try {
  349. pst.close();
  350. } catch (SQLException ex) {
  351. }
  352. }
  353. }
  354. }
  355. @Override
  356. public synchronized boolean isNickWhitelisted(String nick) {
  357. PreparedStatement pst = null;
  358. try {
  359. pst = con.prepareStatement(
  360. "SELECT player_id FROM whitelist "
  361. + "WHERE player_id=(SELECT player_id FROM player WHERE player=?);");
  362. pst.setString(1, nick);
  363. return pst.executeQuery().next();
  364. } catch (SQLException ex) {
  365. ConsoleLogger.info(ex.getMessage());
  366. return false;
  367. } finally {
  368. if (pst != null) {
  369. try {
  370. pst.close();
  371. } catch (SQLException ex) {
  372. }
  373. }
  374. }
  375. }
  376. @Override
  377. public synchronized String[] getHistory(String nick) {
  378. ArrayList<String> list = new ArrayList<String>();
  379. PreparedStatement pst = null;
  380. try {
  381. pst = con.prepareStatement(
  382. "SELECT ip FROM ip "
  383. + "WHERE player_id=(SELECT player_id FROM player WHERE player=?);");
  384. pst.setString(1, nick);
  385. ResultSet rs = pst.executeQuery();
  386. while (rs.next()) {
  387. list.add(rs.getString(1));
  388. }
  389. } catch (SQLException ex) {
  390. ConsoleLogger.info(ex.getMessage());
  391. } finally {
  392. if (pst != null) {
  393. try {
  394. pst.close();
  395. } catch (SQLException ex) {
  396. }
  397. }
  398. }
  399. return list.toArray(new String[0]);
  400. }
  401. @Override
  402. public synchronized String[] getBannedNicks() {
  403. ArrayList<String> list = new ArrayList<String>();
  404. Statement st = null;
  405. try {
  406. st = con.createStatement();
  407. ResultSet rs = st.executeQuery(
  408. "SELECT player FROM player "
  409. + "WHERE player_id IN (SELECT player_id FROM player_ban);");
  410. while (rs.next()) {
  411. list.add(rs.getString(1));
  412. }
  413. } catch (SQLException ex) {
  414. ConsoleLogger.info(ex.getMessage());
  415. } finally {
  416. if (st != null) {
  417. try {
  418. st.close();
  419. } catch (SQLException ex) {
  420. }
  421. }
  422. }
  423. return list.toArray(new String[0]);
  424. }
  425. @Override
  426. public synchronized String[] getBannedSubnets() {
  427. ArrayList<String> list = new ArrayList<String>();
  428. Statement st = null;
  429. try {
  430. st = con.createStatement();
  431. ResultSet rs = st.executeQuery("SELECT subnet FROM subnet_ban;");
  432. while (rs.next()) {
  433. list.add(rs.getString(1));
  434. }
  435. } catch (SQLException ex) {
  436. ConsoleLogger.info(ex.getMessage());
  437. } finally {
  438. if (st != null) {
  439. try {
  440. st.close();
  441. } catch (SQLException ex) {
  442. }
  443. }
  444. }
  445. return list.toArray(new String[0]);
  446. }
  447. @Override
  448. public synchronized String[] getBannedCountries() {
  449. ArrayList<String> list = new ArrayList<String>();
  450. Statement st = null;
  451. try {
  452. st = con.createStatement();
  453. ResultSet rs = st.executeQuery("SELECT country FROM country_ban;");
  454. while (rs.next()) {
  455. list.add(rs.getString(1));
  456. }
  457. } catch (SQLException ex) {
  458. ConsoleLogger.info(ex.getMessage());
  459. } finally {
  460. if (st != null) {
  461. try {
  462. st.close();
  463. } catch (SQLException ex) {
  464. }
  465. }
  466. }
  467. return list.toArray(new String[0]);
  468. }
  469. @Override
  470. public synchronized String[] getWhitelistedNicks() {
  471. ArrayList<String> list = new ArrayList<String>();
  472. Statement st = null;
  473. try {
  474. st = con.createStatement();
  475. ResultSet rs = st.executeQuery(
  476. "SELECT player FROM player "
  477. + "WHERE player_id IN (SELECT player_id FROM whitelist);");
  478. while (rs.next()) {
  479. list.add(rs.getString(1));
  480. }
  481. } catch (SQLException ex) {
  482. ConsoleLogger.info(ex.getMessage());
  483. } finally {
  484. if (st != null) {
  485. try {
  486. st.close();
  487. } catch (SQLException ex) {
  488. }
  489. }
  490. }
  491. return list.toArray(new String[0]);
  492. }
  493. @Override
  494. public synchronized String[] getNicks(String ip) {
  495. ArrayList<String> list = new ArrayList<String>();
  496. PreparedStatement pst = null;
  497. try {
  498. pst = con.prepareStatement(
  499. "SELECT player FROM player "
  500. + "WHERE player_id IN (SELECT player_id FROM ip WHERE ip=?);");
  501. pst.setString(1, ip);
  502. ResultSet rs = pst.executeQuery();
  503. while (rs.next()) {
  504. list.add(rs.getString(1));
  505. }
  506. } catch (SQLException ex) {
  507. ConsoleLogger.info(ex.getMessage());
  508. } finally {
  509. if (pst != null) {
  510. try {
  511. pst.close();
  512. } catch (SQLException ex) {
  513. }
  514. }
  515. }
  516. return list.toArray(new String[0]);
  517. }
  518. @Override
  519. public synchronized HashMap<String, Long> getTempBans() {
  520. HashMap<String, Long> map = new HashMap<String, Long>();
  521. Statement st = null;
  522. try {
  523. st = con.createStatement();
  524. ResultSet rs = st.executeQuery(
  525. "SELECT player,until FROM player_ban "
  526. + "JOIN player ON player_ban.player_id=player.player_id "
  527. + "WHERE until IS NOT NULL;");
  528. while (rs.next()) {
  529. if (rs.getTimestamp(2).getTime() == 100000) {
  530. continue;
  531. }
  532. map.put(rs.getString(1), rs.getTimestamp(2).getTime());
  533. }
  534. } catch (SQLException ex) {
  535. ConsoleLogger.info(ex.getMessage());
  536. } finally {
  537. if (st != null) {
  538. try {
  539. st.close();
  540. } catch (SQLException ex) {
  541. }
  542. }
  543. }
  544. return map;
  545. }
  546. @Override
  547. public synchronized HashMap<String, String> getBanInformation(String nick) {
  548. HashMap<String, String> map = new HashMap<String, String>();
  549. PreparedStatement pst = null;
  550. try {
  551. pst = con.prepareStatement(
  552. "SELECT admin,reason,until FROM player_ban "
  553. + "WHERE player_id=(SELECT player_id FROM player WHERE player=?);");
  554. pst.setString(1, nick);
  555. ResultSet rs = pst.executeQuery();
  556. while (rs.next()) {
  557. map.put("admin", rs.getString(1));
  558. if (rs.getString(2) != null) {
  559. map.put("reason", rs.getString(2));
  560. }
  561. if (rs.getTimestamp(3) != null) {
  562. map.put("until",
  563. String.valueOf(rs.getTimestamp(3).getTime()));
  564. }
  565. }
  566. } catch (SQLException ex) {
  567. ConsoleLogger.info(ex.getMessage());
  568. } finally {
  569. if (pst != null) {
  570. try {
  571. pst.close();
  572. } catch (SQLException ex) {
  573. }
  574. }
  575. }
  576. return map;
  577. }
  578. @Override
  579. public synchronized HashMap<String, String> getBanInformation(Subnet subnet) {
  580. HashMap<String, String> map = new HashMap<String, String>();
  581. PreparedStatement pst = null;
  582. try {
  583. pst = con.prepareStatement(
  584. "SELECT admin,reason FROM subnet_ban WHERE subnet=?;");
  585. pst.setString(1, subnet.toString());
  586. ResultSet rs = pst.executeQuery();
  587. while (rs.next()) {
  588. map.put("admin", rs.getString(1));
  589. if (rs.getString(2) != null) {
  590. map.put("reason", rs.getString(2));
  591. }
  592. }
  593. } catch (SQLException ex) {
  594. ConsoleLogger.info(ex.getMessage());
  595. } finally {
  596. if (pst != null) {
  597. try {
  598. pst.close();
  599. } catch (SQLException ex) {
  600. }
  601. }
  602. }
  603. return map;
  604. }
  605. }