/*  1*/ /*********************************************************************************
/*  2*/  * 
/*  3*/  *      PFSaver クラス
/*  4*/  * 
/*  5*/  *  パケットフィルタリングアプリケーションの支援メソッド群
/*  6*/  * 
/*  7*/  * 
/*  8*/  * WinPacketFilteringパッケージを使用する
/*  9*/  * フィルタ、ハンドルの保存、読み込み、編集、削除
/* 10*/  * IP、ICMP、TCP、UDPフィルタを作成可
/* 11*/  * 
/* 12*/  *  
/* 13*/  *  
/* 14*/  * public メソッド
/* 15*/  * ・PFSaver()
/* 16*/  *      コンストラクタ
/* 17*/  * 
/* 18*/  * **********   フィルタリング動作関連  **********
/* 19*/  * ・void startFiltering(InetAddress adrs, int inH, int outH)
/* 20*/  *      フィルタリングを開始する
/* 21*/  * 
/* 22*/  * ・void stopFiltering()
/* 23*/  *      フィルタリングを停止する
/* 24*/  * 
/* 25*/  * ・boolean isWorking()
/* 26*/  *      フィルタリンが動作中かどうか
/* 27*/  * 
/* 28*/  * **********   アプリケーション補助    **********
/* 29*/  * ・void restoreList(String path)
/* 30*/  *      前回終了時リストを復元する
/* 31*/  * 
/* 32*/  * ・void recordList(String path)
/* 33*/  *      ハンドル・フィルタのリストを記録する
/* 34*/  * 
/* 35*/  * **********   インタフェースハンドル関連  **********
/* 36*/  * ・void addBlackListHandle()
/* 37*/  *      リストにブラックリスト・ハンドルを追加する
/* 38*/  * 
/* 39*/  * ・void addWhiteListHandle()
/* 40*/  *      リストにホワイトリスト・ハンドルを追加する
/* 41*/  * 
/* 42*/  * ・void removeHandle(int index)
/* 43*/  *      リストからインタフェースハンドルを取り除く
/* 44*/  * 
/* 45*/  * ・void clearHandle()
/* 46*/  *      インタフェースハンドルリストをクリアする
/* 47*/  * 
/* 48*/  * ・int getHandleNum() 
/* 49*/  *      リストのハンドル数を得る
/* 50*/  * 
/* 51*/  * ・void setFilterToHandle(int Hindex, int Findex)
/* 52*/  *      フィルタをインタフェースハンドルにセットする
/* 53*/  * 
/* 54*/  * ・void removeFilterFromHandle(int hIndex, int fIndex)
/* 55*/  *      リストのハンドルからフィルタを削除する
/* 56*/  * 
/* 57*/  * ・void writeInterfaceHandle(String filename, int index)
/* 58*/  *      インタフェースハンドルをファイルに書き込む
/* 59*/  * 
/* 60*/  * ・void readInterfaceHandle(String filename)
/* 61*/  *      インタフェースハンドルファイルを読み込む
/* 62*/  * 
/* 63*/  * ・String getHandleFileType(ZipFile zipfile)
/* 64*/  *      ハンドルファイルのタイプを得る
/* 65*/  * 
/* 66*/  * ・void deleteHandle(String path)
/* 67*/  *      インタフェースハンドルファイルを削除する
/* 68*/  * 
/* 69*/  * ・String[] searchHandle(String path)
/* 70*/  *      インタフェースハンドルファイル一覧を検索する
/* 71*/  * 
/* 72*/  * ・boolean existHandle(String filename)
/* 73*/  *      ハンドルファイルが存在するか
/* 74*/  * 
/* 75*/  * ・String toStringHandle(INTERFACE_HANDLE handle)
/* 76*/  *      インタフェースハンドルをString形式にする
/* 77*/  * 
/* 78*/  * ・String[] toStringFiltersInHandle(int index)
/* 79*/  *      ハンドル内のフィルタをString形式にする
/* 80*/  * 
/* 81*/  * ・String getHandleString(int index)
/* 82*/  *      リストの対象のインタフェースハンドルのString形式を得る
/* 83*/  * 
/* 84*/  * **********   フィルタディスクリプタ関連  **********
/* 85*/  * ・void addIPfilter(InetAddress Sadrs, InetAddress Smsk,
/* 86*/  *          InetAddress Dadrs, InetAddress Dmsk)
/* 87*/  *      リストにIPフィルタを追加する
/* 88*/  * 
/* 89*/  * ・void addICMPfilter(InetAddress Sadrs, InetAddress Smsk,
/* 90*/  *          InetAddress Dadrs, InetAddress Dmsk)
/* 91*/  *      リストにICMPフィルタを追加する
/* 92*/  * 
/* 93*/  * ・void addTCPfilter(InetAddress Sadrs, InetAddress Smsk,
/* 94*/  *          InetAddress Dadrs, InetAddress Dmsk,
/* 95*/  *          int sPort, int dPort, int csPort, int cdPort)
/* 96*/  *      リストにTCPフィルタを追加する
/* 97*/  * 
/* 98*/  * ・void addUDPfilter(InetAddress Sadrs, InetAddress Smsk,
/* 99*/  *          InetAddress Dadrs, InetAddress Dmsk,
/*100*/  *          int sPort, int dPort, int csPort, int cdPort)
/*101*/  *      リストにUDPフィルタを追加する
/*102*/  *      
/*103*/  * ・void removeFilter(int index)
/*104*/  *      リストからフィルタを取り除く
/*105*/  * 
/*106*/  * ・void clearFilter()
/*107*/  *      フィルタリストをクリアする
/*108*/  * 
/*109*/  * ・int getFilterNum()
/*110*/  *      リストのフィルタ数を得る
/*111*/  * 
/*112*/  * ・void editIPFilter(int index, InetAddress Sadrs,
/*113*/  *          InetAddress Smsk, InetAddress Dadrs, InetAddress Dmsk)
/*114*/  *      リストのIPフィルタを編集する
/*115*/  * 
/*116*/  * ・void editICMPFilter(int index, InetAddress Sadrs,
/*117*/  *          InetAddress Smsk, InetAddress Dadrs, InetAddress Dmsk)
/*118*/  *      リストのICMPフィルタを編集する
/*119*/  *      
/*120*/  * ・void editTCPFilter(int index, InetAddress Sadrs,
/*121*/  *          InetAddress Smsk, InetAddress Dadrs, InetAddress Dmsk,
/*122*/  *          int sPort, int dPort, int csPort, int cdPort)
/*123*/  *      リストのTCPフィルタを編集する
/*124*/  * 
/*125*/  * ・void editUDPFilter(int index, InetAddress Sadrs,
/*126*/  *          InetAddress Smsk, InetAddress Dadrs, InetAddress Dmsk,
/*127*/  *          int sPort, int dPort, int csPort, int cdPort)
/*128*/  *      リストのUDPフィルタを編集する
/*129*/  *      
/*130*/  * ・void writeFilterDescriptor(String filename, int index)
/*131*/  *      フィルタを書き込み
/*132*/  * 
/*133*/  * ・void readFilterDescriptor(String filename)
/*134*/  *      フィルタを読み込み
/*135*/  * 
/*136*/  * ・void deleteFilter(String path)
/*137*/  *      フィルタファイルを削除する
/*138*/  * 
/*139*/  * ・String[] searchFilter(String path)
/*140*/  *      フィルタファイル一覧を検索する
/*141*/  * 
/*142*/  * ・boolean existFilter(String filename)
/*143*/  *      フィルタファイルが存在するか
/*144*/  * 
/*145*/  * ・String toStringFilter(FILTER_DESCRIPTOR filter)
/*146*/  *      フィルタをString形式にする
/*147*/  * 
/*148*/  * ・String getFilterString(int index)
/*149*/  *      リストの対象のフィルタのString形式を得る
/*150*/  * 
/*151*/  * ・int getFilterProtocol(int index)
/*152*/  *      リストのフィルタのプロトコルを得る
/*153*/  * 
/*154*/  * 
/*155*/  *  
/*156*/  * private メソッド
/*157*/  * ・void addHandle(INTERFACE_HANDLE handle)
/*158*/  *      リストにインタフェースハンドルを追加する
/*159*/  *  
/*160*/  * ・void addFilter(FILTER_DESCRIPTOR filter)
/*161*/  *      リストにフィルタを追加する
/*162*/  * 
/*163*/  * ・boolean isV6(InetAddress[] inetadrs)
/*164*/  *      入力されたInetAddressが全てIPv6がどうか調べる
/*165*/  * 
/*166*/  * ・boolean isV4(InetAddress[] inetadrs)
/*167*/  *      入力されたInetAddressが全てIPv4がどうか調べる
/*168*/  * 
/*169*/  *********************************************************************************/
/*170*/ 
/*171*/ package PFSaver;
/*172*/ 
/*173*/ import java.io.File;
/*174*/ import java.io.FileInputStream;
/*175*/ import java.io.FileNotFoundException;
/*176*/ import java.io.FileOutputStream;
/*177*/ import java.io.FilenameFilter;
/*178*/ import java.io.IOException;
/*179*/ import java.io.ObjectInputStream;
/*180*/ import java.io.ObjectOutputStream;
/*181*/ import java.net.Inet4Address;
/*182*/ import java.net.Inet6Address;
/*183*/ import java.net.InetAddress;
/*184*/ import java.util.ArrayList;
/*185*/ import java.util.zip.ZipEntry;
/*186*/ import java.util.zip.ZipFile;
/*187*/ 
/*188*/ import WinPacketFiltering.*;
/*189*/ 
/*190*/ public class PFSaver
/*191*/ {
/*192*/     private static final boolean DEBUG = false;
/*193*/     
/*194*/     private ArrayList handleList = new ArrayList();
/*195*/     private ArrayList filterList = new ArrayList();
/*196*/     public static final String fExtension = ".flt"; // フィルタ拡張子
/*197*/     public static final String hExtension = ".hdl"; // ハンドル拡張子
/*198*/     private static final String typefile = "TYPE";
/*199*/     private static final String BLACK = "BLACK_LIST";
/*200*/     private static final String WHITE = "WHITE_LIST";
/*201*/     private boolean isWorking; // フィルタリングが動作中かどうか
/*202*/     
/*203*/     // コンストラクタ
/*204*/     public PFSaver()
/*205*/     {
/*206*/         isWorking = false;
/*207*/     } // PFSaver END
/*208*/     
/*209*/     // フィルタリングを開始する
/*210*/     public void startFiltering(InetAddress adrs, int inH, int outH)
/*211*/         throws PacketFilteringException
/*212*/     {
/*213*/         int adrsType;
/*214*/         
/*215*/         if(adrs.getAddress().length==4)
/*216*/             adrsType = PacketFiltering.IPv4_FLAG;
/*217*/         else if(adrs.getAddress().length==16)
/*218*/             adrsType = PacketFiltering.IPv6_FLAG;
/*219*/         else
/*220*/             throw new PacketFilteringException("Unexpected Error");
/*221*/         
/*222*/         PacketFiltering.BindInterfaceToIPAddress(adrs, adrsType,
/*223*/                 (INTERFACE_HANDLE)(handleList.get(inH)),
/*224*/                 (INTERFACE_HANDLE)(handleList.get(outH)));
/*225*/         
/*226*/         isWorking = true;
/*227*/     } // startFiltering END
/*228*/     
/*229*/     // フィルタリングを停止する
/*230*/     public void stopFiltering() throws PacketFilteringException
/*231*/     {
/*232*/         PacketFiltering.UnBindInterface();
/*233*/         isWorking = false;
/*234*/     } // stopFiltering END
/*235*/     
/*236*/     // フィルタリンが動作中かどうか
/*237*/     public boolean isWorking()
/*238*/     {
/*239*/         return isWorking;
/*240*/     } // isWorking END
/*241*/     
/*242*/     // 前回終了時リストを復元する
/*243*/     public void restoreList(String path) throws Exception
/*244*/     {
/*245*/         Exception excp = null;
/*246*/         
/*247*/         String[] hlist = searchHandle(path);
/*248*/         for(int i=0;i<hlist.length;i++)
/*249*/         {
/*250*/             if(DEBUG) System.out.println(path+"\\"+hlist[i]); // デバッグ
/*251*/             try
/*252*/             {
/*253*/                 readInterfaceHandle(path+"\\"+hlist[i]);
/*254*/                 deleteHandle(path+"\\"+hlist[i]);
/*255*/             }
/*256*/             catch(Exception e)
/*257*/             {
/*258*/                 excp = e;
/*259*/             }
/*260*/         }
/*261*/         
/*262*/         String[] flist = searchFilter(path);
/*263*/         for(int i=0;i<flist.length;i++)
/*264*/         {
/*265*/             if(DEBUG) System.out.println(path+"\\"+flist[i]); // デバッグ
/*266*/             try
/*267*/             {
/*268*/                 readFilterDescriptor(path+"\\"+flist[i]);
/*269*/                 deleteFilter(path+"\\"+flist[i]);
/*270*/             }
/*271*/             catch(Exception e)
/*272*/             {
/*273*/                 excp = e;
/*274*/             }
/*275*/         }
/*276*/         
/*277*/         if(excp!=null)
/*278*/         {
/*279*/             throw excp;
/*280*/         }
/*281*/     } // restoreList END
/*282*/     
/*283*/     // ハンドル・フィルタのリストを記録する
/*284*/     public void recordList(String path) throws IOException, Exception
/*285*/     {
/*286*/         for(int i=0;i<handleList.size();i++)
/*287*/         {
/*288*/             writeInterfaceHandle(path+"\\handle"+i, i);
/*289*/         }
/*290*/         
/*291*/         for(int i=0;i<filterList.size();i++)
/*292*/         {
/*293*/             writeFilterDescriptor(path+"\\filter"+i, i);
/*294*/         }
/*295*/     } // recordMemory END
/*296*/     
/*297*/     
/*298*/     
/*299*/     // リストにインタフェースハンドルを追加する
/*300*/     private void addHandle(INTERFACE_HANDLE handle)
/*301*/     {
/*302*/         handleList.add(handle);
/*303*/     } // addHandle END
/*304*/     
/*305*/     // リストにブラックリスト・ハンドルを追加する
/*306*/     public void addBlackListHandle()
/*307*/     {
/*308*/         addHandle(INTERFACE_HANDLE.makeBLACK_LIST());
/*309*/     } // addBlackListHandle END
/*310*/     
/*311*/     // リストにホワイトリスト・ハンドルを追加する
/*312*/     public void addWhiteListHandle()
/*313*/     {
/*314*/         addHandle(INTERFACE_HANDLE.makeWHITE_LIST());
/*315*/     } // addWhiteListHandle END
/*316*/     
/*317*/     // リストからインタフェースハンドルを取り除く
/*318*/     public void removeHandle(int index)
/*319*/     {
/*320*/         handleList.remove(index);
/*321*/     } // removeHandle END
/*322*/     
/*323*/     // インタフェースハンドルリストをクリアする
/*324*/     public void clearHandle()
/*325*/     {
/*326*/         handleList.clear();
/*327*/     } // clearHandle END
/*328*/     
/*329*/     // リストのハンドル数を得る
/*330*/     public int getHandleNum()
/*331*/     {
/*332*/         return handleList.size();
/*333*/     } // getHandleNum END
/*334*/     
/*335*/     // フィルタをインタフェースハンドルにセットする
/*336*/     public void setFilterToHandle(int Hindex, int Findex)
/*337*/     {
/*338*/         ((INTERFACE_HANDLE)(handleList.get(Hindex))).addFilter(
/*339*/                 (FILTER_DESCRIPTOR)(filterList.get(Findex)));
/*340*/     } // setFilterToHandle END
/*341*/     
/*342*/     // リストのハンドルからフィルタを削除する
/*343*/     public void removeFilterFromHandle(int hIndex, int fIndex)
/*344*/     {
/*345*/         ((INTERFACE_HANDLE)(handleList.get(hIndex))).removeFilter(fIndex);
/*346*/     } // removeFilterFromHandle END
/*347*/     
/*348*/     // インタフェースハンドルをファイルに書き込む
/*349*/     public void writeInterfaceHandle(String filename, int index) throws IOException
/*350*/     {
/*351*/         INTERFACE_HANDLE handle = (INTERFACE_HANDLE)(handleList.get(index));
/*352*/         ZipCompresser zipper = new ZipCompresser(filename+hExtension);
/*353*/         
/*354*/         // ルールファイルの生成
/*355*/         if(handle.rule==INTERFACE_HANDLE.BLACK_LIST)
/*356*/         {
/*357*/             zipper.addFileInZip((Object)BLACK, typefile);
/*358*/         }
/*359*/         else if(handle.rule==INTERFACE_HANDLE.WHITE_LIST)
/*360*/         {
/*361*/             zipper.addFileInZip((Object)WHITE, typefile);
/*362*/         }
/*363*/         
/*364*/         // フィルタの書き込み
/*365*/         for(int i=0;i<handle.getSize();i++)
/*366*/         {
/*367*/             zipper.addFileInZip((FILTER_DESCRIPTOR)(handle.getFilter(i)),
/*368*/                     "filterfile"+i+fExtension);
/*369*/         }
/*370*/         
/*371*/         zipper.close();
/*372*/     } // writeInterfaceHandle END
/*373*/     
/*374*/     // インタフェースハンドルファイルを読み込む
/*375*/     public void readInterfaceHandle(String filename)
/*376*/         throws IOException, ClassNotFoundException, Exception
/*377*/     {
/*378*/         INTERFACE_HANDLE handle;
/*379*/         
/*380*/         ZipFile zipfile = new ZipFile(filename);
/*381*/         
/*382*/         // ハンドルタイプの設定
/*383*/         String type = getHandleFileType(zipfile);
/*384*/         if(type.equals(BLACK))
/*385*/         {
/*386*/             handle = INTERFACE_HANDLE.makeBLACK_LIST();
/*387*/             if(DEBUG) System.out.println(BLACK); // デバッグ
/*388*/         }
/*389*/         else if(type.equals(WHITE))
/*390*/         {
/*391*/             handle = INTERFACE_HANDLE.makeWHITE_LIST();
/*392*/             if(DEBUG) System.out.println(WHITE); // デバッグ
/*393*/         }
/*394*/         else
/*395*/             throw new Exception("Illegal File");
/*396*/         
/*397*/         // フィルタのセット
/*398*/         Object[] obj = ZipDecompresser.decompress(zipfile);
/*399*/         for(int i=0;i<obj.length;i++)
/*400*/         {
/*401*/             try
/*402*/             {
/*403*/                 handle.addFilter((FILTER_DESCRIPTOR)obj[i]);
/*404*/             }
/*405*/             catch(ClassCastException cce){}
/*406*/         }
/*407*/         
/*408*/         handleList.add(handle);
/*409*/         zipfile.close();
/*410*/     } // readInterfaceHandle END
/*411*/     
/*412*/     // ハンドルファイルのタイプを得る
/*413*/     public String getHandleFileType(ZipFile zipfile)
/*414*/         throws IOException, ClassNotFoundException
/*415*/     {
/*416*/         return (String)ZipDecompresser.decompress(
/*417*/                     zipfile, new ZipEntry(typefile));
/*418*/     } // getHandleFileType END
/*419*/     
/*420*/     // インタフェースハンドルファイルを削除する
/*421*/     public static void deleteHandle(String path) throws Exception
/*422*/     {       
/*423*/         new File(path).delete();
/*424*/     } // deleteFolder END
/*425*/     
/*426*/     // インタフェースハンドルファイル一覧を検索する
/*427*/     public static String[] searchHandle(String path)
/*428*/     {
/*429*/         File f = new File(path);
/*430*/         
/*431*/         return f.list(new FilenameFilter(){
/*432*/                 public boolean accept(File dir, String name)
/*433*/                 {
/*434*/                     if(name.toLowerCase().endsWith(hExtension) )
/*435*/                         return  true;
/*436*/                     else
/*437*/                         return  false;
/*438*/                 }
/*439*/         });
/*440*/     } // searchHandle END
/*441*/     
/*442*/     // ハンドルファイルが存在するか
/*443*/     public static boolean existHandle(String filename)
/*444*/     {
/*445*/         return new File(filename+hExtension).exists();
/*446*/     } // existHandle END
/*447*/     
/*448*/     // インタフェースハンドルをString形式にする
/*449*/     public static String toStringHandle(INTERFACE_HANDLE handle)
/*450*/     {
/*451*/         String s;
/*452*/         
/*453*/         if(handle.rule==INTERFACE_HANDLE.BLACK_LIST)
/*454*/             s="BLACK LIST ";
/*455*/         else
/*456*/             s="WHITE LIST ";
/*457*/         
/*458*/         return s+handle.getSize();
/*459*/     } // toStringHandle END
/*460*/     
/*461*/     // ハンドル内のフィルタをString形式にする
/*462*/     public String[] toStringFiltersInHandle(int index)
/*463*/     {
/*464*/         INTERFACE_HANDLE handle = (INTERFACE_HANDLE)(handleList.get(index));
/*465*/         
/*466*/         String[] s = new String[handle.getSize()];
/*467*/         
/*468*/         for(int i=0;i<handle.getSize();i++)
/*469*/         {
/*470*/             s[i] = toStringFilter(handle.getFilter(i));
/*471*/         }
/*472*/         
/*473*/         return s;
/*474*/     } // toStringFiltersInHandle END
/*475*/ 
/*476*/     // リストの対象のインタフェースハンドルのString形式を得る
/*477*/     public String getHandleString(int index)
/*478*/     {
/*479*/         return toStringHandle((INTERFACE_HANDLE)(handleList.get(index)));
/*480*/     } // getHandleString END
/*481*/     
/*482*/     
/*483*/     
/*484*/     // リストにフィルタを追加する
/*485*/     private void addFilter(FILTER_DESCRIPTOR filter)
/*486*/     {
/*487*/         filterList.add(filter);
/*488*/     } // addFilter END
/*489*/     
/*490*/     // リストにIPフィルタを追加する
/*491*/     public void addIPfilter(InetAddress Sadrs, InetAddress Smsk,
/*492*/             InetAddress Dadrs, InetAddress Dmsk)
/*493*/     {
/*494*/         InetAddress[] forCheck = {Sadrs,Smsk,Dadrs,Dmsk};
/*495*/         
/*496*/         FILTER_DESCRIPTOR filter = PacketFiltering.getIPfilter();
/*497*/         filter.SrcAddr = Sadrs;
/*498*/         filter.SrcMask = Smsk;
/*499*/         filter.DstAddr = Dadrs;
/*500*/         filter.DstMask = Dmsk;
/*501*/         
/*502*/         if(isV4(forCheck))
/*503*/             filter.AddrType = PacketFiltering.IPv4_FLAG;
/*504*/         else if(isV6(forCheck))
/*505*/             filter.AddrType = PacketFiltering.IPv6_FLAG;
/*506*/         else
/*507*/             throw new IllegalArgumentException("Illegal IPaddress");
/*508*/         
/*509*/         addFilter(filter);
/*510*/     } // addIPfilter END
/*511*/     
/*512*/     // リストにICMPフィルタを追加する
/*513*/     public void addICMPfilter(InetAddress Sadrs, InetAddress Smsk,
/*514*/             InetAddress Dadrs, InetAddress Dmsk)
/*515*/     {
/*516*/         InetAddress[] forCheck = {Sadrs,Smsk,Dadrs,Dmsk};
/*517*/         
/*518*/         FILTER_DESCRIPTOR filter = PacketFiltering.getICMPfilter();
/*519*/         filter.SrcAddr = Sadrs;
/*520*/         filter.SrcMask = Smsk;
/*521*/         filter.DstAddr = Dadrs;
/*522*/         filter.DstMask = Dmsk;
/*523*/         
/*524*/         if(isV4(forCheck))
/*525*/             filter.AddrType = PacketFiltering.IPv4_FLAG;
/*526*/         else if(isV6(forCheck))
/*527*/             filter.AddrType = PacketFiltering.IPv6_FLAG;
/*528*/         else
/*529*/             throw new IllegalArgumentException("Illegal IPaddress");
/*530*/         
/*531*/         addFilter(filter);
/*532*/     } // addICMPfilter END
/*533*/     
/*534*/     // リストにTCPフィルタを追加する
/*535*/     public void addTCPfilter(InetAddress Sadrs, InetAddress Smsk,
/*536*/             InetAddress Dadrs, InetAddress Dmsk,
/*537*/             int sPort, int dPort, int csPort, int cdPort)
/*538*/     {
/*539*/         InetAddress[] forCheck = {Sadrs,Smsk,Dadrs,Dmsk};
/*540*/         
/*541*/         FILTER_DESCRIPTOR filter = PacketFiltering.getTCPfilter();
/*542*/         filter.SrcAddr = Sadrs;
/*543*/         filter.SrcMask = Smsk;
/*544*/         filter.DstAddr = Dadrs;
/*545*/         filter.DstMask = Dmsk;
/*546*/         
/*547*/         if(isV4(forCheck))
/*548*/             filter.AddrType = PacketFiltering.IPv4_FLAG;
/*549*/         else if(isV6(forCheck))
/*550*/             filter.AddrType = PacketFiltering.IPv6_FLAG;
/*551*/         else
/*552*/             throw new IllegalArgumentException("Illegal IPaddress");
/*553*/         
/*554*/         filter.SrcPort = sPort;
/*555*/         filter.DstPort = dPort;
/*556*/         filter.CeilingSrcPort = csPort;
/*557*/         filter.CeilingDstPort = cdPort;
/*558*/         
/*559*/         addFilter(filter);
/*560*/     } // addTCPfilter END
/*561*/     
/*562*/     // リストにUDPフィルタを追加する
/*563*/     public void addUDPfilter(InetAddress Sadrs, InetAddress Smsk,
/*564*/             InetAddress Dadrs, InetAddress Dmsk,
/*565*/             int sPort, int dPort, int csPort, int cdPort)
/*566*/     {
/*567*/         InetAddress[] forCheck = {Sadrs,Smsk,Dadrs,Dmsk};
/*568*/         
/*569*/         FILTER_DESCRIPTOR filter = PacketFiltering.getUDPfilter();
/*570*/         filter.SrcAddr = Sadrs;
/*571*/         filter.SrcMask = Smsk;
/*572*/         filter.DstAddr = Dadrs;
/*573*/         filter.DstMask = Dmsk;
/*574*/         
/*575*/         if(isV4(forCheck))
/*576*/             filter.AddrType = PacketFiltering.IPv4_FLAG;
/*577*/         else if(isV6(forCheck))
/*578*/             filter.AddrType = PacketFiltering.IPv6_FLAG;
/*579*/         else
/*580*/             throw new IllegalArgumentException("Illegal IPaddress");
/*581*/         
/*582*/         filter.SrcPort = sPort;
/*583*/         filter.DstPort = dPort;
/*584*/         filter.CeilingSrcPort = csPort;
/*585*/         filter.CeilingDstPort = cdPort;
/*586*/         
/*587*/         addFilter(filter);
/*588*/     } // addUDPfilter END
/*589*/ 
/*590*/     // リストからフィルタを取り除く
/*591*/     public void removeFilter(int index)
/*592*/     {
/*593*/         filterList.remove(index);
/*594*/     } // removeFilter END
/*595*/     
/*596*/     // フィルタリストをクリアする
/*597*/     public void clearFilter()
/*598*/     {
/*599*/         filterList.clear();
/*600*/     } // clearFilter END
/*601*/     
/*602*/     // リストのフィルタ数を得る
/*603*/     public int getFilterNum()
/*604*/     {
/*605*/         return filterList.size();
/*606*/     } // getFilterNum END
/*607*/     
/*608*/     // リストのIPフィルタを編集する
/*609*/     public void editIPFilter(int index, InetAddress Sadrs,
/*610*/             InetAddress Smsk, InetAddress Dadrs, InetAddress Dmsk)
/*611*/     {
/*612*/         FILTER_DESCRIPTOR nowfilter = (FILTER_DESCRIPTOR)(filterList.get(index));
/*613*/         
/*614*/         FILTER_DESCRIPTOR newfilter = PacketFiltering.getIPfilter();
/*615*/         if(Sadrs == null)   newfilter.SrcAddr = nowfilter.SrcAddr;
/*616*/         else                newfilter.SrcAddr = Sadrs;
/*617*/         
/*618*/         if(Smsk == null)    newfilter.SrcMask = nowfilter.SrcMask;
/*619*/         else                newfilter.SrcMask = Smsk;
/*620*/         
/*621*/         if(Dadrs == null)   newfilter.DstAddr = nowfilter.DstAddr;
/*622*/         else                newfilter.DstAddr = Dadrs;
/*623*/         
/*624*/         if(Dmsk == null)    newfilter.DstMask = nowfilter.DstMask;
/*625*/         else                newfilter.DstMask = Dmsk;
/*626*/         
/*627*/         InetAddress[] forCheck = {newfilter.SrcAddr,newfilter.SrcMask,
/*628*/                 newfilter.DstAddr,newfilter.DstMask};
/*629*/         
/*630*/         if(isV4(forCheck))
/*631*/             newfilter.AddrType = PacketFiltering.IPv4_FLAG;
/*632*/         else if(isV6(forCheck))
/*633*/             newfilter.AddrType = PacketFiltering.IPv6_FLAG;
/*634*/         else
/*635*/             throw new IllegalArgumentException("Illegal IPaddress");
/*636*/         
/*637*/         filterList.set(index, newfilter);
/*638*/     } // editIPFilter END
/*639*/ 
/*640*/     // リストのICMPフィルタを編集する
/*641*/     public void editICMPFilter(int index, InetAddress Sadrs,
/*642*/             InetAddress Smsk, InetAddress Dadrs, InetAddress Dmsk)
/*643*/     {
/*644*/         FILTER_DESCRIPTOR nowfilter = (FILTER_DESCRIPTOR)(filterList.get(index));
/*645*/         
/*646*/         FILTER_DESCRIPTOR newfilter = PacketFiltering.getICMPfilter();
/*647*/         if(Sadrs == null)   newfilter.SrcAddr = nowfilter.SrcAddr;
/*648*/         else                newfilter.SrcAddr = Sadrs;
/*649*/         
/*650*/         if(Smsk == null)    newfilter.SrcMask = nowfilter.SrcMask;
/*651*/         else                newfilter.SrcMask = Smsk;
/*652*/         
/*653*/         if(Dadrs == null)   newfilter.DstAddr = nowfilter.DstAddr;
/*654*/         else                newfilter.DstAddr = Dadrs;
/*655*/         
/*656*/         if(Dmsk == null)    newfilter.DstMask = nowfilter.DstMask;
/*657*/         else                newfilter.DstMask = Dmsk;
/*658*/         
/*659*/         InetAddress[] forCheck = {newfilter.SrcAddr,newfilter.SrcMask,
/*660*/                 newfilter.DstAddr,newfilter.DstMask};
/*661*/         
/*662*/         if(isV4(forCheck))
/*663*/             newfilter.AddrType = PacketFiltering.IPv4_FLAG;
/*664*/         else if(isV6(forCheck))
/*665*/             newfilter.AddrType = PacketFiltering.IPv6_FLAG;
/*666*/         else
/*667*/             throw new IllegalArgumentException("Illegal IPaddress");
/*668*/ 
/*669*/         filterList.set(index, newfilter);
/*670*/     } // editICMPFilter END
/*671*/     
/*672*/     // リストのTCPフィルタを編集する
/*673*/     public void editTCPFilter(int index, InetAddress Sadrs,
/*674*/             InetAddress Smsk, InetAddress Dadrs, InetAddress Dmsk,
/*675*/             int sPort, int dPort, int csPort, int cdPort)
/*676*/     {
/*677*/         FILTER_DESCRIPTOR nowfilter = (FILTER_DESCRIPTOR)(filterList.get(index));
/*678*/         
/*679*/         FILTER_DESCRIPTOR newfilter = PacketFiltering.getTCPfilter();
/*680*/         if(Sadrs == null)   newfilter.SrcAddr = nowfilter.SrcAddr;
/*681*/         else                newfilter.SrcAddr = Sadrs;
/*682*/         
/*683*/         if(Smsk == null)    newfilter.SrcMask = nowfilter.SrcMask;
/*684*/         else                newfilter.SrcMask = Smsk;
/*685*/         
/*686*/         if(Dadrs == null)   newfilter.DstAddr = nowfilter.DstAddr;
/*687*/         else                newfilter.DstAddr = Dadrs;
/*688*/         
/*689*/         if(Dmsk == null)    newfilter.DstMask = nowfilter.DstMask;
/*690*/         else                newfilter.DstMask = Dmsk;
/*691*/         
/*692*/         InetAddress[] forCheck = {newfilter.SrcAddr,newfilter.SrcMask,
/*693*/                 newfilter.DstAddr,newfilter.DstMask};
/*694*/         
/*695*/         if(isV4(forCheck))
/*696*/             newfilter.AddrType = PacketFiltering.IPv4_FLAG;
/*697*/         else if(isV6(forCheck))
/*698*/             newfilter.AddrType = PacketFiltering.IPv6_FLAG;
/*699*/         else
/*700*/             throw new IllegalArgumentException("Illegal IPaddress");
/*701*/         
/*702*/         if(sPort == PacketFiltering.NO_SET) newfilter.SrcPort = nowfilter.SrcPort;
/*703*/         else                                newfilter.SrcPort = sPort;
/*704*/         
/*705*/         if(dPort == PacketFiltering.NO_SET) newfilter.DstPort = nowfilter.DstPort;
/*706*/         else                                newfilter.DstPort = dPort;
/*707*/         
/*708*/         if(csPort == PacketFiltering.NO_SET)
/*709*/             newfilter.CeilingSrcPort = nowfilter.CeilingSrcPort;
/*710*/         else
/*711*/             newfilter.CeilingSrcPort = csPort;
/*712*/         
/*713*/         if(cdPort == PacketFiltering.NO_SET)
/*714*/             newfilter.CeilingDstPort = nowfilter.CeilingDstPort;
/*715*/         else
/*716*/             newfilter.CeilingDstPort = cdPort;
/*717*/         
/*718*/         filterList.set(index, newfilter);
/*719*/     } // editTCPFilter END
/*720*/     
/*721*/     // リストのUDPフィルタを編集する
/*722*/     public void editUDPFilter(int index, InetAddress Sadrs,
/*723*/             InetAddress Smsk, InetAddress Dadrs, InetAddress Dmsk,
/*724*/             int sPort, int dPort, int csPort, int cdPort)
/*725*/     {
/*726*/         FILTER_DESCRIPTOR nowfilter = (FILTER_DESCRIPTOR)(filterList.get(index));
/*727*/         
/*728*/         FILTER_DESCRIPTOR newfilter = PacketFiltering.getUDPfilter();
/*729*/         if(Sadrs == null)   newfilter.SrcAddr = nowfilter.SrcAddr;
/*730*/         else                newfilter.SrcAddr = Sadrs;
/*731*/         
/*732*/         if(Smsk == null)    newfilter.SrcMask = nowfilter.SrcMask;
/*733*/         else                newfilter.SrcMask = Smsk;
/*734*/         
/*735*/         if(Dadrs == null)   newfilter.DstAddr = nowfilter.DstAddr;
/*736*/         else                newfilter.DstAddr = Dadrs;
/*737*/         
/*738*/         if(Dmsk == null)    newfilter.DstMask = nowfilter.DstMask;
/*739*/         else                newfilter.DstMask = Dmsk;
/*740*/         
/*741*/         InetAddress[] forCheck = {newfilter.SrcAddr,newfilter.SrcMask,
/*742*/                 newfilter.DstAddr,newfilter.DstMask};
/*743*/         
/*744*/         if(isV4(forCheck))
/*745*/             newfilter.AddrType = PacketFiltering.IPv4_FLAG;
/*746*/         else if(isV6(forCheck))
/*747*/             newfilter.AddrType = PacketFiltering.IPv6_FLAG;
/*748*/         else
/*749*/             throw new IllegalArgumentException("Illegal IPaddress");
/*750*/         
/*751*/         if(sPort == PacketFiltering.NO_SET) newfilter.SrcPort = nowfilter.SrcPort;
/*752*/         else                                newfilter.SrcPort = sPort;
/*753*/         
/*754*/         if(dPort == PacketFiltering.NO_SET) newfilter.DstPort = nowfilter.DstPort;
/*755*/         else                                newfilter.DstPort = dPort;
/*756*/         
/*757*/         if(csPort == PacketFiltering.NO_SET)
/*758*/             newfilter.CeilingSrcPort = nowfilter.CeilingSrcPort;
/*759*/         else
/*760*/             newfilter.CeilingSrcPort = csPort;
/*761*/         
/*762*/         if(cdPort == PacketFiltering.NO_SET)
/*763*/             newfilter.CeilingDstPort = nowfilter.CeilingDstPort;
/*764*/         else
/*765*/             newfilter.CeilingDstPort = cdPort;
/*766*/         
/*767*/         filterList.set(index, newfilter);
/*768*/     } // editUDPFilter END
/*769*/     
/*770*/     // フィルタを書き込み
/*771*/     public void writeFilterDescriptor(String filename, int index)
/*772*/         throws IOException, FileNotFoundException
/*773*/     {
/*774*/         ObjectOutputStream out = null;
/*775*/         
/*776*/         try
/*777*/         {
/*778*/             out = new ObjectOutputStream(
/*779*/                     new FileOutputStream(filename+fExtension));
/*780*/             
/*781*/             out.writeObject((FILTER_DESCRIPTOR)(filterList.get(index)));
/*782*/         }
/*783*/         finally
/*784*/         {
/*785*/             if(out!=null) out.close();
/*786*/         }
/*787*/     } // writeFilterDescriptor END
/*788*/     
/*789*/     // フィルタを読み込み
/*790*/     public void readFilterDescriptor(String filename)
/*791*/         throws IOException, ClassNotFoundException
/*792*/     {
/*793*/         ObjectInputStream in = null;
/*794*/         
/*795*/         try
/*796*/         {
/*797*/             in = new ObjectInputStream(new FileInputStream(filename));
/*798*/             
/*799*/             FILTER_DESCRIPTOR filter = (FILTER_DESCRIPTOR)in.readObject();
/*800*/             
/*801*/             filterList.add(filter);
/*802*/         }
/*803*/         finally
/*804*/         {
/*805*/             if(in!=null) in.close();
/*806*/         }
/*807*/     } // readFilterDescriptor END
/*808*/     
/*809*/     // フィルタファイルを削除する
/*810*/     public void deleteFilter(String path)
/*811*/     {
/*812*/         new File(path).delete();
/*813*/     } // deleteFile END
/*814*/     
/*815*/     // フィルタファイル一覧を検索する
/*816*/     public static String[] searchFilter(String path)
/*817*/     {
/*818*/         File f = new File(path);
/*819*/         
/*820*/         return f.list(new FilenameFilter(){
/*821*/                 public boolean accept(File dir, String name)
/*822*/                 {
/*823*/                     if(name.toLowerCase().endsWith(fExtension) )
/*824*/                         return  true;
/*825*/                     else
/*826*/                         return  false;
/*827*/                 }
/*828*/         });
/*829*/     } // searchFilter END
/*830*/         
/*831*/     // フィルタファイルが存在するか
/*832*/     public static boolean existFilter(String filename)
/*833*/     {
/*834*/         return new File(filename+fExtension).exists();
/*835*/     } // existFilter END
/*836*/     
/*837*/     // フィルタをString形式にする
/*838*/     public static String toStringFilter(FILTER_DESCRIPTOR filter)
/*839*/     {
/*840*/         StringBuffer s = new StringBuffer();
/*841*/         
/*842*/         s.append(filter.SrcAddr.getHostAddress());
/*843*/         s.append("/");
/*844*/         s.append(filter.SrcMask.getHostAddress());
/*845*/         s.append("->"); 
/*846*/         s.append(filter.DstAddr.getHostAddress());
/*847*/         s.append("/");
/*848*/         s.append(filter.DstMask.getHostAddress());
/*849*/         s.append("&");
/*850*/         
/*851*/         if(filter.Protocol==PacketFiltering.ANY_PROTOCOL)
/*852*/             s.append("ANY PROTOCOL=");
/*853*/         else if(filter.Protocol==PacketFiltering.ICMP)
/*854*/             s.append("ICMP=");
/*855*/         else if(filter.Protocol==PacketFiltering.TCP)
/*856*/             s.append("TCP=");
/*857*/         else if(filter.Protocol==PacketFiltering.UDP)
/*858*/             s.append("UDP=");
/*859*/         
/*860*/         
/*861*/         s.append(filter.SrcPort);
/*862*/         s.append("^");
/*863*/         s.append(filter.CeilingSrcPort);
/*864*/         s.append("->");
/*865*/         s.append(filter.DstPort);
/*866*/         s.append("^");
/*867*/         s.append(filter.CeilingDstPort);
/*868*/ 
/*869*/         return s.toString();
/*870*/     } // toStringFilter END
/*871*/ 
/*872*/     // リストの対象のフィルタのString形式を得る
/*873*/     public String getFilterString(int index)
/*874*/     {
/*875*/         return toStringFilter((FILTER_DESCRIPTOR)(filterList.get(index)));
/*876*/     } // getFilterString END
/*877*/ 
/*878*/     // リストのフィルタのプロトコルを得る
/*879*/     public int getFilterProtocol(int index)
/*880*/     {
/*881*/         return ((FILTER_DESCRIPTOR)(filterList.get(index))).Protocol;
/*882*/     } // getFilterProtocol END
/*883*/ 
/*884*/     // 入力されたInetAddressが全てIPv6がどうか調べる
/*885*/     private boolean isV6(InetAddress[] inetadrs)
/*886*/     {
/*887*/         try
/*888*/         {
/*889*/             Inet6Address adrsv6;
/*890*/             for(int i=0;i<inetadrs.length;i++)
/*891*/             {
/*892*/                 adrsv6 = (Inet6Address)inetadrs[i];
/*893*/             }
/*894*/         }
/*895*/         catch(ClassCastException cce)
/*896*/         {
/*897*/             return false;
/*898*/         }
/*899*/         
/*900*/         return true;
/*901*/     } // isV6 END
/*902*/     
/*903*/     // 入力されたInetAddressが全てIPv4がどうか調べる
/*904*/     private boolean isV4(InetAddress[] inetadrs)
/*905*/     {
/*906*/         try
/*907*/         {
/*908*/             Inet4Address adrsv4;
/*909*/             for(int i=0;i<inetadrs.length;i++)
/*910*/             {
/*911*/                 adrsv4 = (Inet4Address)inetadrs[i];
/*912*/             }
/*913*/         }
/*914*/         catch(ClassCastException cce)
/*915*/         {
/*916*/             return false;
/*917*/         }
/*918*/         
/*919*/         return true;
/*920*/     } // isV4 END
/*921*/ }
inserted by FC2 system