franta-hg@26: /** franta-hg@26: * SQL-DK franta-hg@26: * Copyright © 2014 František Kučera (frantovo.cz) franta-hg@26: * franta-hg@26: * This program is free software: you can redistribute it and/or modify franta-hg@26: * it under the terms of the GNU General Public License as published by franta-hg@26: * the Free Software Foundation, either version 3 of the License, or franta-hg@26: * (at your option) any later version. franta-hg@26: * franta-hg@26: * This program is distributed in the hope that it will be useful, franta-hg@26: * but WITHOUT ANY WARRANTY; without even the implied warranty of franta-hg@26: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the franta-hg@26: * GNU General Public License for more details. franta-hg@26: * franta-hg@26: * You should have received a copy of the GNU General Public License franta-hg@26: * along with this program. If not, see . franta-hg@26: */ franta-hg@26: package cz.frantovo.ejabberd.auth; franta-hg@26: franta-hg@26: import java.io.DataInputStream; franta-hg@26: import java.io.DataOutputStream; franta-hg@26: import java.io.FileInputStream; franta-hg@26: import java.io.FileOutputStream; franta-hg@26: import java.io.IOException; franta-hg@26: import java.io.InputStream; franta-hg@26: import java.io.OutputStream; franta-hg@26: import java.io.PrintStream; franta-hg@26: import java.sql.Connection; franta-hg@26: import java.sql.DriverManager; franta-hg@26: import java.sql.PreparedStatement; franta-hg@26: import java.sql.ResultSet; franta-hg@26: import java.sql.SQLException; franta-hg@26: import java.util.Properties; franta-hg@26: franta-hg@26: /** franta-hg@26: * franta-hg@26: * @author Ing. František Kučera (frantovo.cz) franta-hg@26: */ franta-hg@26: public class EJabberdAuth { franta-hg@26: franta-hg@26: public static final String NASTAVENÍ_DB_URL = "db.url"; franta-hg@26: public static final String NASTAVENÍ_DB_JMÉNO = "db.jmeno"; franta-hg@26: public static final String NASTAVENÍ_DB_HESLO = "db.heslo"; franta-hg@26: public static final String NASTAVENÍ_DOMÉNA = "domena"; franta-hg@26: public static final String NASTAVENÍ_LOG = "log"; franta-hg@26: public static final String VÝCHOZÍ_LOG = "/tmp/eJabberd-auth.log"; franta-hg@26: private static final int ANO = 1; franta-hg@26: private static final int NE = 0; franta-hg@26: private final DataInputStream in; franta-hg@26: private final DataOutputStream out; franta-hg@26: private final PrintStream err; franta-hg@26: private final String našeDoména; franta-hg@26: private final String dbUrl; franta-hg@26: private final String dbJméno; franta-hg@26: private final String dbHeslo; franta-hg@26: franta-hg@26: public static void main(String[] args) throws IOException, ChybaZápisuVýsledku, ChybaČteníVstupu { franta-hg@26: franta-hg@26: try (FileInputStream nastaveníFis = new FileInputStream(args[0])) { franta-hg@26: franta-hg@26: Properties nastavení = new Properties(); franta-hg@26: nastavení.load(nastaveníFis); franta-hg@26: franta-hg@26: try (FileOutputStream err = new FileOutputStream(nastavení.getProperty(NASTAVENÍ_LOG, VÝCHOZÍ_LOG))) { franta-hg@26: EJabberdAuth a = new EJabberdAuth(System.in, System.out, err, nastavení); franta-hg@26: a.start(); franta-hg@26: } franta-hg@26: } franta-hg@26: } franta-hg@26: franta-hg@26: public EJabberdAuth(InputStream in, OutputStream out, OutputStream err, Properties nastavení) { franta-hg@26: this.in = new DataInputStream(in); franta-hg@26: this.out = new DataOutputStream(out); franta-hg@26: this.err = new PrintStream(err); franta-hg@26: franta-hg@26: this.našeDoména = nastavení.getProperty(NASTAVENÍ_DOMÉNA); franta-hg@26: this.dbUrl = nastavení.getProperty(NASTAVENÍ_DB_URL); franta-hg@26: this.dbJméno = nastavení.getProperty(NASTAVENÍ_DB_JMÉNO); franta-hg@26: this.dbHeslo = nastavení.getProperty(NASTAVENÍ_DB_HESLO); franta-hg@26: } franta-hg@26: franta-hg@26: public void start() throws ChybaZápisuVýsledku, ChybaČteníVstupu { franta-hg@26: while (true) { franta-hg@26: String text = načtiText(); franta-hg@26: zpracuj(text); franta-hg@26: } franta-hg@26: } franta-hg@26: franta-hg@26: private Connection getDB() throws SQLException { franta-hg@26: return DriverManager.getConnection(dbUrl, dbJméno, dbHeslo); franta-hg@26: } franta-hg@26: franta-hg@26: private String načtiText() throws ChybaČteníVstupu { franta-hg@26: try { franta-hg@26: short délka = in.readShort(); franta-hg@26: byte[] bajty = new byte[délka]; franta-hg@26: in.read(bajty); franta-hg@26: return new String(bajty); franta-hg@26: } catch (Exception e) { franta-hg@26: throw new ChybaČteníVstupu(e); franta-hg@26: } franta-hg@26: } franta-hg@26: franta-hg@26: private void zpracuj(String text) throws ChybaZápisuVýsledku { franta-hg@26: franta-hg@26: String[] prvky = text.split(":"); franta-hg@26: franta-hg@26: final String operace; franta-hg@26: final String uživatel; franta-hg@26: final String doména; franta-hg@26: final String heslo; franta-hg@26: franta-hg@26: if (prvky.length < 3) { franta-hg@26: zapišVýsledek(NE); franta-hg@26: err.println("Chybný počet parametrů: " + prvky.length); franta-hg@26: } else { franta-hg@26: operace = prvky[0]; franta-hg@26: uživatel = prvky[1]; franta-hg@26: doména = prvky[2]; franta-hg@26: heslo = (prvky.length > 3) ? prvky[3] : null; franta-hg@26: franta-hg@26: err.println(operace + ":" + uživatel + ":" + doména + (heslo == null ? "" : ":*")); franta-hg@26: franta-hg@26: switch (operace) { franta-hg@26: case "auth": franta-hg@26: ověřHeslo(uživatel, doména, heslo); franta-hg@26: break; franta-hg@26: case "isuser": franta-hg@26: ověřExistenci(uživatel, doména); franta-hg@26: break; franta-hg@26: case "setpass": franta-hg@26: case "tryregister": franta-hg@26: case "removeuser": franta-hg@26: case "removeuser3": franta-hg@26: default: franta-hg@26: zapišVýsledek(NE); franta-hg@26: } franta-hg@26: } franta-hg@26: } franta-hg@26: franta-hg@26: private void zapišVýsledek(int výsledek) throws ChybaZápisuVýsledku { franta-hg@26: try { franta-hg@26: err.println("výsledek: " + výsledek); franta-hg@26: franta-hg@26: out.writeShort(2); franta-hg@26: out.writeShort(výsledek); franta-hg@26: out.flush(); franta-hg@26: } catch (Exception e) { franta-hg@26: throw new ChybaZápisuVýsledku(e); franta-hg@26: } franta-hg@26: } franta-hg@26: franta-hg@26: private void ověřHeslo(String uživatel, String doména, String heslo) throws ChybaZápisuVýsledku { franta-hg@26: if (ověřDoménu(doména)) { franta-hg@26: franta-hg@26: try (Connection db = getDB()) { franta-hg@26: try (PreparedStatement ps = db.prepareStatement("SELECT over_heslo(?,?)")) { franta-hg@26: int i = 1; franta-hg@26: ps.setString(i++, uživatel); franta-hg@26: ps.setString(i++, heslo); franta-hg@26: try (ResultSet rs = ps.executeQuery()) { franta-hg@26: rs.next(); franta-hg@26: int výsledek = rs.getBoolean(1) ? ANO : NE; franta-hg@26: zapišVýsledek(výsledek); franta-hg@26: } franta-hg@26: } franta-hg@26: } catch (SQLException e) { franta-hg@26: logujSQLException(e); franta-hg@26: zapišVýsledek(NE); franta-hg@26: } franta-hg@26: franta-hg@26: } else { franta-hg@26: zapišVýsledek(NE); franta-hg@26: } franta-hg@26: } franta-hg@26: franta-hg@26: private void ověřExistenci(String uživatel, String doména) throws ChybaZápisuVýsledku { franta-hg@26: if (ověřDoménu(doména)) { franta-hg@26: franta-hg@26: try (Connection db = getDB()) { franta-hg@26: try (PreparedStatement ps = db.prepareStatement("SELECT over_existenci_uzivatele(?)")) { franta-hg@26: int i = 1; franta-hg@26: ps.setString(i++, uživatel); franta-hg@26: try (ResultSet rs = ps.executeQuery()) { franta-hg@26: rs.next(); franta-hg@26: int výsledek = rs.getBoolean(1) ? ANO : NE; franta-hg@26: zapišVýsledek(výsledek); franta-hg@26: } franta-hg@26: } franta-hg@26: } catch (SQLException e) { franta-hg@26: logujSQLException(e); franta-hg@26: zapišVýsledek(NE); franta-hg@26: } franta-hg@26: franta-hg@26: } else { franta-hg@26: zapišVýsledek(NE); franta-hg@26: } franta-hg@26: } franta-hg@26: franta-hg@26: private boolean ověřDoménu(String doména) { franta-hg@26: return našeDoména.equalsIgnoreCase(doména); franta-hg@26: } franta-hg@26: franta-hg@26: private void logujSQLException(SQLException e) { franta-hg@26: err.println("-- SQLException:"); franta-hg@26: e.printStackTrace(err); franta-hg@26: err.println("-- SQLException"); franta-hg@26: } franta-hg@26: }