// Path: src/main/java/xss/LinkContainer/LinkContainer.java
// public class LinkContainer extends LinkedHashSet<String> {
// 
//     LinkContainerCallback callback;
// 
//     public LinkContainer() {
//     }
// 
//     @Override
//     public boolean add(String url) {
//         url = url.toLowerCase();
//         boolean wasAdded = super.add(url);
//         if (wasAdded)
//             if (callback != null)
//                 callback.onLinkAdded(url);
//         return wasAdded;
//     }
// 
//     public void setCallback(LinkContainerCallback callback) {
//         this.callback = callback;
//     }
// 
//     public interface LinkContainerCallback {
//         public void onLinkAdded(String url);
//     }
// }
// 
// Path: src/main/java/xss/LinkContainer/XssStoredContainer.java
// public class XssStoredContainer extends LinkedHashSet<XssStored> {
// 
//     XssContainerCallback callback;
// 
//     public XssStoredContainer() {
//     }
// 
//     @Override
//     public boolean add(XssStored xssStored) {
//         xssStored.url = xssStored.url.toLowerCase();
//         boolean wasAdded = super.add(xssStored);
//         if (wasAdded)
//             callback.onLinkAdded(xssStored);
//         return wasAdded;
//     }
// 
//     public void setCallback(XssContainerCallback callback) {
//         this.callback = callback;
//     }
// 
//     public interface XssContainerCallback {
//         public void onLinkAdded(XssStored url);
//     }
// 
// }
// 
// Path: src/main/java/xss/LinkContainer/XssStored.java
// public class XssStored {
//     public String url;
//     public int formNumber;
// 
//     public XssStored(String url, int formNumber) {
//         this.url = url;
//         this.formNumber = formNumber;
//     }
// }


import xss.LinkContainer.LinkContainer;
import xss.LinkContainer.XssStoredContainer;
import xss.LinkContainer.XssStored;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriverException;
import org.openqa.selenium.WebElement;
import java.net.URLDecoder;
import java.util.List;
import java.util.concurrent.TimeUnit;
package xss.Tasks;



/**
 * Created by popka on 01.04.15.
 */

/*
Заходит на заданный урл.
Поочередно заполняет и отправляет все формы.
В зависимости от результата, определяет, возможно ли на этой страничке XSS.
Если определила потенциальный ReflectXSS, то добавляем этот урл с параметрами в StoredXSS

 */
public class XssPreparer extends BrowserRunnable {
    private String url;
    private final String FORM = "FORM";

    private final String TEXT_TO_REPLACE = "TEXT_TO_REPLACE";
    public static final String INPUT_VALUE = "aaa99999xzc9999ccc";
    private LinkContainer reflectXSSUrlContainer;
    private XssStoredContainer storedXSSUrlContainer;
    private LinkContainer linkContainer;

    private final String FILL_FORM_SCRIPT =
            "var inputs = document.getElementsByTagName('input');\n" +
                    "for (var i=0; i<inputs.length; i++) {\n" +
                    "    inputs[i].value = '"+TEXT_TO_REPLACE+"';\n" +
                    "    inputs[i].checked = \"true\";\n" +
                    "}\n" +
                    "var selects = document.getElementsByTagName(\"select\");\n" +
                    "for (var i=0; i<selects.length; i++) {\n" +
                    "    selects[i].children[1].selected = \"true\";\n" +
                    "}\n" +
                    "var textareas = document.getElementsByTagName(\"textarea\");\n" +
                    "for (var i=0; i<textareas.length; i++) {\n" +
                    "    textareas[i].value=' " +TEXT_TO_REPLACE +"';\n" +
                    "}";

