package de.superx.servlet; import static de.superx.servlet.SxSQL_Server.DEFAULT_MANDANTEN_ID; import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.sql.Connection; import java.sql.SQLException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Enumeration; import java.util.Hashtable; import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.ResourceBundle; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem; import org.apache.log4j.Level; import org.apache.log4j.Logger; import de.memtext.util.DateUtils; import de.memtext.util.ServletHelper; import de.memtext.util.StringUtils; import de.superx.common.DBServletException; import de.superx.common.SuperX_el; import de.superx.common.SxResultSet; import de.superx.common.TranslationContainer; import de.superx.util.SqlStringUtils; /** * @author Daniel Quathamer Projektgruppe SuperX ServletUtils.java @ Diese * Java-Anwendung liefert zentrale Utilities für Servlets * */ public class ServletUtils { // boolean der angibt, ob außerhalb von Anmeldeservlet, auch noch einmal // per Datenbankabfrage geprüft werden soll, ob userid und password_sha in // der // Session OK sind static final boolean isExtraAuthenticationCheckWanted = false; private static String path; public static void setPath(String path) { ServletUtils.path = path; } public static String getPath() { return path; } public static String getMandantenID(HttpServletRequest request) { String mandantenID = DEFAULT_MANDANTEN_ID; if (ServletHelper.getParameter(request, RequestParameter.MandantenID) != null) mandantenID = ServletHelper.getParameter(request, RequestParameter.MandantenID); // SuperXmlAnmeldung könnte als attribut default hinterlegt haben if (request.getAttribute(SessionAttribute.MandantenID.toString()) != null) mandantenID = (String) request.getAttribute("MandantenID"); if (request.getSession() != null && request.getSession().getAttribute(SessionAttribute.MandantenID.toString()) != null) { mandantenID = (String) request.getSession().getAttribute(SessionAttribute.MandantenID.toString()); } if (mandantenID == null) throw new IllegalStateException("Keine MandantenID gefunden. Muss bei einem Mandanten \"" + DEFAULT_MANDANTEN_ID + "\" sein"); return mandantenID; } public static Hashtable hash = new Hashtable(); /** * DQ für Internationalisierung wird für jedes Stylesheet eine * locale-spezifische Variante gesucht. Wenn die Locale anders als die * Standard-Locale ist, und wenn das Stylesheet mit dem Namen < * >_ < >.xsl existiert, wird es zurückgegeben. * * @param original * -Stylesheet * @param aktuelle * Locale der Session * @return Lokalisiertes Stylesheet * @throws */ static String getLocalizedStylesheet(String stil, Locale locale) { if (locale.getLanguage() != "de") { int trunc_index = stil.lastIndexOf(".xsl"); if (trunc_index > 0) { String localized_stil = stil.substring(0, trunc_index) + "_" + locale.getLanguage() + ".xsl"; File f = new File(localized_stil); if (f.exists()) stil = localized_stil; } } return stil; } static String getJSONErrorText(String user, Locale locale) { StringBuffer errorText = new StringBuffer(); if (user != null) { errorText.append(get("superx.denied", locale)); errorText.append(" '"); errorText.append(user); errorText.append("'."); } else { errorText.append(get("superx.deniednouser", locale)); } errorText.append("\n"); errorText.append(get("superx.logintext", locale)); String s = ""; // provisorisch // "alert(\""+get("superx.denied", locale) + " '" + user + "' "+ // get("superx.logintext", locale)+"\");"; s += "({error:\"" + StringUtils.jsonAdapt(errorText.toString(), true) + "\"})"; return s; } static String getXmlErrorText(String fehler, String zs, Locale locale) { String s = de.superx.servlet.SuperXManager.htmlPageHead("Transformation Problem") + "

Ein Fehler ist bei der XML-Transformation aufgereten.

" + fehler + "

"; s += "

Der XML-Code:

"; return s; } public static String getLoginFailureXml(String user, String mandantenid, Locale locale) { StringBuffer failureXML = new StringBuffer(); failureXML.append("

"); if (user != null) { failureXML.append(get("superx.denied", locale)); failureXML.append(" "); failureXML.append(user); } else { failureXML.append(get("superx.deniednouser", locale)); } failureXML.append("

"); failureXML.append(get("superx.logintext", locale)); if (SuperXManager.isXMLReturnLinkWanted) { failureXML.append("
"); failureXML.append(get("superx.login", locale)); failureXML.append("

"); } failureXML.append("
"); return failureXML.toString(); } /** * * @param user * @param locale * @return * * static String getLoginFailureText(String user, Locale locale) { * String s = get("superx.denied", locale) + " '" + user + "'
"; * s += get("superx.logintext", locale); if (isXMLReturnLinkWanted) * s += "
* " + * get("superx.login", locale) + "

"; * * return s; } */ static String get(String what, Locale locale) { if (locale == null) locale = TranslationContainer.defaultLocale; ResourceBundle bundle = null; if (hash != null) bundle = (ResourceBundle) hash.get(locale.getLanguage()); // Wenn es noch kein ResourceBundle für die Locale gibt, versucht er // eines zu laden: if (bundle == null) { // neues ResourceBundle für die Locale. bundle = ResourceBundle.getBundle("LocalStrings", locale); // speichern im statischen // hash table. hash.put(bundle, locale.getLanguage()); } String r = bundle.getString(what); if (r == null) r = "Unknown Local String: " + what; return r; } public static String escapeTimeFeld(String feldwert) throws ParseException { String charcode1; String charcode2; charcode1 = "'"; // "#";Access charcode2 = "'"; // "#";Access // feldwert="2000-12-12 10:10:10"; if (feldwert.startsWith(charcode1) && feldwert.endsWith(charcode1)) feldwert = feldwert.substring(2, feldwert.length() - 1); SimpleDateFormat in_df = new SimpleDateFormat("HH:mm:ss"); // "" java.util.Date feldwert_df = in_df.parse(feldwert); // DAs folgende Format ist kompatibel mit // DB-Datumsfeldern (Access) SimpleDateFormat out_df = new SimpleDateFormat("HH:mm:ss"); // (""); feldwert = out_df.format(feldwert_df); feldwert = charcode1 + feldwert + charcode2; return feldwert; } public static String escapeTimestampFeld(String feldwert) throws ParseException { String charcode1; String charcode2; charcode1 = "'"; // "#";Access charcode2 = "'"; // "#";Access if (feldwert.startsWith(charcode1) && feldwert.endsWith(charcode1)) feldwert = feldwert.substring(2, feldwert.length() - 1); // feldwert="2000-12-12 10:10:10"; SimpleDateFormat in_df = new SimpleDateFormat("d.M.yyyy HH:mm:ss"); // "" java.util.Date feldwert_df = in_df.parse(feldwert); // System.out.println("hihi"); // DAs folgende Format ist kompatibel mit // DB-Datumsfeldern (Access) SimpleDateFormat out_df = new SimpleDateFormat("d.M.yyyy HH:mm:ss"); // (""); feldwert = out_df.format(feldwert_df); if (feldwert.length() > 0) feldwert = charcode1 + feldwert + charcode2; return feldwert; } /** * MB parsing hier nicht mehr nötig * * @param feldwert * @return * @throws ParseException */ public static String escapeDateFeld(String feldwert) throws ParseException { String charcode1; String charcode2; charcode1 = "'"; // "#";Access charcode2 = "'"; // "#";Access if (feldwert.startsWith(charcode1) && feldwert.endsWith(charcode1)) feldwert = feldwert.substring(1, feldwert.length() - 1); // feldwert="2000-12-12 10:10:10"; /* * SimpleDateFormat in_df = new SimpleDateFormat("d.M.yyyy"); * //"dd.MM.yyyy hh:mm:ss" java.util.Date feldwert_df = * in_df.parse(feldwert); //DAs folgende Format ist kompatibel mit // * DB-Datumsfeldern (Access) SimpleDateFormat out_df = new * SimpleDateFormat("d.M.yyyy"); //("yyyy-MM-dd hh:mm:ss"); feldwert = * out_df.format(feldwert_df); */ if (feldwert.length() > 0) { if (feldwert.equals("--leer--")) feldwert = "''"; else feldwert = charcode1 + feldwert + charcode2; } return feldwert; } /** * MB Einschließen in ' ' führte dazu, dass passende SelectableItems nicht * gefunden wurden, weil der key eben z.B. 5100 und nicht '5100' ist daher * auskommentiert DQ Korrigiert. * * @param feldwert * @return */ public static String escapeCharFeld(String feldwert) { String charcode1; String charcode2; charcode1 = "'"; charcode2 = "'"; // Im Hashtable formular sind char- und date-Felder // jeweils mit '' versehen, diese müssen für die Ergbnisdarstellung // entfernt werden. if (feldwert.startsWith(charcode1) && feldwert.endsWith(charcode1)) feldwert = feldwert.substring(2, feldwert.length() - 1); feldwert = SqlStringUtils.escapeString(feldwert); if (feldwert.length() > 0) { if (SqlStringUtils.unescapeString(feldwert).equals("--leer--")) // feldwert = charcode1 + charcode2; feldwert = ""; // else // feldwert = charcode1 + feldwert + charcode2; } return feldwert; } /** * Liefert SxResultset zurück * * @param task * @param query * @param mandantenID * * @return * @throws SQLException * @throws DBServletException */ public static SxResultSet execute(String task, String query, String mandantenID) throws SQLException, DBServletException { return execute_el(task, query, true, mandantenID).getResultSet(); } public static boolean isExternalDbWanted(String sql) { return sql.indexOf("--#dbid:") > -1; } public static String getExternalDbID(String sql) { String result = ""; int index1 = sql.indexOf("--#dbid:"); int index2 = sql.indexOf("#", index1 + 8); result = sql.substring(index1 + 8, index2); return result; } /** * Führt Abfrage durch und liefert ein SuperX_el Objekt, mit dem Ergebnis * des ersten selects zurück * * Achtung! Wenn mehrere SQL-Statements übergeben werden, die einen * Ergebniswert zurückliefern, kommen alle Ergebnisse in den Result- sehr * fies: execute procedure sp_user_orga(...); select .. from * tmp_organigramm;drop table tmp_ die Prozedur lieferte 318 zurück, war als * Eintrag im Result! * * @param task * @param query * @param isSingleQuery * TODO * * @return * @throws SQLException * @throws DBServletException */ public static SuperX_el execute_el(String task, String query, boolean isSingleQuery, String mandantenID) throws SQLException, DBServletException { SuperX_el result_el = new SuperX_el(); Connection dbConnection = SxPools.getConnection(mandantenID); try { SxSQL_Server sxServer = new SxSQL_Server(mandantenID); if (isSingleQuery) sxServer.executeQuery(query, dbConnection, result_el); else sxServer.execute(query, dbConnection, result_el); // alles OK, Rückgabe an Pool dbConnection.close(); } catch (SQLException e) { String msg = "Problem bei:" + task + " DETAILS:" + e.getMessage() + " sql:" + query; Logger.getLogger("superx_" + mandantenID).log(Level.ERROR, msg); SxPools.invalidate(mandantenID, dbConnection); throw new SQLException(msg); } if (result_el.getError_String() != null && !result_el.getError_String().trim().equals("")) throw new SQLException("\nProblem bei:" + task + "\n\n DETAILS:" + result_el.getError_String() + "\n sql:" + query); return result_el; } /** * Führt Abfrage durch und liefert ein SuperX_el Objekt mit dem Ergebnis des * letzten selects zurück * * @param externalPool * normalerweise null, außerwenn Verbindung zu externer Datenbank * laufen soll * @param dbCon * es kann eine Connection übergeben werden, wenn null wird eine * neue geholt aus der SuperXDB, wohl nur von * SuperXmlTabelle.csvUploadhelper genutzt * @param task * @param query * @param mandantenID * @param isStacktraceWanted * TODO * * @return * @throws SQLException * @throws DBServletException */ public static SuperX_el executeALL_el(ExternalPool externalPool, Connection dbCon, String task, String query, String mandantenID, boolean isStacktraceWanted) throws SQLException, DBServletException { if (externalPool != null) { task = task + " DatenbankID:" + externalPool.getName(); query = "-- DatenbankID:" + externalPool.getName() + "\n" + query; } if (task.startsWith("Abfrage Maske")) { SuperXManager.setLastMaskenSql("--" + task + " " + DateUtils.getNowString() + "\n" + query); SuperXManager.setLastMaskenSqlMandantid(mandantenID); } SuperX_el result_el = new SuperX_el(); Connection dbConnection = null; if (dbCon == null) { if (externalPool == null) dbConnection = SxPools.getConnection(mandantenID); else dbConnection = externalPool.getConnection(); } else dbConnection = dbCon; try { SxSQL_Server sxServer = new SxSQL_Server(mandantenID); sxServer.executeALL(query, dbConnection, result_el); // alles OK, Rückgabe an Pool if (dbCon == null) dbConnection.close(); } catch (SQLException e) { if (externalPool == null) { SxPools.invalidate(mandantenID, dbConnection); } else { externalPool.invalidate(dbConnection); } String msg = "Problem bei:" + task + "\nDETAILS:" + e.getMessage(); Logger.getLogger("superx_" + mandantenID).log(Level.ERROR, msg); if (isStacktraceWanted) e.printStackTrace(); throw new SQLException(msg); } catch (Exception e) { if (externalPool == null) { SxPools.invalidate(mandantenID, dbConnection); } else { externalPool.invalidate(dbConnection); } String msg = "Problem bei:" + task + " DETAILS:" + e.getMessage() + " sql:" + query; Logger.getLogger("superx_" + mandantenID).log(Level.ERROR, msg); if (isStacktraceWanted) e.printStackTrace(); throw new DBServletException(msg); } if (result_el.getError_String() != null && !result_el.getError_String().trim().equals("")) throw new SQLException("\nProblem bei:" + task + "\n\n DETAILS:" + result_el.getError_String() + "\n sql:" + query); return result_el; } /** * wird derzeit nicht verwendet, könnte auch noch mit * StringUtils.containsTags() prüfen,ob unerlaubte Tags vorhanden sind * * @param request */ public static void checkParams(HttpServletRequest request) { StringBuffer test = new StringBuffer(); for (Enumeration en = request.getParameterNames(); en.hasMoreElements();) { String element = (String) en.nextElement(); test.append(element + " - " + request.getParameter(element) + "\n"); if (request.getParameter(element) != null && request.getParameter(element).indexOf("'") > -1) { int i = 1; } } // System.out.println(test.toString()); } /** * Kopiert Parameter aus einem Request in ein Hashtable Formular. * Schutz gegen Sql-Injection: ; wird zu ^ nur von * Maske.setFieldDefaults aufgerufen * * @param request * @return Hashtable formular */ /* 'addToFormular' entfernt #279826 */ public static void addParamToFormular(HttpServletRequest request, Hashtable formular, String aName) { String val = ServletHelper.getParameterString(request, aName); if (val != null && val.length() > 1) { val = val.replace(';', '^'); } if (val == null || val.equals("--leer--")) { val = ""; } formular.put(aName, val); } public static void sendBackHtml(HttpServletResponse response, String info) throws IOException { PrintWriter output = response.getWriter(); response.setContentType("text/html; charset=" + SqlStringUtils.getEncoding()); output.write(info); output.flush(); output.close(); } /** * * @param mandantenID * @param sql * @return null if no externe Datenbankverbindung angegeben * @throws DBServletException */ public static ExternalPool getExternalPoolIfSpecified(String mandantenID, Integer maskennummer, String sql) throws DBServletException { ExternalPool ep = null; if (isExternalDbWanted(sql)) { String epID = getExternalDbID(sql); SxPool sxPool = SxPools.get(mandantenID); if (sxPool.hasExternalPool(mandantenID + "-" + epID + "_" + maskennummer)) { ep = sxPool.getExternalPool(mandantenID + "-" + epID + "_" + maskennummer); } else if (sxPool.hasExternalPool(mandantenID + "-" + epID)) { ep = sxPool.getExternalPool(mandantenID + "-" + epID); } else throw new DBServletException("Externe Datenverbindung von Mandant :" + mandantenID + ":" + epID + " konnte nicht aufgebaut werden"); } if (ep != null && !ep.isOK()) throw new DBServletException(ep.getExceptionMsg()); return ep; } public static String getParamValue(List multipartData, String paramName) { String result = null; Iterator iter = multipartData.iterator(); while (iter.hasNext()) { FileItem item = (FileItem) iter.next(); if (item.isFormField()) { String fieldName = item.getFieldName(); if (fieldName != null && fieldName.equals(paramName)) { result = item.getString(); break; } } } return result; } } // Created on 15.01.2004