phex.gui.actions.BanHostActionUtils.java Source code

Java tutorial

Introduction

Here is the source code for phex.gui.actions.BanHostActionUtils.java

Source

/*
 *  PHEX - The pure-java Gnutella-servent.
 *  Copyright (C) 2001 - 2008 Phex Development Group
 *
 *  This program 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.
 *
 *  This program 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 this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 * 
 *  Created on 14.04.2006
 *  --- SVN Information ---
 *  $Id: BanHostActionUtils.java 4412 2009-03-22 13:40:44Z ArneBab $
 */
package phex.gui.actions;

import java.awt.event.ActionEvent;

import javax.swing.Icon;
import javax.swing.JMenu;

import org.apache.commons.lang.time.DateUtils;

import phex.common.Environment;
import phex.common.ExpiryDate;
import phex.common.address.DestAddress;
import phex.common.address.IpAddress;
import phex.common.log.NLogger;
import phex.gui.common.GUIRegistry;
import phex.gui.dialogs.security.SecurityRuleDialog;
import phex.security.AccessType;
import phex.security.PhexSecurityManager;
import phex.servent.Servent;
import phex.utils.Localizer;

public abstract class BanHostActionUtils extends FWAction {
    public static BanHostActionMenu createActionMenu(BanHostActionProvider addressProvider) {
        FWAction[] actions = new FWAction[4];
        JMenu mainMenu = new JMenu(Localizer.getString("BanHostAction_BanHost"));
        mainMenu.setIcon(GUIRegistry.getInstance().getPlafIconPack().getIcon("Security.BanHost"));

        // 1 day
        BanHostAction action = new BanHostAction(Localizer.getString("BanHostAction_1Day"), addressProvider,
                ExpiryDate.getExpiryDate(System.currentTimeMillis() + DateUtils.MILLIS_PER_DAY));
        actions[0] = action;
        mainMenu.add(action);
        // 7 days
        action = new BanHostAction(Localizer.getString("BanHostAction_7Days"), addressProvider,
                ExpiryDate.getExpiryDate(System.currentTimeMillis() + DateUtils.MILLIS_PER_DAY * 7));
        actions[1] = action;
        mainMenu.add(action);
        // never
        action = new BanHostAction(Localizer.getString("BanHostAction_Unlimited"), addressProvider,
                ExpiryDate.getExpiryDate(ExpiryDate.EXPIRES_NEVER));
        actions[2] = action;
        mainMenu.add(action);
        // custom
        action = new BanHostAction(Localizer.getString("BanHostAction_Custom"), addressProvider, null);
        actions[3] = action;
        mainMenu.add(action);

        // we return an extra wrapper class to have the option of two return
        // values.
        BanHostActionMenu actionMenu = new BanHostActionMenu();
        actionMenu.menu = mainMenu;
        actionMenu.actions = actions;
        return actionMenu;
    }

    public static FWAction createToolBarAction(BanHostActionProvider addressProvider) {
        // 7 days
        BanHostAction action = new BanHostAction(Localizer.getString("BanHostAction_BanHost"),
                GUIRegistry.getInstance().getPlafIconPack().getIcon("Security.BanHost"),
                Localizer.getString("BanHostAction_TTTBanHost7Days"), addressProvider,
                ExpiryDate.getExpiryDate(System.currentTimeMillis() + DateUtils.MILLIS_PER_DAY * 7));
        return action;
    }

    public static class BanHostActionMenu {
        public FWAction[] actions;
        public JMenu menu;
    }

    public interface BanHostActionProvider {
        public DestAddress[] getBanHostAddresses();

        public boolean isBanHostActionEnabled(boolean allowMultipleAddresses);
    }

    private static class BanHostAction extends FWAction {
        private BanHostActionProvider addressProvider;
        private ExpiryDate expiryDate;

        private BanHostAction(String name, BanHostActionProvider addressProvider, ExpiryDate expiryDate) {
            this(name, null, null, addressProvider, expiryDate);
        }

        private BanHostAction(String name, Icon icon, String tooltiptext, BanHostActionProvider addressProvider,
                ExpiryDate expiryDate) {
            super(name, icon, tooltiptext);
            this.addressProvider = addressProvider;
            this.expiryDate = expiryDate;
            refreshActionState();
        }

        public void actionPerformed(ActionEvent e) {
            try {
                if (expiryDate == null) {
                    // this is the custom ban situation... we do the same as we
                    // would when we create a new ban.
                    final DestAddress[] addresses = addressProvider.getBanHostAddresses();
                    // we only honor the first ban address the holder should make
                    // sure this element is disabled in case multiple hosts are 
                    // selected
                    IpAddress ip = addresses[0].getIpAddress();
                    if (ip == null) {
                        return;
                    }
                    SecurityRuleDialog dialog = new SecurityRuleDialog();
                    dialog.customPrefillBanSingleIp(Localizer.getString("UserBanned"), ip.getHostIP());
                    dialog.setVisible(true);
                } else {
                    final DestAddress[] addresses = addressProvider.getBanHostAddresses();
                    Runnable runner = new Runnable() {
                        public void run() {
                            try {
                                banHosts(addresses, expiryDate);
                            } catch (Throwable th) {
                                NLogger.error(BanHostAction.class, th, th);
                            }
                        }
                    };
                    Environment.getInstance().executeOnThreadPool(runner, "BanHostsAction");
                }
            } catch (Throwable th) {
                NLogger.error(BanHostAction.class, th, th);
            }
        }

        @Override
        public void refreshActionState() {
            setEnabled(addressProvider.isBanHostActionEnabled(expiryDate != null));
        }
    }

    private static void banHosts(DestAddress[] addresses, ExpiryDate expiryDate) {
        Servent servent = GUIRegistry.getInstance().getServent();
        PhexSecurityManager securityMgr = servent.getSecurityService();
        for (int i = 0; i < addresses.length; i++) {
            IpAddress ip = addresses[i].getIpAddress();
            if (ip == null) {
                continue;
            }
            AccessType res = securityMgr.controlHostIPAccess(ip.getHostIP());
            // only add if not already added through earlier batch.
            if (res == AccessType.ACCESS_GRANTED) {
                securityMgr.createIPAccessRule(Localizer.getString("UserBanned"), ip.getHostIP(), (byte) 32, false,
                        expiryDate, true);
            }
        }
    }
}