<%@ 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:

<% if (login == null) out.println("Login..."); %>
 
<% if (login != null) out.println("Upload file..."); %>
 
 
 
 
 
NO_OP...
 
<% if (login != null) out.println("Logout..."); %>

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("
" + "Login:
" + "First name: " + "Family name:
" + "Company:
" + "Other information:
" + "" + "
"); } 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("
" + file2string(fnd) + "
"); out.println("
" + validatorOutput + "
"); 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(""+""+""+""); out.println(""); for (File f : filelist) { out.println(""); /* filename */ out.println(""); out.println(""); out.println(""); out.println(""); out.println(""); numFiles++; } out.println("
FilenameTestedTest statusCERT Paid
" + f.getName() + "
"); /* file attributes */ out.println(""); out.println("filename=" + f.toString() + "
"); out.println("attribute1" + "
"); out.println("attribute2" + "
"); out.println("
"); out.println("
"); File fnd = new File(f, "gdt_testlog.log"); if (fnd.exists()) { out.println("YES"); } else { out.println("NO"); } out.println(" 
-NO
"); if (numFiles == 0) { out.println("

No files found.
Do you wish to upload a file ?

"); } out.println("


"); } %>