Sat, 13 Dec 2025 15:08:06 +0100
fix that clearing a filter manually did not work anymore - fixes #783
| 184 | 1 | /* |
| 2 | * Copyright 2021 Mike Becker. All rights reserved. | |
| 3 | * | |
| 4 | * Redistribution and use in source and binary forms, with or without | |
| 5 | * modification, are permitted provided that the following conditions are met: | |
| 6 | * | |
| 7 | * 1. Redistributions of source code must retain the above copyright | |
| 8 | * notice, this list of conditions and the following disclaimer. | |
| 9 | * | |
| 10 | * 2. Redistributions in binary form must reproduce the above copyright | |
| 11 | * notice, this list of conditions and the following disclaimer in the | |
| 12 | * documentation and/or other materials provided with the distribution. | |
| 13 | * | |
| 14 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |
| 15 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
| 16 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
| 17 | * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | |
| 18 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
| 19 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | |
| 20 | * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | |
| 21 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |
| 22 | * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
| 23 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
| 24 | */ | |
| 25 | ||
| 26 | package de.uapcore.lightpit | |
| 27 | ||
| 28 | import de.uapcore.lightpit.DataSourceProvider.Companion.SC_ATTR_NAME | |
| 29 | import de.uapcore.lightpit.dao.DataAccessObject | |
| 30 | import de.uapcore.lightpit.dao.createDataAccessObject | |
|
367
0a9065936aac
add "what's new" popup - resolves #670
Mike Becker <universe@uap-core.de>
parents:
358
diff
changeset
|
31 | import de.uapcore.lightpit.entities.User |
|
298
1275eb652008
add language selection cookie - fixes #352
Mike Becker <universe@uap-core.de>
parents:
254
diff
changeset
|
32 | import jakarta.servlet.http.Cookie |
|
254
55ca6cafc3dd
#233 migrate to Jakarta EE and update dependencies
Mike Becker <universe@uap-core.de>
parents:
247
diff
changeset
|
33 | import jakarta.servlet.http.HttpServlet |
|
55ca6cafc3dd
#233 migrate to Jakarta EE and update dependencies
Mike Becker <universe@uap-core.de>
parents:
247
diff
changeset
|
34 | import jakarta.servlet.http.HttpServletRequest |
|
55ca6cafc3dd
#233 migrate to Jakarta EE and update dependencies
Mike Becker <universe@uap-core.de>
parents:
247
diff
changeset
|
35 | import jakarta.servlet.http.HttpServletResponse |
| 184 | 36 | import java.sql.SQLException |
|
335
1eed60b779da
change language menu to settings menu and add timezone settings - fixes #402
Mike Becker <universe@uap-core.de>
parents:
298
diff
changeset
|
37 | import java.time.ZoneId |
| 184 | 38 | import java.util.* |
|
367
0a9065936aac
add "what's new" popup - resolves #670
Mike Becker <universe@uap-core.de>
parents:
358
diff
changeset
|
39 | import java.sql.Date as SqlDate |
| 184 | 40 | |
| 247 | 41 | abstract class AbstractServlet : HttpServlet() { |
|
298
1275eb652008
add language selection cookie - fixes #352
Mike Becker <universe@uap-core.de>
parents:
254
diff
changeset
|
42 | |
|
1275eb652008
add language selection cookie - fixes #352
Mike Becker <universe@uap-core.de>
parents:
254
diff
changeset
|
43 | companion object { |
|
335
1eed60b779da
change language menu to settings menu and add timezone settings - fixes #402
Mike Becker <universe@uap-core.de>
parents:
298
diff
changeset
|
44 | const val COOKIE_MAX_AGE = 2592000 // 30 days |
|
298
1275eb652008
add language selection cookie - fixes #352
Mike Becker <universe@uap-core.de>
parents:
254
diff
changeset
|
45 | const val LANGUAGE_COOKIE_NAME = "lpit_language" |
|
335
1eed60b779da
change language menu to settings menu and add timezone settings - fixes #402
Mike Becker <universe@uap-core.de>
parents:
298
diff
changeset
|
46 | const val TIMEZONE_COOKIE_NAME = "lpit_timezone" |
|
298
1275eb652008
add language selection cookie - fixes #352
Mike Becker <universe@uap-core.de>
parents:
254
diff
changeset
|
47 | } |
| 247 | 48 | |
| 49 | protected val logger = MyLogger() | |
| 184 | 50 | |
| 51 | /** | |
| 52 | * Contains the GET request mappings. | |
| 53 | */ | |
| 54 | private val getMappings = mutableMapOf<PathPattern, MappingMethod>() | |
| 55 | ||
| 56 | /** | |
| 57 | * Contains the POST request mappings. | |
| 58 | */ | |
| 59 | private val postMappings = mutableMapOf<PathPattern, MappingMethod>() | |
| 60 | ||
| 61 | protected fun get(pattern: String, method: MappingMethod) { | |
| 62 | getMappings[PathPattern(pattern)] = method | |
| 63 | } | |
| 64 | ||
| 65 | protected fun post(pattern: String, method: MappingMethod) { | |
| 66 | postMappings[PathPattern(pattern)] = method | |
| 67 | } | |
| 68 | ||
| 69 | private fun notFound(http: HttpRequest, dao: DataAccessObject) { | |
| 70 | http.response.sendError(HttpServletResponse.SC_NOT_FOUND) | |
| 71 | } | |
| 72 | ||
| 73 | private fun findMapping( | |
| 74 | mappings: Map<PathPattern, MappingMethod>, | |
| 75 | req: HttpServletRequest | |
| 76 | ): Pair<PathPattern, MappingMethod> { | |
| 77 | val requestPath = sanitizedRequestPath(req) | |
| 78 | val candidates = mappings.filter { it.key.matches(requestPath) } | |
| 79 | return if (candidates.isEmpty()) { | |
| 80 | Pair(PathPattern(requestPath), ::notFound) | |
| 81 | } else { | |
| 82 | candidates.entries.first().toPair() | |
| 83 | } | |
| 84 | } | |
| 85 | ||
|
374
34abadbdd0e3
fix "what's new" not shown after redirects + do not show it when accessed via RSS
Mike Becker <universe@uap-core.de>
parents:
367
diff
changeset
|
86 | private fun forwardIfRequested(req: HttpServletRequest, resp: HttpServletResponse) { |
|
34abadbdd0e3
fix "what's new" not shown after redirects + do not show it when accessed via RSS
Mike Becker <universe@uap-core.de>
parents:
367
diff
changeset
|
87 | val site = req.getAttribute(Constants.REQ_ATTR_JSP) |
|
34abadbdd0e3
fix "what's new" not shown after redirects + do not show it when accessed via RSS
Mike Becker <universe@uap-core.de>
parents:
367
diff
changeset
|
88 | if (site != null) { |
|
34abadbdd0e3
fix "what's new" not shown after redirects + do not show it when accessed via RSS
Mike Becker <universe@uap-core.de>
parents:
367
diff
changeset
|
89 | req.getRequestDispatcher(Constants.JSP_PATH_PREFIX + site + ".jsp").forward(req, resp) |
|
34abadbdd0e3
fix "what's new" not shown after redirects + do not show it when accessed via RSS
Mike Becker <universe@uap-core.de>
parents:
367
diff
changeset
|
90 | } |
|
34abadbdd0e3
fix "what's new" not shown after redirects + do not show it when accessed via RSS
Mike Becker <universe@uap-core.de>
parents:
367
diff
changeset
|
91 | } |
|
34abadbdd0e3
fix "what's new" not shown after redirects + do not show it when accessed via RSS
Mike Becker <universe@uap-core.de>
parents:
367
diff
changeset
|
92 | |
| 184 | 93 | private fun invokeMapping( |
| 94 | mapping: Pair<PathPattern, MappingMethod>, | |
| 95 | req: HttpServletRequest, | |
| 96 | resp: HttpServletResponse, | |
| 97 | dao: DataAccessObject | |
| 98 | ) { | |
| 99 | val params = mapping.first.obtainPathParameters(sanitizedRequestPath(req)) | |
| 100 | val method = mapping.second | |
|
367
0a9065936aac
add "what's new" popup - resolves #670
Mike Becker <universe@uap-core.de>
parents:
358
diff
changeset
|
101 | val authenticatedUser = req.remoteUser?.let(dao::findUserByName) |
| 247 | 102 | logger.trace("invoke {0}", method) |
|
367
0a9065936aac
add "what's new" popup - resolves #670
Mike Becker <universe@uap-core.de>
parents:
358
diff
changeset
|
103 | method(HttpRequest(authenticatedUser, req, resp, params), dao) |
|
374
34abadbdd0e3
fix "what's new" not shown after redirects + do not show it when accessed via RSS
Mike Becker <universe@uap-core.de>
parents:
367
diff
changeset
|
104 | showWhatsNewPopup(authenticatedUser, req, resp, dao) |
|
34abadbdd0e3
fix "what's new" not shown after redirects + do not show it when accessed via RSS
Mike Becker <universe@uap-core.de>
parents:
367
diff
changeset
|
105 | forwardIfRequested(req, resp) |
| 184 | 106 | } |
| 107 | ||
| 108 | private fun sanitizedRequestPath(req: HttpServletRequest) = req.pathInfo ?: "/" | |
| 109 | ||
| 358 | 110 | protected fun sanitizeJson(str: String): String { |
| 111 | var result = "\"" | |
| 112 | for (i in str.indices) { | |
| 113 | when (val c = str[i]) { | |
| 114 | '\\', '"', '/' -> result += "\\$c" | |
| 115 | '\t' -> result += "\\t" | |
| 116 | '\n' -> result += "\\n" | |
| 117 | '\r' -> result += "\\r" | |
| 118 | else -> if (c < ' ' || (c in '\u0080'..'\u00bf') || (c in '\u2000'..'\u20ff')) { | |
| 119 | result += "\\u%04x".format(c.code) | |
| 120 | } else { | |
| 121 | result += c | |
| 122 | } | |
| 123 | } | |
| 124 | } | |
| 125 | return result + "\"" | |
| 126 | } | |
| 127 | ||
| 184 | 128 | private fun doProcess( |
| 129 | req: HttpServletRequest, | |
| 130 | resp: HttpServletResponse, | |
| 131 | mappings: Map<PathPattern, MappingMethod> | |
| 132 | ) { | |
| 133 | val session = req.session | |
| 134 | ||
| 135 | // the very first thing to do is to force UTF-8 | |
| 136 | req.characterEncoding = "UTF-8" | |
| 137 | ||
| 138 | // set some internal request attributes | |
| 139 | val fullPath = req.servletPath + Optional.ofNullable(req.pathInfo).orElse("") | |
| 140 | req.setAttribute(Constants.REQ_ATTR_PATH, fullPath) | |
|
392
c0c7b4ca2946
add convenience buttons for editing version, component, variant - resolves #733
Mike Becker <universe@uap-core.de>
parents:
374
diff
changeset
|
141 | req.getHeader("Referer")?.let { referer -> |
|
c0c7b4ca2946
add convenience buttons for editing version, component, variant - resolves #733
Mike Becker <universe@uap-core.de>
parents:
374
diff
changeset
|
142 | val portInfo = |
|
c0c7b4ca2946
add convenience buttons for editing version, component, variant - resolves #733
Mike Becker <universe@uap-core.de>
parents:
374
diff
changeset
|
143 | if ((req.scheme == "http" && req.serverPort == 80) |
|
c0c7b4ca2946
add convenience buttons for editing version, component, variant - resolves #733
Mike Becker <universe@uap-core.de>
parents:
374
diff
changeset
|
144 | || (req.scheme == "https" && req.serverPort == 443) |
|
c0c7b4ca2946
add convenience buttons for editing version, component, variant - resolves #733
Mike Becker <universe@uap-core.de>
parents:
374
diff
changeset
|
145 | ) "" else ":${req.serverPort}" |
|
c0c7b4ca2946
add convenience buttons for editing version, component, variant - resolves #733
Mike Becker <universe@uap-core.de>
parents:
374
diff
changeset
|
146 | val baseHrefOptionalPort = "${req.scheme}://${req.serverName}$portInfo${req.contextPath}/" |
|
c0c7b4ca2946
add convenience buttons for editing version, component, variant - resolves #733
Mike Becker <universe@uap-core.de>
parents:
374
diff
changeset
|
147 | val baseHrefWithPort = "${req.scheme}://${req.serverName}${req.serverPort}${req.contextPath}/" |
|
c0c7b4ca2946
add convenience buttons for editing version, component, variant - resolves #733
Mike Becker <universe@uap-core.de>
parents:
374
diff
changeset
|
148 | if (referer.startsWith(baseHrefOptionalPort) || referer.startsWith(baseHrefWithPort)) { |
|
c0c7b4ca2946
add convenience buttons for editing version, component, variant - resolves #733
Mike Becker <universe@uap-core.de>
parents:
374
diff
changeset
|
149 | referer |
|
c0c7b4ca2946
add convenience buttons for editing version, component, variant - resolves #733
Mike Becker <universe@uap-core.de>
parents:
374
diff
changeset
|
150 | } else { |
|
c0c7b4ca2946
add convenience buttons for editing version, component, variant - resolves #733
Mike Becker <universe@uap-core.de>
parents:
374
diff
changeset
|
151 | null |
|
c0c7b4ca2946
add convenience buttons for editing version, component, variant - resolves #733
Mike Becker <universe@uap-core.de>
parents:
374
diff
changeset
|
152 | } |
|
c0c7b4ca2946
add convenience buttons for editing version, component, variant - resolves #733
Mike Becker <universe@uap-core.de>
parents:
374
diff
changeset
|
153 | }?.let { |
| 184 | 154 | req.setAttribute(Constants.REQ_ATTR_REFERER, it) |
| 155 | } | |
| 156 | ||
|
298
1275eb652008
add language selection cookie - fixes #352
Mike Becker <universe@uap-core.de>
parents:
254
diff
changeset
|
157 | // choose the requested language as session language (if available) |
|
1275eb652008
add language selection cookie - fixes #352
Mike Becker <universe@uap-core.de>
parents:
254
diff
changeset
|
158 | if (session.getAttribute(Constants.SESSION_ATTR_LANGUAGE) == null) { |
|
1275eb652008
add language selection cookie - fixes #352
Mike Becker <universe@uap-core.de>
parents:
254
diff
changeset
|
159 | // language selection stored in cookie |
|
367
0a9065936aac
add "what's new" popup - resolves #670
Mike Becker <universe@uap-core.de>
parents:
358
diff
changeset
|
160 | val cookieLocale = cookieLanguage(req) |
|
298
1275eb652008
add language selection cookie - fixes #352
Mike Becker <universe@uap-core.de>
parents:
254
diff
changeset
|
161 | |
|
1275eb652008
add language selection cookie - fixes #352
Mike Becker <universe@uap-core.de>
parents:
254
diff
changeset
|
162 | // if no cookie, fall back to request locale a.k.a "Browser Language" |
|
1275eb652008
add language selection cookie - fixes #352
Mike Becker <universe@uap-core.de>
parents:
254
diff
changeset
|
163 | val reqLocale = cookieLocale ?: req.locale |
|
1275eb652008
add language selection cookie - fixes #352
Mike Becker <universe@uap-core.de>
parents:
254
diff
changeset
|
164 | |
|
1275eb652008
add language selection cookie - fixes #352
Mike Becker <universe@uap-core.de>
parents:
254
diff
changeset
|
165 | val availableLanguages = availableLanguages() |
|
1275eb652008
add language selection cookie - fixes #352
Mike Becker <universe@uap-core.de>
parents:
254
diff
changeset
|
166 | val sessionLocale = if (availableLanguages.contains(reqLocale)) reqLocale else availableLanguages.first() |
|
1275eb652008
add language selection cookie - fixes #352
Mike Becker <universe@uap-core.de>
parents:
254
diff
changeset
|
167 | |
|
1275eb652008
add language selection cookie - fixes #352
Mike Becker <universe@uap-core.de>
parents:
254
diff
changeset
|
168 | // select the language (this will also refresh the cookie max-age) |
|
367
0a9065936aac
add "what's new" popup - resolves #670
Mike Becker <universe@uap-core.de>
parents:
358
diff
changeset
|
169 | selectLanguage(req, resp, sessionLocale) |
|
298
1275eb652008
add language selection cookie - fixes #352
Mike Becker <universe@uap-core.de>
parents:
254
diff
changeset
|
170 | |
|
1275eb652008
add language selection cookie - fixes #352
Mike Becker <universe@uap-core.de>
parents:
254
diff
changeset
|
171 | logger.debug( |
|
1275eb652008
add language selection cookie - fixes #352
Mike Becker <universe@uap-core.de>
parents:
254
diff
changeset
|
172 | "Setting language for new session {0}: {1}", session.id, sessionLocale.displayLanguage |
|
1275eb652008
add language selection cookie - fixes #352
Mike Becker <universe@uap-core.de>
parents:
254
diff
changeset
|
173 | ) |
|
1275eb652008
add language selection cookie - fixes #352
Mike Becker <universe@uap-core.de>
parents:
254
diff
changeset
|
174 | } else { |
|
1275eb652008
add language selection cookie - fixes #352
Mike Becker <universe@uap-core.de>
parents:
254
diff
changeset
|
175 | val sessionLocale = session.getAttribute(Constants.SESSION_ATTR_LANGUAGE) as Locale |
|
1275eb652008
add language selection cookie - fixes #352
Mike Becker <universe@uap-core.de>
parents:
254
diff
changeset
|
176 | resp.locale = sessionLocale |
|
1275eb652008
add language selection cookie - fixes #352
Mike Becker <universe@uap-core.de>
parents:
254
diff
changeset
|
177 | logger.trace("Continuing session {0} with language {1}", session.id, sessionLocale) |
|
1275eb652008
add language selection cookie - fixes #352
Mike Becker <universe@uap-core.de>
parents:
254
diff
changeset
|
178 | } |
|
1275eb652008
add language selection cookie - fixes #352
Mike Becker <universe@uap-core.de>
parents:
254
diff
changeset
|
179 | |
|
335
1eed60b779da
change language menu to settings menu and add timezone settings - fixes #402
Mike Becker <universe@uap-core.de>
parents:
298
diff
changeset
|
180 | // determine the timezone |
|
1eed60b779da
change language menu to settings menu and add timezone settings - fixes #402
Mike Becker <universe@uap-core.de>
parents:
298
diff
changeset
|
181 | if (session.getAttribute(Constants.SESSION_ATTR_TIMEZONE) == null) { |
|
1eed60b779da
change language menu to settings menu and add timezone settings - fixes #402
Mike Becker <universe@uap-core.de>
parents:
298
diff
changeset
|
182 | // timezone selection stored in cookie |
|
367
0a9065936aac
add "what's new" popup - resolves #670
Mike Becker <universe@uap-core.de>
parents:
358
diff
changeset
|
183 | val cookieTimezone = cookieTimezone(req) |
|
335
1eed60b779da
change language menu to settings menu and add timezone settings - fixes #402
Mike Becker <universe@uap-core.de>
parents:
298
diff
changeset
|
184 | |
|
1eed60b779da
change language menu to settings menu and add timezone settings - fixes #402
Mike Becker <universe@uap-core.de>
parents:
298
diff
changeset
|
185 | // if no cookie, fall back to server's timezone (the browser does not transmit one) |
|
1eed60b779da
change language menu to settings menu and add timezone settings - fixes #402
Mike Becker <universe@uap-core.de>
parents:
298
diff
changeset
|
186 | val timezone = cookieTimezone ?: ZoneId.systemDefault() |
|
1eed60b779da
change language menu to settings menu and add timezone settings - fixes #402
Mike Becker <universe@uap-core.de>
parents:
298
diff
changeset
|
187 | |
|
367
0a9065936aac
add "what's new" popup - resolves #670
Mike Becker <universe@uap-core.de>
parents:
358
diff
changeset
|
188 | selectTimezone(req, resp, timezone) |
|
335
1eed60b779da
change language menu to settings menu and add timezone settings - fixes #402
Mike Becker <universe@uap-core.de>
parents:
298
diff
changeset
|
189 | logger.debug("Timezone for session {0} set to {1}", session.id, timezone) |
|
1eed60b779da
change language menu to settings menu and add timezone settings - fixes #402
Mike Becker <universe@uap-core.de>
parents:
298
diff
changeset
|
190 | } |
|
1eed60b779da
change language menu to settings menu and add timezone settings - fixes #402
Mike Becker <universe@uap-core.de>
parents:
298
diff
changeset
|
191 | |
| 184 | 192 | // if this is an error path, bypass the normal flow |
| 193 | if (fullPath.startsWith("/error/")) { | |
|
367
0a9065936aac
add "what's new" popup - resolves #670
Mike Becker <universe@uap-core.de>
parents:
358
diff
changeset
|
194 | val http = HttpRequest(null, req, resp) |
| 184 | 195 | http.styleSheets = listOf("error") |
| 196 | http.render("error") | |
| 197 | return | |
| 198 | } | |
| 199 | ||
| 200 | // obtain a connection and create the data access objects | |
| 201 | val dsp = req.servletContext.getAttribute(SC_ATTR_NAME) as DataSourceProvider | |
| 202 | val dialect = dsp.dialect | |
| 203 | val ds = dsp.dataSource | |
| 204 | if (ds == null) { | |
| 205 | resp.sendError( | |
| 206 | HttpServletResponse.SC_SERVICE_UNAVAILABLE, | |
| 207 | "JNDI DataSource lookup failed. See log for details." | |
| 208 | ) | |
| 209 | return | |
| 210 | } | |
| 211 | try { | |
| 212 | ds.connection.use { connection -> | |
| 213 | val dao = createDataAccessObject(dialect, connection) | |
| 214 | try { | |
| 215 | connection.autoCommit = false | |
| 216 | invokeMapping(findMapping(mappings, req), req, resp, dao) | |
| 217 | connection.commit() | |
| 218 | } catch (ex: SQLException) { | |
| 247 | 219 | logger.warn("Database transaction failed (Code {0}): {1}", ex.errorCode, ex.message) |
| 220 | logger.debug("Details: ", ex) | |
| 184 | 221 | resp.sendError( |
| 222 | HttpServletResponse.SC_INTERNAL_SERVER_ERROR, | |
| 223 | "Unhandled Transaction Error - Code: " + ex.errorCode | |
| 224 | ) | |
| 225 | connection.rollback() | |
| 226 | } | |
| 227 | } | |
| 228 | } catch (ex: SQLException) { | |
| 247 | 229 | logger.error("Severe Database Exception (Code {0}): {1}", ex.errorCode, ex.message) |
| 230 | logger.debug("Details: ", ex) | |
| 184 | 231 | resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Database Error - Code: " + ex.errorCode) |
| 232 | } | |
| 233 | } | |
| 234 | ||
|
374
34abadbdd0e3
fix "what's new" not shown after redirects + do not show it when accessed via RSS
Mike Becker <universe@uap-core.de>
parents:
367
diff
changeset
|
235 | private fun showWhatsNewPopup(user: User?, req: HttpServletRequest, resp: HttpServletResponse, dao: DataAccessObject) { |
|
34abadbdd0e3
fix "what's new" not shown after redirects + do not show it when accessed via RSS
Mike Becker <universe@uap-core.de>
parents:
367
diff
changeset
|
236 | // don't show to anonymous users |
|
367
0a9065936aac
add "what's new" popup - resolves #670
Mike Becker <universe@uap-core.de>
parents:
358
diff
changeset
|
237 | if (user == null) return |
|
374
34abadbdd0e3
fix "what's new" not shown after redirects + do not show it when accessed via RSS
Mike Becker <universe@uap-core.de>
parents:
367
diff
changeset
|
238 | |
|
34abadbdd0e3
fix "what's new" not shown after redirects + do not show it when accessed via RSS
Mike Becker <universe@uap-core.de>
parents:
367
diff
changeset
|
239 | // don't show if we aren't going to forward to the site JSP |
|
34abadbdd0e3
fix "what's new" not shown after redirects + do not show it when accessed via RSS
Mike Becker <universe@uap-core.de>
parents:
367
diff
changeset
|
240 | if (req.getAttribute(Constants.REQ_ATTR_JSP) != "site") return |
|
34abadbdd0e3
fix "what's new" not shown after redirects + do not show it when accessed via RSS
Mike Becker <universe@uap-core.de>
parents:
367
diff
changeset
|
241 | |
|
34abadbdd0e3
fix "what's new" not shown after redirects + do not show it when accessed via RSS
Mike Becker <universe@uap-core.de>
parents:
367
diff
changeset
|
242 | // don't show for different sources |
|
34abadbdd0e3
fix "what's new" not shown after redirects + do not show it when accessed via RSS
Mike Becker <universe@uap-core.de>
parents:
367
diff
changeset
|
243 | if (listOf("rss").contains(req.getParameter("source").orEmpty())) return |
|
34abadbdd0e3
fix "what's new" not shown after redirects + do not show it when accessed via RSS
Mike Becker <universe@uap-core.de>
parents:
367
diff
changeset
|
244 | |
|
34abadbdd0e3
fix "what's new" not shown after redirects + do not show it when accessed via RSS
Mike Becker <universe@uap-core.de>
parents:
367
diff
changeset
|
245 | // show the popup and remember that we've shown it |
|
367
0a9065936aac
add "what's new" popup - resolves #670
Mike Becker <universe@uap-core.de>
parents:
358
diff
changeset
|
246 | logger.trace("show user with ID {0} what's new", user.id) |
|
0a9065936aac
add "what's new" popup - resolves #670
Mike Becker <universe@uap-core.de>
parents:
358
diff
changeset
|
247 | val userKnowsUpdatesUntil = dao.untilWhenUserKnowsUpdates(user) |
|
0a9065936aac
add "what's new" popup - resolves #670
Mike Becker <universe@uap-core.de>
parents:
358
diff
changeset
|
248 | if (userKnowsUpdatesUntil == null || userKnowsUpdatesUntil.before(SqlDate.valueOf(Constants.VERSION_DATE))) { |
|
0a9065936aac
add "what's new" popup - resolves #670
Mike Becker <universe@uap-core.de>
parents:
358
diff
changeset
|
249 | dao.updateUserKnowsUpdates(user) |
|
0a9065936aac
add "what's new" popup - resolves #670
Mike Becker <universe@uap-core.de>
parents:
358
diff
changeset
|
250 | req.setAttribute("showWhatsNew", true) |
|
0a9065936aac
add "what's new" popup - resolves #670
Mike Becker <universe@uap-core.de>
parents:
358
diff
changeset
|
251 | } |
|
0a9065936aac
add "what's new" popup - resolves #670
Mike Becker <universe@uap-core.de>
parents:
358
diff
changeset
|
252 | } |
|
0a9065936aac
add "what's new" popup - resolves #670
Mike Becker <universe@uap-core.de>
parents:
358
diff
changeset
|
253 | |
| 184 | 254 | override fun doGet(req: HttpServletRequest, resp: HttpServletResponse) { |
| 255 | doProcess(req, resp, getMappings) | |
| 256 | } | |
| 257 | ||
| 258 | override fun doPost(req: HttpServletRequest, resp: HttpServletResponse) { | |
| 259 | doProcess(req, resp, postMappings) | |
| 260 | } | |
| 261 | ||
| 262 | protected fun availableLanguages(): List<Locale> { | |
| 263 | val langTags = servletContext.getInitParameter(Constants.CTX_ATTR_LANGUAGES)?.split(",")?.map(String::trim) ?: emptyList() | |
| 264 | val locales = langTags.map(Locale::forLanguageTag).filter { it.language.isNotEmpty() } | |
|
208
785820da6485
fixes response locale not set for new sessions
Mike Becker <universe@uap-core.de>
parents:
184
diff
changeset
|
265 | return locales.ifEmpty { listOf(Locale.ENGLISH) } |
| 184 | 266 | } |
| 267 | ||
|
367
0a9065936aac
add "what's new" popup - resolves #670
Mike Becker <universe@uap-core.de>
parents:
358
diff
changeset
|
268 | private fun cookieLanguage(request: HttpServletRequest): Locale? = |
|
0a9065936aac
add "what's new" popup - resolves #670
Mike Becker <universe@uap-core.de>
parents:
358
diff
changeset
|
269 | request.cookies?.firstOrNull { c -> c.name == LANGUAGE_COOKIE_NAME } |
|
298
1275eb652008
add language selection cookie - fixes #352
Mike Becker <universe@uap-core.de>
parents:
254
diff
changeset
|
270 | ?.runCatching {Locale.forLanguageTag(this.value)}?.getOrNull() |
|
1275eb652008
add language selection cookie - fixes #352
Mike Becker <universe@uap-core.de>
parents:
254
diff
changeset
|
271 | |
|
335
1eed60b779da
change language menu to settings menu and add timezone settings - fixes #402
Mike Becker <universe@uap-core.de>
parents:
298
diff
changeset
|
272 | protected fun sessionLanguage(http: HttpRequest) = http.session.getAttribute(Constants.SESSION_ATTR_LANGUAGE) as Locale |
|
1eed60b779da
change language menu to settings menu and add timezone settings - fixes #402
Mike Becker <universe@uap-core.de>
parents:
298
diff
changeset
|
273 | |
|
367
0a9065936aac
add "what's new" popup - resolves #670
Mike Becker <universe@uap-core.de>
parents:
358
diff
changeset
|
274 | private fun cookieTimezone(request: HttpServletRequest): ZoneId? = |
|
0a9065936aac
add "what's new" popup - resolves #670
Mike Becker <universe@uap-core.de>
parents:
358
diff
changeset
|
275 | request.cookies?.firstOrNull { c -> c.name == TIMEZONE_COOKIE_NAME } |
|
335
1eed60b779da
change language menu to settings menu and add timezone settings - fixes #402
Mike Becker <universe@uap-core.de>
parents:
298
diff
changeset
|
276 | ?.runCatching { ZoneId.of(this.value)}?.getOrNull() |
|
1eed60b779da
change language menu to settings menu and add timezone settings - fixes #402
Mike Becker <universe@uap-core.de>
parents:
298
diff
changeset
|
277 | |
|
1eed60b779da
change language menu to settings menu and add timezone settings - fixes #402
Mike Becker <universe@uap-core.de>
parents:
298
diff
changeset
|
278 | protected fun sessionTimezone(http: HttpRequest) = http.session.getAttribute(Constants.SESSION_ATTR_TIMEZONE) as String |
|
1eed60b779da
change language menu to settings menu and add timezone settings - fixes #402
Mike Becker <universe@uap-core.de>
parents:
298
diff
changeset
|
279 | |
|
1eed60b779da
change language menu to settings menu and add timezone settings - fixes #402
Mike Becker <universe@uap-core.de>
parents:
298
diff
changeset
|
280 | protected fun selectTimezone(http: HttpRequest, zoneId: ZoneId) { |
|
367
0a9065936aac
add "what's new" popup - resolves #670
Mike Becker <universe@uap-core.de>
parents:
358
diff
changeset
|
281 | selectTimezone(http.request, http.response, zoneId) |
|
0a9065936aac
add "what's new" popup - resolves #670
Mike Becker <universe@uap-core.de>
parents:
358
diff
changeset
|
282 | } |
|
0a9065936aac
add "what's new" popup - resolves #670
Mike Becker <universe@uap-core.de>
parents:
358
diff
changeset
|
283 | |
|
0a9065936aac
add "what's new" popup - resolves #670
Mike Becker <universe@uap-core.de>
parents:
358
diff
changeset
|
284 | private fun selectTimezone(request: HttpServletRequest, response: HttpServletResponse, zoneId: ZoneId) { |
|
0a9065936aac
add "what's new" popup - resolves #670
Mike Becker <universe@uap-core.de>
parents:
358
diff
changeset
|
285 | request.session.setAttribute(Constants.SESSION_ATTR_TIMEZONE, zoneId.id) |
|
335
1eed60b779da
change language menu to settings menu and add timezone settings - fixes #402
Mike Becker <universe@uap-core.de>
parents:
298
diff
changeset
|
286 | val cookie = Cookie(TIMEZONE_COOKIE_NAME, zoneId.id) |
|
1eed60b779da
change language menu to settings menu and add timezone settings - fixes #402
Mike Becker <universe@uap-core.de>
parents:
298
diff
changeset
|
287 | cookie.isHttpOnly = true |
|
367
0a9065936aac
add "what's new" popup - resolves #670
Mike Becker <universe@uap-core.de>
parents:
358
diff
changeset
|
288 | cookie.path = request.contextPath |
|
335
1eed60b779da
change language menu to settings menu and add timezone settings - fixes #402
Mike Becker <universe@uap-core.de>
parents:
298
diff
changeset
|
289 | cookie.maxAge = COOKIE_MAX_AGE |
|
367
0a9065936aac
add "what's new" popup - resolves #670
Mike Becker <universe@uap-core.de>
parents:
358
diff
changeset
|
290 | response.addCookie(cookie) |
|
335
1eed60b779da
change language menu to settings menu and add timezone settings - fixes #402
Mike Becker <universe@uap-core.de>
parents:
298
diff
changeset
|
291 | } |
|
1eed60b779da
change language menu to settings menu and add timezone settings - fixes #402
Mike Becker <universe@uap-core.de>
parents:
298
diff
changeset
|
292 | |
|
298
1275eb652008
add language selection cookie - fixes #352
Mike Becker <universe@uap-core.de>
parents:
254
diff
changeset
|
293 | protected fun selectLanguage(http: HttpRequest, locale: Locale) { |
|
367
0a9065936aac
add "what's new" popup - resolves #670
Mike Becker <universe@uap-core.de>
parents:
358
diff
changeset
|
294 | selectLanguage(http.request, http.response, locale) |
|
0a9065936aac
add "what's new" popup - resolves #670
Mike Becker <universe@uap-core.de>
parents:
358
diff
changeset
|
295 | } |
|
0a9065936aac
add "what's new" popup - resolves #670
Mike Becker <universe@uap-core.de>
parents:
358
diff
changeset
|
296 | |
|
0a9065936aac
add "what's new" popup - resolves #670
Mike Becker <universe@uap-core.de>
parents:
358
diff
changeset
|
297 | private fun selectLanguage(request: HttpServletRequest, response: HttpServletResponse, locale: Locale) { |
|
0a9065936aac
add "what's new" popup - resolves #670
Mike Becker <universe@uap-core.de>
parents:
358
diff
changeset
|
298 | response.locale = locale |
|
0a9065936aac
add "what's new" popup - resolves #670
Mike Becker <universe@uap-core.de>
parents:
358
diff
changeset
|
299 | request.session.setAttribute(Constants.SESSION_ATTR_LANGUAGE, locale) |
|
298
1275eb652008
add language selection cookie - fixes #352
Mike Becker <universe@uap-core.de>
parents:
254
diff
changeset
|
300 | // delete cookie if language selection matches request locale, otherwise set cookie |
|
1275eb652008
add language selection cookie - fixes #352
Mike Becker <universe@uap-core.de>
parents:
254
diff
changeset
|
301 | val cookie = Cookie(LANGUAGE_COOKIE_NAME, "") |
|
1275eb652008
add language selection cookie - fixes #352
Mike Becker <universe@uap-core.de>
parents:
254
diff
changeset
|
302 | cookie.isHttpOnly = true |
|
367
0a9065936aac
add "what's new" popup - resolves #670
Mike Becker <universe@uap-core.de>
parents:
358
diff
changeset
|
303 | cookie.path = request.contextPath |
|
0a9065936aac
add "what's new" popup - resolves #670
Mike Becker <universe@uap-core.de>
parents:
358
diff
changeset
|
304 | if (request.locale.language == locale.language) { |
|
298
1275eb652008
add language selection cookie - fixes #352
Mike Becker <universe@uap-core.de>
parents:
254
diff
changeset
|
305 | cookie.maxAge = 0 |
|
1275eb652008
add language selection cookie - fixes #352
Mike Becker <universe@uap-core.de>
parents:
254
diff
changeset
|
306 | } else { |
|
1275eb652008
add language selection cookie - fixes #352
Mike Becker <universe@uap-core.de>
parents:
254
diff
changeset
|
307 | cookie.value = locale.language |
|
335
1eed60b779da
change language menu to settings menu and add timezone settings - fixes #402
Mike Becker <universe@uap-core.de>
parents:
298
diff
changeset
|
308 | cookie.maxAge = COOKIE_MAX_AGE |
|
298
1275eb652008
add language selection cookie - fixes #352
Mike Becker <universe@uap-core.de>
parents:
254
diff
changeset
|
309 | } |
|
367
0a9065936aac
add "what's new" popup - resolves #670
Mike Becker <universe@uap-core.de>
parents:
358
diff
changeset
|
310 | response.addCookie(cookie) |
|
298
1275eb652008
add language selection cookie - fixes #352
Mike Becker <universe@uap-core.de>
parents:
254
diff
changeset
|
311 | } |
| 184 | 312 | } |