/* * This file is part of DrFTPD, Distributed FTP Daemon. * * DrFTPD is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * DrFTPD is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with DrFTPD; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package org.drftpd.sitebot; import java.io.FileInputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.Iterator; import java.util.Properties; import java.util.regex.Matcher; import java.util.regex.Pattern; import net.sf.drftpd.ObjectNotFoundException; import net.sf.drftpd.event.Event; import net.sf.drftpd.event.FtpListener; import net.sf.drftpd.util.Blowfish; import net.tmods.extra.CNuke; import org.drftpd.plugins.SiteBot; import f00f.net.irc.martyr.GenericAutoService; import f00f.net.irc.martyr.InCommand; import f00f.net.irc.martyr.State; import f00f.net.irc.martyr.commands.MessageCommand; /** * @author tommie * -:BotNuke:- v0.2.1 */ public class BotNuke extends GenericAutoService { private SiteBot sb; private String bn_nuker, bn_chars, bn_spaces; private boolean bn_strip; private CNuke cn; private ArrayList nukeList; private MyListener BotNukeListener; public BotNuke(SiteBot sitebot) { super(sitebot.getIRCConnection()); sb = sitebot; BotNukeListener = new MyListener(); sb.getGlobalContext().addFtpListener(BotNukeListener); } public class MyListener extends FtpListener { public MyListener() { reload(); } public void actionPerformed(Event event) { if ("RELOAD".equals(event.getCommand())) { reload(); } } } private void reload() { Properties cfg = new Properties(); FileInputStream fis = null; try { fis = new FileInputStream("conf/botnuke.conf"); cfg.load(fis); fis.close(); } catch (IOException e) { return; } bn_nuker = cfg.getProperty("bn.nuker", "drftpd"); String _bn_nukePrefix = cfg.getProperty("bn.nuke.prefix", "[NUKED]-"); String _bn_nukeReasonPrefix = cfg.getProperty("bn.nuke.reason.prefix", "REASON-"); bn_chars = cfg.getProperty("bn.chars", "[^a-zA-Z0-9\\[\\]\\._\\-\\(\\)\\s\\?\\!]"); bn_spaces = cfg.getProperty("bn.spaces", "."); bn_strip = Boolean.parseBoolean(cfg.getProperty("bn.strip", "false")); cn = new CNuke(sb.getGlobalContext(), _bn_nukePrefix, _bn_nukeReasonPrefix); nukeList = new ArrayList(); for (int i = 1;; i++) { String _nick = cfg.getProperty("bn." + i + ".nick"); if (_nick == null) break; String _user = cfg.getProperty("bn." + i + ".user"); if (_user == null) break; String _host = cfg.getProperty("bn." + i + ".host"); if (_host == null) break; String _text = cfg.getProperty("bn." + i + ".text"); if (_text == null) break; String _nuke_directory = cfg.getProperty("bn." + i + ".nuke.directory"); if (_nuke_directory == null) break; String _nuke_reason = cfg.getProperty("bn." + i + ".nuke.reason", "unknown.fix.conf"); int _nuke_mult = Integer.parseInt(cfg.getProperty("bn." + i + ".nuke.mult", "0")); nukeList.add(new NukeConfig(_nick, _user, _host, _text, _nuke_directory, _nuke_reason, _nuke_mult)); } } protected void updateState(State _state) { } protected void updateCommand(InCommand _ic) { if (_ic instanceof MessageCommand) { synchronized (this) { MessageCommand msgc = (MessageCommand) _ic; String _key, _message = ""; if (!msgc.isPrivateToUs(getConnection().getClientState())) { // get key try { _key = sb.getBlowfishKey(msgc.getDest(), null); } catch (ObjectNotFoundException e) { return; } // decrypt message Blowfish bf = new Blowfish(_key); try { _message = bf.Decrypt(msgc.getMessage()); } catch (UnsupportedEncodingException e) { return; ds } } // do nukelist if (!nukeList.isEmpty()) { String _nick = msgc.getSource().getNick(); String _user = msgc.getSource().getUser(); String _host = msgc.getSource().getHost(); Iterator iter = nukeList.iterator(); while (iter.hasNext()) { NukeConfig nc = (NukeConfig) iter.next(); if (_nick.matches(nc.getNick()) && _user.matches(nc.getUser()) && _host.matches(nc.getHost())) { if (bn_strip) _message = stripMessage(_message); Pattern pat = Pattern.compile(nc.getText()); Matcher mat = pat.matcher(_message); if (mat.find()) { cn.doNuke(mat.replaceAll(nc.getNukeDirectory()).trim(), mat.replaceAll(nc.getNukeReason()).replaceAll(bn_chars, "").replaceAll("\\s", bn_spaces).trim(), nc.getNukeMultiplier(), bn_nuker); break; } } } } } } } public class NukeConfig { private String nick, user, host, text, nuke_directory, nuke_reason; private int nuke_mult; public NukeConfig(String _nick, String _user, String _host, String _text, String _nuke_directory, String _nuke_reason, int _nuke_mult) { nick = _nick; user = _user; host = _host; text = _text; nuke_directory = _nuke_directory; nuke_reason = _nuke_reason; nuke_mult = _nuke_mult; } public String getNick() { return nick; } public String getUser() { return user; } public String getHost() { return host; } public String getText() { return text; } public String getNukeDirectory() { return nuke_directory; } public String getNukeReason() { return nuke_reason; } public int getNukeMultiplier() { return nuke_mult; } } public String stripMessage(String str) { return stripMessage(new StringBuffer(str)).toString(); } public StringBuffer stripMessage(StringBuffer buf) { int len = buf.length(); for (int i = 0, j = 0, c; i < len; i++, j = i) { try { c = buf.charAt(i); if (c == 3) { c = buf.charAt(++j); if ('0' <= c && c <= '9') { c = buf.charAt(++j); if ('0' <= c && c <= '9') c = buf.charAt(++j); } if (c == ',') c = buf.charAt(++j); if ('0' <= c && c <= '9') { c = buf.charAt(++j); if ('0' <= c && c <= '9') c = buf.charAt(++j); } } else if (c == 1 || c == 31 || c == 2 || c == 15 || c == 22) { j++; } } catch (StringIndexOutOfBoundsException exc) { } if (j > i) { buf = buf.delete(i, j); len -= (j - i); i -= (j - i); } } return buf; } }