%@ page import="java.io.*" %>
<%@ page import="java.nio.charset.*" %>
<%@ page import="java.nio.file.*" %>
<%@ page import="java.util.*" %>
<%@ page import="javax.servlet.*" %>
<%@ page import="javax.servlet.ServletInputStream" %>
<%@ page import="javax.servlet.http.*" %>
<%@ page import="org.apache.commons.fileupload.servlet.ServletFileUpload" %>
<%@ page import="org.apache.commons.fileupload.disk.DiskFileItemFactory" %>
<%@ page import="org.apache.commons.fileupload.*" %>
<%@ page import="org.apache.commons.io.*" %>
<%!
enum DispatchTool
{
NOP,
LOGIN,
LOGOUT,
UPLOAD,
CERTIFY_GDT,
REDIRECT_LOGIN
}
/*
* Global variables:
*/
final File fileStorageBase = new File("/tmp/webgdt/");
String squishIllegalFilesystemCharacters(String fileName)
{
/*
* fixme: if we add more rules here we should consider
* using regex
*/
fileName = fileName.replace('/', '_');
fileName = fileName.replace('\\', '_');
fileName = fileName.replace('&', '_');
fileName = fileName.replace('<', '_');
fileName = fileName.replace('>', '_');
fileName = fileName.replace(';', '_'); /* trouble with versioned filesystems */
fileName = fileName.replace(' ', '_');
fileName = fileName.replace('\t', '_');
fileName = fileName.replace('\n', '_');
return (fileName);
}
String file2string(File path)
throws IOException
{
byte[] encoded = Files.readAllBytes(Paths.get(path.toString()));
return (new String(encoded, Charset.defaultCharset()));
}
String runValidator(File file)
throws IOException
{
String output = null;
ProcessBuilder pb = new ProcessBuilder("/usr/bin/ksh", "/home/test001/bin/gdt30pruefung.sh", file.getAbsolutePath());
pb.directory(fileStorageBase);
File log = File.createTempFile("webgdt", "log");
try
{
int exitVal = -1;
log.deleteOnExit();
pb.redirectErrorStream(true);
pb.redirectOutput(ProcessBuilder.Redirect.appendTo(log));
Process p = pb.start();
/*
* Loop until we successfully obtained the exit status
* of the child process
*/
for (;exitVal == -1;)
{
try
{
exitVal = p.waitFor();
}
catch(InterruptedException exc)
{
}
}
output = file2string(log);
}
finally
{
log.delete();
}
return (output);
}
%>
<%
String qs = request.getQueryString();
if (qs == null)
qs = "";
HttpSession sz = request.getSession(true);
String login = (String)sz.getAttribute("loginname");
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
File userFileStorage = null;
if (login != null)
{
userFileStorage = new File(fileStorageBase, login);
/*
* Security: Verify whether the user exists by
* checking whether he/she has a "home dir"
*/
if (!userFileStorage.exists())
{
userFileStorage = null;
login = null;
out.println("#### INVALID USER ####");
}
}
DispatchTool disp = DispatchTool.NOP;
if (login == null && !qs.startsWith("login"))
disp = DispatchTool.REDIRECT_LOGIN;
else if (qs.startsWith("login"))
disp = DispatchTool.LOGIN;
else if (qs.startsWith("logout"))
disp = DispatchTool.LOGOUT;
else if (qs.startsWith("upload"))
disp = DispatchTool.UPLOAD;
else if (qs.startsWith("certify_gdt/"))
disp = DispatchTool.CERTIFY_GDT;
else if (qs.startsWith("NO_OP"))
disp = DispatchTool.NOP;
%>
Toolbox:
|
QMS-Standards/WebGDT/Main
<%
/*
* Diagnostics
*/
out.println("");
out.println("Diagnostics:");
out.println("# hello world");
out.println("# query string = |" + qs + "|");
out.println("# login = |" + login + "|");
out.println("# userFileStorage = |" + userFileStorage + "|");
if (sz.isNew())
out.println("# session is new");
else
out.println("# session is old");
if (isMultipart)
out.println("# request is isMultipart");
else
out.println("# request not isMultipart");
out.println("");
/*
* Main
*/
out.println("
");
out.println("Action");
/*
* Dispatcher...
*/
switch (disp)
{
case REDIRECT_LOGIN:
userFileStorage = null;
sz.invalidate();
response.sendRedirect(request.getRequestURI()+"?login");
break;
case LOGIN:
out.println("#### login\n");
String rloginname = request.getParameter("loginname");
/*
* Verify login names
* - make sure we do not allow empty strings
* - for now we only allow ASCII alphanumeric
* names without spaces here
* - Make sure that login names do not contain '.' or '/'
* characters to prevent path-based attacks
*/
if (rloginname != null &&
!rloginname.isEmpty() &&
rloginname.matches("\\p{Alnum}+"))
{
login = rloginname;
userFileStorage = new File(fileStorageBase, login);
sz.setAttribute("loginname", rloginname);
out.println("logged in as + |" + rloginname + "|");
userFileStorage.mkdirs(); // fixme: test permissions and failure
}
else
{
/* Clicking on "login" should automagically invalidate current user */
userFileStorage = null;
login = null;
sz.invalidate();
out.println(" ");
}
break;
case LOGOUT:
out.println("#### logout" + login + "\n");
userFileStorage = null;
login = null;
sz.invalidate();
response.sendRedirect(request.getRequestURI()+"?login");
break;
case UPLOAD:
out.println("#### upload\n");
if (isMultipart)
{
DiskFileItemFactory fileItemFactory = new DiskFileItemFactory();
ServletFileUpload fileUpload = new ServletFileUpload(fileItemFactory);
fileUpload.setHeaderEncoding("utf-8");
try
{
for(FileItem item:(List)fileUpload.parseRequest(request))
{
if(!item.isFormField())
{
String fileName = item.getName();
/*
* Illegal character squishing.
*
* fixme: Replace this with urlencoding of all
* file/login names
*/
fileName = squishIllegalFilesystemCharacters(fileName);
//if(fileName!=null&&fileName.length()>0)
//{
// out.println("'"+fileName+"'");
// if(true/*fileName.toLowerCase().endsWith(".txt")*/)
// {
// out.println(""+item.getString("ASCII")+" ");
// }
//}
/*
* files are stored in per-file subdirs so we can
* store context data there, too
*/
File fn = new File(userFileStorage, fileName);
fn.mkdir(); // fixme: test error
File fnd = new File(fn, "filedata");
item.write(fnd);
}
}
}
catch (Exception e)
{
}
}
else
{
out.println("");
}
break;
case CERTIFY_GDT:
String fileName = qs.substring(12);
out.println("#### Accessing file: |" + fileName + "|");
File fn = new File(userFileStorage, fileName);
File fnd = new File(fn, "filedata");
if (fnd.exists())
{
out.println("#### file |" + fnd.toString() + "| exists");
String validatorOutput = runValidator(fnd);
/* fixme: file2string() test code... */
//out.println("");
out.println("");
FileUtils.writeStringToFile(new File(fn, "gdt_testlog.log"), "" + validatorOutput);
if ((validatorOutput != null) &&
(!validatorOutput.matches(".+Exception in.+")) &&
(validatorOutput.indexOf("Fehler:") < 0) &&
(validatorOutput.indexOf("Protokoll Ende") > 0))
{
out.println(" SUCCESS: QMS/GDT gdt30pruefung.jar returned a zero exit code. Test succeeded.");
}
else
{
out.println(" FAILURE: QMS/GDT gdt30pruefung.jar returned a non-zero exit code. Test failed.");
}
}
else
{
out.println("#### file |" + fnd.toString() + "| does not exist");
}
break;
case NOP:
out.println("#### no_op\n");
break;
}
/*
* Display user data and status:
*/
if (userFileStorage != null)
{
File filelist[] = userFileStorage.listFiles();
int numFiles = 0;
out.println("
");
out.println("Files:");
out.println("");
out.println("");
out.println("Filename | "+"Tested | "+"Test status | "+"CERT Paid | ");
out.println(" ");
for (File f : filelist)
{
out.println("");
/* filename */
out.println("" + f.getName() + " ");
/* file attributes */
out.println("");
out.println("filename=" + f.toString() + " ");
out.println("attribute1" + " ");
out.println("attribute2" + " ");
out.println("");
out.println(" | ");
out.println(" | ");
out.println("- | ");
out.println("NO | ");
out.println(" ");
numFiles++;
}
out.println(" ");
if (numFiles == 0)
{
out.println("No files found. Do you wish to upload a file ? ");
}
out.println("
");
}
%>
|