    private final String SUBMIT_FORM = "document.forms[" + TEXT_TO_REPLACE +"].querySelector(\"[type=submit]\").click()";


// Path: src/main/java/xss/LinkContainer/LinkContainer.java
// public class LinkContainer extends LinkedHashSet<String> {
// 
//     LinkContainerCallback callback;
// 
//     public LinkContainer() {
//     }
// 
//     @Override
//     public boolean add(String url) {
//         url = url.toLowerCase();
//         boolean wasAdded = super.add(url);
//         if (wasAdded)
//             if (callback != null)
//                 callback.onLinkAdded(url);
//         return wasAdded;
//     }
// 
//     public void setCallback(LinkContainerCallback callback) {
//         this.callback = callback;
//     }
// 
//     public interface LinkContainerCallback {
//         public void onLinkAdded(String url);
//     }
// }
// 
// Path: src/main/java/xss/LinkContainer/XssStoredContainer.java
// public class XssStoredContainer extends LinkedHashSet<XssStored> {
// 
//     XssContainerCallback callback;
// 
//     public XssStoredContainer() {
//     }
// 
//     @Override
//     public boolean add(XssStored xssStored) {
//         xssStored.url = xssStored.url.toLowerCase();
//         boolean wasAdded = super.add(xssStored);
//         if (wasAdded)
//             callback.onLinkAdded(xssStored);
//         return wasAdded;
//     }
// 
//     public void setCallback(XssContainerCallback callback) {
//         this.callback = callback;
//     }
// 
//     public interface XssContainerCallback {
//         public void onLinkAdded(XssStored url);
//     }
// 
// }
// 
// Path: src/main/java/xss/LinkContainer/XssStored.java
// public class XssStored {
//     public String url;
//     public int formNumber;
// 
//     public XssStored(String url, int formNumber) {
//         this.url = url;
//         this.formNumber = formNumber;
//     }
// }


// Path: src/main/java/xss/Tasks/XssPreparer.java
import xss.LinkContainer.LinkContainer;
import xss.LinkContainer.XssStoredContainer;
import xss.LinkContainer.XssStored;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriverException;
import org.openqa.selenium.WebElement;
import java.net.URLDecoder;
import java.util.List;
import java.util.concurrent.TimeUnit;

package xss.Tasks;



/**
 * Created by popka on 01.04.15.
 */

/*
Заходит на заданный урл.
Поочередно заполняет и отправляет все формы.
В зависимости от результата, определяет, возможно ли на этой страничке XSS.
Если определила потенциальный ReflectXSS, то добавляем этот урл с параметрами в StoredXSS

 */
public class XssPreparer extends BrowserRunnable {
    private String url;
    private final String FORM = "FORM";

    private final String TEXT_TO_REPLACE = "TEXT_TO_REPLACE";
    public static final String INPUT_VALUE = "aaa99999xzc9999ccc";
    private LinkContainer reflectXSSUrlContainer;
    private XssStoredContainer storedXSSUrlContainer;
    private LinkContainer linkContainer;

    private final String FILL_FORM_SCRIPT =
            "var inputs = document.getElementsByTagName('input');\n" +
                    "for (var i=0; i<inputs.length; i++) {\n" +
                    "    inputs[i].value = '"+TEXT_TO_REPLACE+"';\n" +
                    "    inputs[i].checked = \"true\";\n" +
                    "}\n" +
                    "var selects = document.getElementsByTagName(\"select\");\n" +
                    "for (var i=0; i<selects.length; i++) {\n" +
                    "    selects[i].children[1].selected = \"true\";\n" +
                    "}\n" +
                    "var textareas = document.getElementsByTagName(\"textarea\");\n" +
                    "for (var i=0; i<textareas.length; i++) {\n" +
                    "    textareas[i].value=' " +TEXT_TO_REPLACE +"';\n" +
                    "}";

    private final String SUBMIT_FORM = "document.forms[" + TEXT_TO_REPLACE +"].querySelector(\"[type=submit]\").click()";


    public XssPreparer(String url, LinkContainer linkContainer, LinkContainer reflectXSSUrlContainer, XssStoredContainer storedXSSUrlContainer) {