/*
** This file is part of Filius, a network construction and simulation software.
**
** Originally created at the University of Siegen, Institute "Didactics of
** Informatics and E-Learning" by a students' project group:
** members (2006-2007):
** André Asschoff, Johannes Bade, Carsten Dittich, Thomas Gerding,
** Nadja Haßler, Ernst Johannes Klebert, Michell Weyer
** supervisors:
** Stefan Freischlad (maintainer until 2009), Peer Stechert
** Project is maintained since 2010 by Christian Eibl <filius@c.fameibl.de>
** and Stefan Freischlad
** Filius 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) version 3.
**
** Filius 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 Filius. If not, see <http://www.gnu.org/licenses/>.
*/
package filius.software.firewall;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.LinkedList;
import java.util.Vector;
import filius.Main;
import filius.hardware.NetzwerkInterface;
import filius.hardware.knoten.InternetKnoten;
import filius.rahmenprogramm.Information;
import filius.software.www.WebServer;
import filius.software.www.WebServerPlugIn;
public class FirewallWebKonfig extends WebServerPlugIn{
private WebServer webserver;
private Firewall firewall;
public void setFirewall(Firewall firewall){
this.firewall = firewall;
}
public Firewall getFirewall() {
return firewall;
}
public void setWebserver(WebServer server) {
this.webserver = server;
}
public WebServer getWebserver() {
return webserver;
}
/**
* Wird ueber das Interface WebServerPlugIn aufgerufen.
* Muss den gelieferten DatenString verarbeteiten, die Firewall bestuecken, und anschließend
* eine HTML-Seite zurueckliefern
*/
public String holeHtmlSeite(String postDaten){
Main.debug.println("INVOKED ("+this.hashCode()+") "+getClass()+" (FirewallWebKonfig), holeHtmlSeite("+postDaten+")");
String seite = "";
if(postDaten != null && !postDaten.equals("")){
firewallBestuecken(postDaten); //Dort wird die Methode postStringZerlegen() ausgefuehrt
}
//Main.debug.println("FirewallWebKonfig: Seite liefern= \n"+seite);
seite = konfigSeiteErstellen();
return seite;
}
/*
* @author weyer
* liefert zu einem ausgeführten Submit-Befehl die einzelnen Stücke zurück
*
*/
private String[][] postStringZerlegen(String post){
Main.debug.println("INVOKED ("+this.hashCode()+") "+getClass()+" (FirewallWebKonfig), postStringZerlegen("+post+")");
String [] submitTeile;
String[] element, tmp;
String[][] tupel;
//Main.debug.println("String mit submit in FirewallWebKonfig angekommen: "+post);
//String zerlegen und überprüfen:
try {
submitTeile = URLDecoder.decode(post, "UTF-8").split("&");
} catch (UnsupportedEncodingException e) {
submitTeile = post.split("&");
}
//Die ersten 5 Einträge des Arrays sind immer gleich
tupel = new String[submitTeile.length][2];
for(int i=0; i<submitTeile.length; i++){
tmp = submitTeile[i].split("=");
element = new String[]{"",""};
for (int j=0; j<tmp.length && j<element.length; j++) {
element[j] = tmp[j].trim();
}
tupel[i] = element;
}
return tupel;
}
/**
*
* @param zeilen
*/
private void firewallBestuecken(String postTeil) {
Main.debug.println("INVOKED (" + this.hashCode() + ") " + getClass()
+ " (FirewallWebKonfig), firewallBestuecken(" + postTeil + ")");
int regel;
String empfaengerUnten = null, empfaengerOben = null;
String absenderUnten = null, absenderOben = null;
// Firewall bestücken:
if (webserver.getSystemSoftware() != null) {
// Main.debug.println("POST-String wird zerlegt");
String[][] fwAttribute = postStringZerlegen(postTeil);
Vector<Integer> activeNics = new Vector<Integer>();
for (int i = 0; i < fwAttribute.length; i++) {
// Main.debug.println("\t"+fwAttribute[i][0]+"="+fwAttribute[i][1]);
if (fwAttribute[i][0].equals("nic")) {
activeNics.add(Integer.parseInt(fwAttribute[i][1]));
}
else if (fwAttribute[i][0].equals("empfaenger_regel_loeschen")) {
// Main.debug.println("\t\tempfaenger_regel_loeschen");
try {
regel = Integer.parseInt(fwAttribute[i][1]) - 1;
firewall.entferneEmpfaengerRegel(regel);
} catch (Exception e) {
}
}
else if (fwAttribute[i][0].equals("absender_regel_loeschen")) {
// Main.debug.println("\t\tabsender_regel_loeschen");
try {
regel = Integer.parseInt(fwAttribute[i][1]) - 1;
firewall.entferneAbsenderRegel(regel);
} catch (Exception e) {
}
}
else if (fwAttribute[i][0].equals("port_regel_loeschen")) {
// Main.debug.println("\t\tport_regel_loeschen");
try {
regel = Integer.parseInt(fwAttribute[i][1]) - 1;
firewall.entferneRegelPort(regel);
} catch (Exception e) {
}
}
else if (fwAttribute[i][0].equals("empfaenger_untere_grenze")) {
// Main.debug.println("\t\tempfaenger_untere_grenze");
empfaengerUnten = fwAttribute[i][1];
} else if (fwAttribute[i][0].equals("empfaenger_obere_grenze")) {
// Main.debug.println("\t\tempfaenger_obere_grenze");
empfaengerOben = fwAttribute[i][1];
} else if (fwAttribute[i][0].equals("absender_untere_grenze")) {
// Main.debug.println("\t\tabsender_untere_grenze");
absenderUnten = fwAttribute[i][1];
} else if (fwAttribute[i][0].equals("absender_obere_grenze")) {
// Main.debug.println("\t\tabsender_obere_grenze");
absenderOben = fwAttribute[i][1];
} else if (fwAttribute[i][0].equals("port")) {
// Main.debug.println("\t\tport");
try {
regel = Integer.parseInt(fwAttribute[i][1]);
firewall.eintragHinzufuegenPort("" + regel);
} catch (Exception e) {
}
}
}
if (empfaengerUnten != null && !empfaengerUnten.trim().equals("")) {
if (empfaengerOben != null && !empfaengerOben.trim().equals("")) {
firewall.eintragHinzufuegen(empfaengerUnten, empfaengerOben, Firewall.EMPFAENGER_FILTER);
} else {
firewall.eintragHinzufuegen(empfaengerUnten, empfaengerUnten, Firewall.EMPFAENGER_FILTER);
}
}
if (absenderUnten != null && !absenderUnten.trim().equals("")) {
if (absenderOben != null && !absenderOben.trim().equals("")) {
firewall.eintragHinzufuegen(absenderUnten, absenderOben, Firewall.ABSENDER_FILTER);
} else {
firewall.eintragHinzufuegen(absenderUnten, absenderUnten, Firewall.ABSENDER_FILTER);
}
}
LinkedList<NetzwerkInterface> allNics = ((InternetKnoten) this.getFirewall().getSystemSoftware()
.getKnoten()).getNetzwerkInterfaces();
Vector<Integer> inactiveNics = new Vector<Integer>();
for (int i = 0; i < allNics.size(); i++) {
if (!activeNics.contains(new Integer(i))) {
inactiveNics.add(new Integer(i));
}
}
this.firewall.setInactiveNics(inactiveNics);
}
}
private String erstelleZeilenEmpfaengerRegeln() {
Main.debug.println("INVOKED ("+this.hashCode()+") "+getClass()+" (FirewallWebKonfig), erstelleZeilenEmpfaengerRegeln()");
LinkedList<String> regeln;
String tmp;
String [] ipArray;
StringBuffer zeilen = new StringBuffer();
try{
regeln = firewall.getEmpfaengerFilterList();
for(int i=0; i<regeln.size(); i++){
tmp = (String)regeln.get(i);
ipArray = tmp.split("#");
zeilen.append("<tr><td>"+(i+1)+"</td><td>"
+ipArray[0]+"</td><td>"+ipArray[1]+"</td></tr>");
}
}
catch(Exception f){
f.printStackTrace(Main.debug);
}
return zeilen.toString();
}
private String erstelleZeilenAbsenderRegeln() {
Main.debug.println("INVOKED ("+this.hashCode()+") "+getClass()+" (FirewallWebKonfig), erstelleZeilenAbsenderRegeln()");
LinkedList<String> regeln;
String tmp;
String [] ipArray;
StringBuffer zeilen = new StringBuffer();
try{
regeln = firewall.getAbsenderFilterList();
for(int i=0; i<regeln.size(); i++){
tmp = (String)regeln.get(i);
ipArray = tmp.split("#");
zeilen.append("<tr><td>"+(i+1)+"</td><td>"
+ipArray[0]+"</td><td>"+ipArray[1]+"</td></tr>");
}
}
catch(Exception f){
f.printStackTrace(Main.debug);
}
return zeilen.toString();
}
private String erstelleZeilenPortRegeln() {
Main.debug.println("INVOKED ("+this.hashCode()+") "+getClass()+" (FirewallWebKonfig), erstelleZeilenPortRegeln()");
LinkedList<Object[]> regeln;
String tmp;
StringBuffer zeilen = new StringBuffer();
try{
regeln = firewall.getPortList();
for(int i=0; i<regeln.size(); i++){
tmp = (String)((Object[])regeln.get(i))[0];
zeilen.append("<tr><td>"+(i+1)+"</td><td>"+tmp+"</td></tr>");
}
}
catch(Exception f){
f.printStackTrace(Main.debug);
}
return zeilen.toString();
}
/*
* diese Seite erstellt den kompletten Quelltext für die konfig.html
*/
private String konfigSeiteErstellen(){
Main.debug.println("INVOKED ("+this.hashCode()+") "+getClass()+" (FirewallWebKonfig), konfigSeiteErstellen()");
String html;
//Main.debug.println("FirewallWebKonfig: dynamische Generierung der HTML-konfig-Seite!");
if(firewall != null){
try{
html = textDateiEinlesen("config/firewall_konfig_webseite_"+Information.getInformation().getLocale().toString()+".txt");
html = html.replaceAll(":action_pfad:", getPfad());
LinkedList<NetzwerkInterface> allNics = ((InternetKnoten)this.getFirewall().getSystemSoftware().getKnoten()).getNetzwerkInterfaces();
LinkedList<NetzwerkInterface> activeNics = firewall.holeNetzwerkInterfaces();
StringBuffer nicSelectionHtml = new StringBuffer();
int idx = 0;
for (NetzwerkInterface nic : allNics) {
nicSelectionHtml.append("\t\t<tr><td><input name=\"nic\" type=\"checkbox\" value=\""+(idx++)+"\" size=\"30\" maxlength=\"40\"");
if (activeNics.contains(nic)) {
nicSelectionHtml.append(" checked=\"checked\"");
}
nicSelectionHtml.append(" /></td><td>" + nic.getIp() + "</td></tr>");
if (allNics.indexOf(nic) < allNics.size()-1) {
nicSelectionHtml.append(" \n");
}
}
html = html.replaceAll(":nic_activation:", nicSelectionHtml.toString());
html = html.replaceAll(":empfaenger_regeln:", erstelleZeilenEmpfaengerRegeln());
html = html.replaceAll(":absender_regeln:", erstelleZeilenAbsenderRegeln());
html = html.replaceAll(":port_regeln:", erstelleZeilenPortRegeln());
}
catch(Exception f){
f.printStackTrace(Main.debug);
return null;
}
return html;
}
else {
return null;
}
}
/**
* liest eine reale Textdatei vom Format .txt ein. Diese befinden sich im
* Ordner /config
*/
private String textDateiEinlesen(String datei) throws FileNotFoundException,
IOException {
Main.debug.println("INVOKED ("+this.hashCode()+") "+getClass()+" (FirewallWebKonfig), textDateiEinlesen("+datei+")");
BufferedReader test = new BufferedReader(new FileReader(datei));
String fullFile = "";
String input = "";
while ((input = test.readLine()) != null) {
fullFile += input + "\n";
}
return fullFile;
}
}