Merge branch 'helma-js' into helma-🐜
This commit is contained in:
		
						commit
						768b7b5ed3
					
				
					 72 changed files with 901 additions and 922 deletions
				
			
		
							
								
								
									
										15
									
								
								.eslintrc
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								.eslintrc
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,15 @@ | |||
| { | ||||
|   "extends": "eslint:recommended", | ||||
|   "env": { | ||||
|     "es6": true, | ||||
|     "commonjs": true | ||||
|   }, | ||||
|   "globals": { | ||||
|     "app": "readonly", | ||||
|     "HopObject": "readonly", | ||||
|     "java": "readonly", | ||||
|     "Packages": "readonly", | ||||
|     "req": "readonly", | ||||
|     "res": "readonly" | ||||
|   } | ||||
| } | ||||
|  | @ -46,11 +46,12 @@ configurations { | |||
| } | ||||
| 
 | ||||
| dependencies { | ||||
|   implementation 'com.google.code.gson:gson:2.8.6' | ||||
|   implementation 'com.sun.activation:javax.activation:1.2.0' | ||||
|   implementation 'commons-codec:commons-codec:1.14' | ||||
|   implementation 'commons-fileupload:commons-fileupload:1.4' | ||||
|   implementation 'commons-logging:commons-logging:1.2' | ||||
|   implementation 'commons-net:commons-net:3.6' | ||||
|   implementation 'com.sun.activation:javax.activation:1.2.0' | ||||
|   implementation 'javax.mail:javax.mail-api:1.6.2' | ||||
|   implementation 'javax.servlet:javax.servlet-api:4.0.1' | ||||
|   implementation 'org.ccil.cowan.tagsoup:tagsoup:1.2.1' | ||||
|  |  | |||
|  | @ -19,6 +19,7 @@ package helma.main.launcher; | |||
| import java.io.File; | ||||
| import java.io.FilenameFilter; | ||||
| import java.io.IOException; | ||||
| import java.io.UnsupportedEncodingException; | ||||
| import java.lang.reflect.Method; | ||||
| import java.net.URL; | ||||
| import java.net.URLClassLoader; | ||||
|  | @ -135,10 +136,10 @@ public class Main { | |||
|      * @throws MalformedURLException | ||||
|      */ | ||||
|     public static ClassLoader createClassLoader(String installDir) | ||||
|             throws MalformedURLException { | ||||
|             throws MalformedURLException, UnsupportedEncodingException { | ||||
| 
 | ||||
|         // decode installDir in case it is URL-encoded | ||||
|         installDir = URLDecoder.decode(installDir); | ||||
|         installDir = URLDecoder.decode(installDir, System.getProperty("helma.urlEncoding", "UTF-8")); | ||||
| 
 | ||||
|         // set up the class path | ||||
|         File libdir = new File(installDir, "lib"); | ||||
|  |  | |||
|  | @ -28,9 +28,7 @@ | |||
|  * @param {Object} val the value to check | ||||
|  * @return {boolean} true if the value is contained | ||||
|  */ | ||||
| Array.prototype.contains = function(val) { | ||||
|    return this.indexOf(val) > -1; | ||||
| }; | ||||
| Array.prototype.contains = Array.prototype.includes | ||||
| 
 | ||||
| /** | ||||
|  * Retrieve the union set of a bunch of arrays | ||||
|  | @ -40,18 +38,9 @@ Array.prototype.contains = function(val) { | |||
|  * @return {Array} the union set | ||||
|  */ | ||||
| Array.union = function() { | ||||
|    var result = []; | ||||
|    var map = {}; | ||||
|    for (var i=0; i<arguments.length; i+=1) { | ||||
|       for (var n in arguments[i]) { | ||||
|          var item = arguments[i][n]; | ||||
|          if (!map[item]) { | ||||
|             result.push(item); | ||||
|             map[item] = true; | ||||
|          } | ||||
|       } | ||||
|    } | ||||
|    return result; | ||||
|    return Array.from(arguments).reduce((result, array) => { | ||||
|       return result.concat(array.filter(element => !result.includes(element))); | ||||
|    }, []); | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  | @ -62,21 +51,9 @@ Array.union = function() { | |||
|  * @return {Array} the intersection set | ||||
|  */ | ||||
| Array.intersection = function() { | ||||
|    var all = Array.union.apply(this, arguments); | ||||
|    var result = []; | ||||
|    for (var n in all) { | ||||
|       var chksum = 0; | ||||
|       var item = all[n]; | ||||
|       for (var i=0; i<arguments.length; i+=1) { | ||||
|          if (arguments[i].contains(item)) | ||||
|             chksum += 1; | ||||
|          else | ||||
|             break; | ||||
|       } | ||||
|       if (chksum == arguments.length) | ||||
|          result.push(item); | ||||
|    } | ||||
|    return result; | ||||
|    return Array.from(arguments).reduce((result, array) => { | ||||
|       return result.filter(element => array.includes(element)); | ||||
|    }); | ||||
| }; | ||||
| 
 | ||||
| // prevent any newly added properties from being enumerated
 | ||||
|  |  | |||
|  | @ -180,7 +180,7 @@ Date.prototype.getExpiry = function(param) { | |||
|  */ | ||||
| Date.prototype.equals = function(date, extend) { | ||||
|     if (!extend) | ||||
|         var extend = Date.ONEDAY; | ||||
|         extend = Date.ONEDAY; | ||||
|     switch (extend) { | ||||
|         case Date.ONESECOND: | ||||
|             if (this.getSeconds() != date.getSeconds()) | ||||
|  |  | |||
|  | @ -17,7 +17,7 @@ | |||
| /** | ||||
|  * @fileoverview Adds useful global macros. | ||||
|  * <br /><br /> | ||||
|  * To use this optional module, its repository needs to be added to the  | ||||
|  * To use this optional module, its repository needs to be added to the | ||||
|  * application, for example by calling app.addRepository('modules/core/Global.js') | ||||
|  */ | ||||
| 
 | ||||
|  | @ -77,3 +77,180 @@ var skin_macro = function(param, name) { | |||
|     return; | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * Encodes a string for HTML output and inserts linebreak tags. | ||||
|  * | ||||
|  * Performs the following string manipulations: | ||||
|  *  All line breaks (i.e. line feeds) are replaced with <br/> tags. | ||||
|  *  All special characters are being replaced with their equivalent HTML entity. | ||||
|  *  Existing markup tags are being encoded. | ||||
|  * | ||||
|  * @param {string} text | ||||
|  *  The string to encode for HTML output. | ||||
|  * @param {boolean} [encodeNewLine = true] | ||||
|  *  If or if not to encode line breaks (i.e. line feeds). | ||||
|  * @return {string} | ||||
|  *  The encoded string. | ||||
|  */ | ||||
| function encode(text, encodeNewLine) { | ||||
|   text = String(text); | ||||
| 
 | ||||
|   if (text === null || !text.length) return text; | ||||
|   var buffer = []; | ||||
|   if (typeof encodeNewLine === 'undefined') encodeNewLine = true; | ||||
| 
 | ||||
|   for (var i = 0, len = text.length; i < len; i += 1) { | ||||
|     var char = text.charAt(i); | ||||
| 
 | ||||
|     switch (char) { | ||||
|       case '<': | ||||
|       buffer.push('<'); | ||||
|       break; | ||||
| 
 | ||||
|       case '>': | ||||
|       buffer.push('>'); | ||||
|       break; | ||||
| 
 | ||||
|       case '&': | ||||
|       buffer.push('&'); | ||||
|       break; | ||||
| 
 | ||||
|       case '"': | ||||
|       buffer.push('"'); | ||||
|       break; | ||||
| 
 | ||||
|       case '\n': | ||||
|       if (encodeNewLine) { | ||||
|         buffer.push("<br/>"); | ||||
|       } | ||||
|       buffer.push('\n'); | ||||
|       break; | ||||
| 
 | ||||
|       default: | ||||
|       buffer.push(char); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   return buffer.join(''); | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * Encodes a string for XML output. | ||||
|  * | ||||
|  * Performs the following string manipulations: | ||||
|  *  All special characters are being replaced with their equivalent HTML entity. | ||||
|  *  Existing tags, single and double quotes, as well as ampersands are being encoded. | ||||
|  *  Some invalid XML characters below '0x20' are removed | ||||
|  * | ||||
|  * @param {string} text | ||||
|  *  The string to encode for XML output. | ||||
|  * @return {string} | ||||
|  *  The string encoded for XML output. | ||||
|  */ | ||||
| function encodeXml(text) { | ||||
|   text = String(text); | ||||
| 
 | ||||
|   if (text === null || !text.length) return text; | ||||
|   var buffer = []; | ||||
| 
 | ||||
|   for (var i = 0, len = text.length; i < len; i += 1) { | ||||
|     var char = text.charAt(i); | ||||
| 
 | ||||
|     switch (char) { | ||||
|       case '<': | ||||
|       buffer.push('<'); | ||||
|       break; | ||||
| 
 | ||||
|       case '>': | ||||
|       buffer.push('>'); | ||||
|       break; | ||||
| 
 | ||||
|       case '&': | ||||
|       buffer.push('&'); | ||||
|       break; | ||||
| 
 | ||||
|       case '"': | ||||
|       buffer.push('"'); | ||||
|       break; | ||||
| 
 | ||||
|       case '\'': | ||||
|       buffer.push('''); | ||||
|       break; | ||||
| 
 | ||||
|       default: | ||||
|       var charCode = text.charCodeAt(i); | ||||
|       if (charCode < 0x20) { | ||||
|         // sort out invalid XML characters below 0x20 - all but 0x9, 0xA and 0xD.
 | ||||
|         // The trick is an adaption of java.lang.Character.isSpace().
 | ||||
|         if (((((1 << 0x9) | (1 << 0xA) | (1 << 0xD)) >> charCode) & 1) !== 0) { | ||||
|           buffer.push(char); | ||||
|         } | ||||
|       } else { | ||||
|         buffer.push(char); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   return buffer.join(''); | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * Encodes a string for HTML output, leaving linebreaks untouched. | ||||
|  * | ||||
|  * Performs the following string manipulations: | ||||
|  *  Unlike encode, leaves linebreaks untouched. This is what you usually want to do for encoding form content (esp. | ||||
|  *  with text input values). | ||||
|  *  All special characters (i.e. non ASCII) are being replaced with their equivalent HTML entity. | ||||
|  *  Existing markup tags are being encoded. | ||||
|  * | ||||
|  * @param {string} text | ||||
|  *  The string to format for HTML output. | ||||
|  * @return {string} | ||||
|  *  The string formatted for HTML output. | ||||
|  */ | ||||
| var encodeForm = function(text) { | ||||
|   text = String(text); | ||||
| 
 | ||||
|   if (text === null || !text.length) return text; | ||||
| 
 | ||||
|   return encode(text, false); | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * Removes any markup tags contained in the passed string, and returns the modified string. | ||||
|  * | ||||
|  * @param {string} markup | ||||
|  *  The text that is to be stripped of tags. | ||||
|  * @return {string} | ||||
|  *  The text with the tags stripped out. | ||||
|  */ | ||||
| var stripTags = function (markup) { | ||||
|   if (markup === null) return markup; | ||||
| 
 | ||||
|   var chars = String(markup).split(''); | ||||
|   var charCounter = 0; | ||||
|   var inTag = false; | ||||
| 
 | ||||
|   for (var i = 0, len = markup.length; i < len; i += 1) { | ||||
|     if (chars[i] === '<') inTag = true; | ||||
| 
 | ||||
|     if (!inTag) { | ||||
|       if (i > charCounter) { | ||||
|         chars[charCounter] = chars[i]; | ||||
|       } | ||||
| 
 | ||||
|       charCounter += 1; | ||||
|     } | ||||
| 
 | ||||
|     if (chars[i] === '>') { | ||||
|       inTag = false; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   if (i > charCounter) { | ||||
|     chars.length = charCounter; | ||||
|     return chars.join(''); | ||||
|   } | ||||
| 
 | ||||
|   return markup; | ||||
| }; | ||||
|  |  | |||
|  | @ -21,6 +21,8 @@ | |||
|  * application, for example by calling app.addRepository('modules/core/Object.js') | ||||
|  */ | ||||
| 
 | ||||
| app.addRepository('modules/core/Global.js'); | ||||
| 
 | ||||
| /** | ||||
|  * Copies the properties of this object into a clone. | ||||
|  * @external | ||||
|  |  | |||
|  | @ -42,6 +42,8 @@ String.URLPATTERN     = /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\ | |||
|  * application, for example by calling app.addRepository('modules/core/String.js') | ||||
|  */ | ||||
| 
 | ||||
| app.addRepository('modules/core/Global.js'); | ||||
| 
 | ||||
| /** | ||||
|  * checks if a date format pattern is correct | ||||
|  * @external | ||||
|  | @ -392,54 +394,7 @@ String.prototype.unwrap = function(removeTags, replacement) { | |||
|  * @return String md5 hash of the string | ||||
|  */ | ||||
| String.prototype.md5 = function() { | ||||
|     return Packages.helma.util.MD5Encoder.encode(this); | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| /** | ||||
|  * function repeats a string the specified amount of times | ||||
|  * @external | ||||
|  * @memberof {String} | ||||
|  * @param Int amount of repetitions | ||||
|  * @return String resulting string | ||||
|  */ | ||||
| String.prototype.repeat = function(multiplier) { | ||||
|     res.push(); | ||||
|     for (var i=0; i<multiplier; i++) | ||||
|         res.write(this); | ||||
|     return res.pop(); | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| /** | ||||
|  * function returns true if the string starts with | ||||
|  * the string passed as argument | ||||
|  * @external | ||||
|  * @memberof {String} | ||||
|  * @param String string pattern to search for | ||||
|  * @return Boolean true in case it matches the beginning | ||||
|  *            of the string, false otherwise | ||||
|  */ | ||||
| String.prototype.startsWith = function(str, offset) { | ||||
|     var javaObj = new java.lang.String(this); | ||||
|     if (offset != null) | ||||
|         return javaObj.startsWith(str, offset); | ||||
|     return javaObj.startsWith(str); | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| /** | ||||
|  * function returns true if the string ends with | ||||
|  * the string passed as argument | ||||
|  * @external | ||||
|  * @memberof {String} | ||||
|  * @param String string pattern to search for | ||||
|  * @return Boolean true in case it matches the end of | ||||
|  *            the string, false otherwise | ||||
|  */ | ||||
| String.prototype.endsWith = function(str) { | ||||
|     var javaObj = new java.lang.String(this); | ||||
|     return javaObj.endsWith(str); | ||||
|     return Packages.org.apache.commons.codec.digest.DigestUtils.md5Hex(this); | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
|  | @ -455,28 +410,21 @@ String.prototype.endsWith = function(str) { | |||
|  *                     String.BALANCE and String.RIGHT here as well.) | ||||
|  * @return String the resulting string | ||||
|  */ | ||||
| String.prototype.pad = function(str, len, mode) { | ||||
|     if (str  == null || len == null) | ||||
|         return this; | ||||
|     var diff = len - this.length; | ||||
|     if (diff == 0) | ||||
|         return this; | ||||
|     var left, right = 0; | ||||
|     if (mode == null || mode == String.RIGHT) | ||||
|         right = diff; | ||||
|     else if (mode == String.LEFT) | ||||
|         left = diff; | ||||
|     else if (mode == String.BALANCE) { | ||||
|         right = Math.round(diff / 2); | ||||
|         left = diff - right; | ||||
| String.prototype.pad = function(str, length, mode) { | ||||
|     if (mode === null || mode === String.RIGHT) return this.padEnd(length, str); | ||||
|     if (mode === String.LEFT) return this.padStart(length, str); | ||||
| 
 | ||||
|     if (mode === String.BALANCE && str && length) { | ||||
|       const pos = Math.ceil(this.length / 2); | ||||
|       const head = this.substr(0, pos); | ||||
|       const tail = this.substr(pos); | ||||
|       const additionalLength = (length - this.length) / 2; | ||||
|       const startLength = head.length + Math.floor(additionalLength); | ||||
|       const endLength = tail.length + Math.ceil(additionalLength); | ||||
|       return head.padStart(startLength, str) + tail.padEnd(endLength, str); | ||||
|     } | ||||
|     res.push(); | ||||
|     for (var i=0; i<left; i++) | ||||
|         res.write(str); | ||||
|     res.write(this); | ||||
|     for (var i=0; i<right; i++) | ||||
|         res.write(str); | ||||
|     return res.pop(); | ||||
| 
 | ||||
|     return this; | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
|  | @ -490,9 +438,7 @@ String.prototype.pad = function(str, len, mode) { | |||
|  * @param Boolean | ||||
|  */ | ||||
| String.prototype.contains = function(str, fromIndex) { | ||||
|     if (this.indexOf(str, fromIndex ? fromIndex : 0) > -1) | ||||
|         return true; | ||||
|     return false; | ||||
|     return this.indexOf(str, fromIndex || 0) > -1; | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
|  | @ -558,17 +504,6 @@ String.prototype.diff = function(mod, separator) { | |||
| }; | ||||
| 
 | ||||
| 
 | ||||
| /** | ||||
|  * remove leading and trailing whitespace | ||||
|  * @external | ||||
|  * @memberof {String} | ||||
|  */ | ||||
| String.prototype.trim = function () { | ||||
|     var s = new java.lang.String(this); | ||||
|     return String(s.trim()); | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| /** | ||||
|  * returns true if the string looks like an e-mail | ||||
|  * @external | ||||
|  |  | |||
|  | @ -49,7 +49,7 @@ helma.auth = function(realm) { | |||
|     var accessAllowed = true; | ||||
|     if (req.data.username && req.data.password) { | ||||
|         if (pw && hostIsAllowed()) { | ||||
|             if (pw == Packages.helma.util.MD5Encoder.encode(req.data.username + "-" + req.data.password)) { | ||||
|             if (pw == Packages.org.apache.commons.codec.digest.DigestUtils.md5Hex(req.data.username + "-" + req.data.password)) { | ||||
|                 session.data[realm+'Authenticated'] = true; | ||||
|                 res.redirect(res.data.href); | ||||
|             } else { | ||||
|  | @ -61,7 +61,7 @@ helma.auth = function(realm) { | |||
|                 The adminAccess property is not set.<br />\ | ||||
|                 Before proceeding, add the following line to your app.properties or server.properties file:\ | ||||
|                 <br /><br />adminAccess=' | ||||
|                 + Packages.helma.util.MD5Encoder.encode(req.data.username + "-" + req.data.password); | ||||
|                 + Packages.org.apache.commons.codec.digest.DigestUtils.md5Hex(req.data.username + "-" + req.data.password); | ||||
|             else param.message += 'The '+ realm +'AccessAllowed property does not match your host.<br />\ | ||||
|                 Before proceeding, remove this property from your app.properties or server.properties file \ | ||||
|                 or include your host as follows:<br /><br />' | ||||
|  |  | |||
							
								
								
									
										4
									
								
								src/dist/apps/manage/Global/functions.js
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								src/dist/apps/manage/Global/functions.js
									
										
									
									
										vendored
									
									
								
							|  | @ -46,7 +46,7 @@ function createAddressFilter() { | |||
| } | ||||
| 
 | ||||
| 
 | ||||
| /**  | ||||
| /** | ||||
|   * updates the stats in app.data.stat every 5 minutes | ||||
|   */ | ||||
| function appStat() { | ||||
|  | @ -123,7 +123,7 @@ function checkAuth(appObj) { | |||
|     if (uname == null || uname == "" || pwd == null || pwd == "") | ||||
|         return forceAuth(); | ||||
| 
 | ||||
|     var md5key = Packages.helma.util.MD5Encoder.encode(uname + "-" + pwd); | ||||
|     var md5key = Packages.org.apache.commons.codec.digest.DigestUtils.md5Hex(uname + "-" + pwd); | ||||
| 
 | ||||
|     if (md5key == adminAccess) | ||||
|         return true; | ||||
|  |  | |||
							
								
								
									
										4
									
								
								src/dist/apps/manage/Root/actions.js
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								src/dist/apps/manage/Root/actions.js
									
										
									
									
										vendored
									
									
								
							|  | @ -75,7 +75,7 @@ function makekey_action() { | |||
|             res.data.body = renderSkinAsString("pwdform", obj); | ||||
|         } else { | ||||
|             // render the md5-string:
 | ||||
|             obj.propsString = "adminAccess=" + Packages.helma.util.MD5Encoder.encode(req.data.username + "-" + req.data.password) + "<br>\n"; | ||||
|             obj.propsString = "adminAccess=" + Packages.org.apache.commons.codec.digest.DigestUtils.md5Hex(req.data.username + "-" + req.data.password) + "<br>\n"; | ||||
|             res.data.body = renderSkinAsString("pwdfeedback", obj); | ||||
|         } | ||||
| 
 | ||||
|  | @ -127,4 +127,4 @@ function mrtg_action() { | |||
|     } else { | ||||
|         res.write("0\n0\n0\n0\n"); | ||||
|     } | ||||
| } | ||||
| } | ||||
|  |  | |||
|  | @ -20,6 +20,8 @@ package helma.extensions; | |||
|  *  | ||||
|  */ | ||||
| public class ConfigurationException extends RuntimeException { | ||||
|     private static final long serialVersionUID = 6428439427909728917L; | ||||
| 
 | ||||
|     /** | ||||
|      * Creates a new ConfigurationException object. | ||||
|      * | ||||
|  |  | |||
|  | @ -24,4 +24,6 @@ package helma.framework; | |||
|  */ | ||||
| public class AbortException extends Error { | ||||
| 
 | ||||
|     private static final long serialVersionUID = -7536693051844908815L; | ||||
| 
 | ||||
| } | ||||
|  |  | |||
|  | @ -22,6 +22,8 @@ package helma.framework; | |||
|  * application | ||||
|  */ | ||||
| public class ApplicationStoppedException extends RuntimeException { | ||||
|     private static final long serialVersionUID = 7125229844095452333L; | ||||
| 
 | ||||
|     /** | ||||
|      * Creates a new ApplicationStoppedException object. | ||||
|      */ | ||||
|  |  | |||
|  | @ -24,6 +24,8 @@ import javax.servlet.http.Cookie; | |||
|  *  of an HTTP cookie. | ||||
|  */ | ||||
| public final class CookieTrans implements Serializable { | ||||
|     private static final long serialVersionUID = 1811202114296536258L; | ||||
| 
 | ||||
|     String name; | ||||
|     String value; | ||||
|     String path; | ||||
|  |  | |||
|  | @ -22,6 +22,8 @@ package helma.framework; | |||
|  * wrong in evaluation of requests. | ||||
|  */ | ||||
| public class FrameworkException extends RuntimeException { | ||||
|     private static final long serialVersionUID = -8477797850472128617L; | ||||
| 
 | ||||
|     /** | ||||
|      * Creates a new FrameworkException object. | ||||
|      * | ||||
|  |  | |||
|  | @ -22,6 +22,8 @@ package helma.framework; | |||
|  * wrong in evaluation of requests. | ||||
|  */ | ||||
| public class NotFoundException extends RuntimeException { | ||||
|     private static final long serialVersionUID = -715022974097617658L; | ||||
| 
 | ||||
|     /** | ||||
|      * Creates a new NotFoundException object. | ||||
|      * | ||||
|  |  | |||
|  | @ -24,6 +24,8 @@ package helma.framework; | |||
|  * java.lang.ThreadDeath). | ||||
|  */ | ||||
| public class RedirectException extends Error { | ||||
|     private static final long serialVersionUID = 2362170037476457592L; | ||||
| 
 | ||||
|     String url; | ||||
| 
 | ||||
|     /** | ||||
|  |  | |||
|  | @ -24,6 +24,8 @@ import java.util.Map; | |||
|  *  | ||||
|  */ | ||||
| public class RequestBean implements Serializable { | ||||
|     private static final long serialVersionUID = -6826881712426326687L; | ||||
| 
 | ||||
|     RequestTrans req; | ||||
| 
 | ||||
|     /** | ||||
|  |  | |||
|  | @ -16,13 +16,15 @@ | |||
| 
 | ||||
| package helma.framework; | ||||
| 
 | ||||
| import helma.util.Base64; | ||||
| import helma.util.SystemMap; | ||||
| import helma.util.StringUtils; | ||||
| 
 | ||||
| import javax.servlet.http.HttpServletRequest; | ||||
| import javax.servlet.http.HttpServletResponse; | ||||
| import javax.servlet.http.Cookie; | ||||
| 
 | ||||
| import org.apache.commons.codec.binary.Base64; | ||||
| 
 | ||||
| import java.io.*; | ||||
| import java.util.*; | ||||
| import java.util.regex.Pattern; | ||||
|  | @ -67,7 +69,7 @@ public class RequestTrans implements Serializable { | |||
| 
 | ||||
|     private ParamComboMap params; | ||||
|     private ParameterMap queryParams, postParams, cookies; | ||||
|      | ||||
| 
 | ||||
|     // the HTTP request method | ||||
|     private String method; | ||||
| 
 | ||||
|  | @ -601,11 +603,11 @@ public class RequestTrans implements Serializable { | |||
| 
 | ||||
|         StringTokenizer tok; | ||||
| 
 | ||||
|         if (auth.startsWith("Basic ")) { | ||||
|             tok = new StringTokenizer(new String(Base64.decode((auth.substring(6)).toCharArray())), | ||||
|                                       ":"); | ||||
|         if (auth.startsWith("Basic ")) { //$NON-NLS-1$ | ||||
|             tok = new StringTokenizer(new String(Base64.decodeBase64(auth.substring(6))), | ||||
|                                       ":"); //$NON-NLS-1$ | ||||
|         } else { | ||||
|             tok = new StringTokenizer(new String(Base64.decode(auth.toCharArray())), ":"); | ||||
|             tok = new StringTokenizer(new String(Base64.decodeBase64(auth)), ":"); //$NON-NLS-1$ | ||||
|         } | ||||
| 
 | ||||
|         try { | ||||
|  | @ -632,6 +634,8 @@ public class RequestTrans implements Serializable { | |||
| 
 | ||||
|     class ParameterMap extends SystemMap { | ||||
| 
 | ||||
|         private static final long serialVersionUID = 7632860503639617076L; | ||||
| 
 | ||||
|         public ParameterMap() { | ||||
|             super(); | ||||
|         } | ||||
|  | @ -708,6 +712,8 @@ public class RequestTrans implements Serializable { | |||
| 
 | ||||
|     class DataComboMap extends SystemMap { | ||||
| 
 | ||||
|         private static final long serialVersionUID = 5737810055554406299L; | ||||
| 
 | ||||
|         public Object get(Object key) { | ||||
|             Object value = super.get(key); | ||||
|             if (value != null) | ||||
|  | @ -743,6 +749,8 @@ public class RequestTrans implements Serializable { | |||
|     } | ||||
| 
 | ||||
|     class ParamComboMap extends SystemMap { | ||||
|         private static final long serialVersionUID = -9177176570950359431L; | ||||
| 
 | ||||
|         public Object get(Object key) { | ||||
|             Object value; | ||||
|             if (postParams != null && (value = postParams.get(key)) != null) | ||||
|  |  | |||
|  | @ -30,6 +30,8 @@ import java.util.Map; | |||
|  * | ||||
|  */ | ||||
| public class ResponseBean implements Serializable { | ||||
|     private static final long serialVersionUID = -6807623667477109800L; | ||||
| 
 | ||||
|     ResponseTrans res; | ||||
| 
 | ||||
|     /** | ||||
|  | @ -584,6 +586,7 @@ public class ResponseBean implements Serializable { | |||
|      * Old version for push() kept for compatibility | ||||
|      * @deprecated | ||||
|      */ | ||||
|     @Deprecated | ||||
|     public void pushStringBuffer() { | ||||
|         res.pushBuffer(null); | ||||
|     } | ||||
|  | @ -593,6 +596,7 @@ public class ResponseBean implements Serializable { | |||
|      * @deprecated | ||||
|      * @return ... | ||||
|      */ | ||||
|     @Deprecated | ||||
|     public String popStringBuffer() { | ||||
|         return res.popString(); | ||||
|     } | ||||
|  |  | |||
|  | @ -26,6 +26,7 @@ import java.io.*; | |||
| import java.security.*; | ||||
| import java.util.*; | ||||
| 
 | ||||
| import org.apache.commons.codec.binary.Base64; | ||||
| import org.apache.xmlrpc.XmlRpcResponseProcessor; | ||||
| 
 | ||||
| /** | ||||
|  | @ -712,8 +713,8 @@ public final class ResponseTrans extends Writer implements Serializable { | |||
|                 digest = MessageDigest.getInstance("MD5"); | ||||
|                 // if (contentType != null) | ||||
|                 //     digest.update (contentType.getBytes()); | ||||
|                 byte[] b = digest.digest(response); | ||||
|                 etag = "\"" + new String(helma.util.Base64.encode(b)) + "\""; | ||||
|                 byte[] b = this.digest.digest(this.response); | ||||
|                 this.etag = "\"" + new String(Base64.encodeBase64(b)) + "\""; //$NON-NLS-1$ //$NON-NLS-2$ | ||||
|                 // only set response to 304 not modified if no cookies were set | ||||
|                 if (reqtrans.hasETag(etag) && countCookies() == 0) { | ||||
|                     response = new byte[0]; | ||||
|  | @ -864,7 +865,7 @@ public final class ResponseTrans extends Writer implements Serializable { | |||
|         if (what == null) { | ||||
|             digest.update(new byte[0]); | ||||
|         } else if (what instanceof Date) { | ||||
|             digest.update(MD5Encoder.toBytes(((Date) what).getTime())); | ||||
|             digest.update(Long.toBinaryString(((Date) what).getTime()).getBytes()); | ||||
|         } else if (what instanceof byte[]) { | ||||
|             digest.update((byte[]) what); | ||||
|         } else { | ||||
|  | @ -888,9 +889,9 @@ public final class ResponseTrans extends Writer implements Serializable { | |||
| 
 | ||||
|         // add the application checksum as dependency to make ETag | ||||
|         // generation sensitive to changes in the app | ||||
|         byte[] b = digest.digest(MD5Encoder.toBytes(app.getChecksum())); | ||||
|         byte[] b = digest.digest(Long.toBinaryString((this.app.getChecksum())).getBytes()); | ||||
| 
 | ||||
|         setETag(new String(helma.util.Base64.encode(b))); | ||||
|         setETag(new String(Base64.encodeBase64(b))); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|  |  | |||
|  | @ -22,6 +22,8 @@ package helma.framework; | |||
|  * not be serviced within the timeout period specified for an application. | ||||
|  */ | ||||
| public class TimeoutException extends RuntimeException { | ||||
|     private static final long serialVersionUID = 3853135482278393735L; | ||||
| 
 | ||||
|     /** | ||||
|      * Creates a new TimeoutException object. | ||||
|      */ | ||||
|  |  | |||
|  | @ -20,6 +20,8 @@ import java.io.Serializable; | |||
| 
 | ||||
| public class UploadStatus implements Serializable { | ||||
| 
 | ||||
|     private static final long serialVersionUID = 8335579045959177198L; | ||||
| 
 | ||||
|     long current = 0; | ||||
|     long total = 0; | ||||
|     int itemsRead = 0; | ||||
|  |  | |||
|  | @ -38,6 +38,8 @@ import org.apache.commons.logging.LogFactory; | |||
|  * application specific functionality. | ||||
|  */ | ||||
| public class ApplicationBean implements Serializable { | ||||
|     private static final long serialVersionUID = -5053315391709405106L; | ||||
| 
 | ||||
|     transient Application app; | ||||
|     WrappedMap properties = null; | ||||
| 
 | ||||
|  |  | |||
|  | @ -415,6 +415,11 @@ public final class Prototype { | |||
|      *  @return an iterator of this prototype's code resources | ||||
|      */ | ||||
|     public synchronized Iterator getCodeResources() { | ||||
|     	// if code has never been updated, do so now before returning an empty or incomplete list | ||||
|     	if (lastCodeUpdate == 0) { | ||||
|     		checkForUpdates(); | ||||
|     	} | ||||
|     	 | ||||
|         // we copy over to a new list, because the underlying set may grow | ||||
|         // during compilation through use of app.addRepository() | ||||
|         return new ArrayList(code).iterator(); | ||||
|  | @ -487,6 +492,8 @@ public final class Prototype { | |||
|      * A Map that dynamically expands to all skins in this prototype. | ||||
|      */ | ||||
|     class SkinMap extends HashMap { | ||||
|         private static final long serialVersionUID = -8855785541204100909L; | ||||
| 
 | ||||
|         volatile long lastSkinmapLoad = -1; | ||||
|         Object[] skinpath; | ||||
| 
 | ||||
|  |  | |||
|  | @ -142,6 +142,7 @@ public class RequestPath { | |||
|      * @return the index of the element, or -1 if it isn't contained | ||||
|      * @deprecated use {@link #indexOf(Object)} instead. | ||||
|      */ | ||||
|     @Deprecated | ||||
|     public int contains(Object obj) { | ||||
|         return objects.indexOf(obj); | ||||
|     } | ||||
|  |  | |||
|  | @ -27,6 +27,8 @@ import java.util.Date; | |||
|  * exposes it to the scripting framework. | ||||
|  */ | ||||
| public class SessionBean implements Serializable { | ||||
|     private static final long serialVersionUID = 7500231949937123265L; | ||||
| 
 | ||||
|     // the wrapped session object | ||||
|     Session session; | ||||
| 
 | ||||
|  |  | |||
|  | @ -1190,6 +1190,8 @@ public final class Skin { | |||
|      * Exception type for unhandled, forbidden or failed macros | ||||
|      */ | ||||
|     class MacroException extends Exception { | ||||
|         private static final long serialVersionUID = 396025641010781784L; | ||||
| 
 | ||||
|         MacroException(String message) { | ||||
|             super(message); | ||||
|         } | ||||
|  |  | |||
|  | @ -7,31 +7,30 @@ | |||
|  * http://adele.helma.org/download/helma/license.txt | ||||
|  * | ||||
|  * Copyright 1998-2003 Helma Software. All Rights Reserved. | ||||
|  * | ||||
|  * $RCSfile$ | ||||
|  * $Author$ | ||||
|  * $Revision$ | ||||
|  * $Date$ | ||||
|  */ | ||||
| 
 | ||||
| package helma.main; | ||||
| 
 | ||||
| import helma.framework.core.*; | ||||
| import helma.framework.repository.Repository; | ||||
| import helma.framework.repository.FileRepository; | ||||
| import helma.util.StringUtils; | ||||
| import org.apache.xmlrpc.XmlRpcHandler; | ||||
| import java.io.File; | ||||
| import java.util.ArrayList; | ||||
| import java.util.Enumeration; | ||||
| import java.util.Hashtable; | ||||
| import java.util.Vector; | ||||
| 
 | ||||
| import org.apache.commons.logging.Log; | ||||
| import org.apache.xmlrpc.XmlRpcHandler; | ||||
| import org.eclipse.jetty.server.handler.ContextHandler; | ||||
| import org.eclipse.jetty.server.handler.ContextHandlerCollection; | ||||
| import org.eclipse.jetty.server.handler.ResourceHandler; | ||||
| import org.eclipse.jetty.servlet.ServletContextHandler; | ||||
| import org.eclipse.jetty.servlet.ServletHolder; | ||||
| 
 | ||||
| import java.io.*; | ||||
| import java.util.*; | ||||
| import helma.util.ResourceProperties; | ||||
| import helma.framework.core.Application; | ||||
| import helma.framework.repository.FileRepository; | ||||
| import helma.framework.repository.Repository; | ||||
| import helma.servlet.EmbeddedServletClient; | ||||
| import helma.util.ResourceProperties; | ||||
| import helma.util.StringUtils; | ||||
| 
 | ||||
| /** | ||||
|  * This class is responsible for starting and stopping Helma applications. | ||||
|  | @ -55,11 +54,11 @@ public class ApplicationManager implements XmlRpcHandler { | |||
|     public ApplicationManager(ResourceProperties props, Server server) { | ||||
|         this.props = props; | ||||
|         this.server = server; | ||||
|         descriptors = new Hashtable(); | ||||
|         applications = new Hashtable(); | ||||
|         xmlrpcHandlers = new Hashtable(); | ||||
|         lastModified = 0; | ||||
|         jetty = server.jetty; | ||||
|         this.descriptors = new Hashtable(); | ||||
|         this.applications = new Hashtable(); | ||||
|         this.xmlrpcHandlers = new Hashtable(); | ||||
|         this.lastModified = 0; | ||||
|         this.jetty = server.jetty; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|  | @ -67,13 +66,13 @@ public class ApplicationManager implements XmlRpcHandler { | |||
|      * to create and start new applications. | ||||
|      */ | ||||
|     protected void checkForChanges() { | ||||
|         if (props.lastModified() > lastModified && server.getApplicationsOption() == null) { | ||||
|         if (this.props.lastModified() > this.lastModified && this.server.getApplicationsOption() == null) { | ||||
|             try { | ||||
|                 for (Enumeration e = props.keys(); e.hasMoreElements();) { | ||||
|                 for (Enumeration e = this.props.keys(); e.hasMoreElements();) { | ||||
|                     String appName = (String) e.nextElement(); | ||||
| 
 | ||||
|                     if ((appName.indexOf(".") == -1) && | ||||
|                             (applications.get(appName) == null)) { | ||||
|                     if ((appName.indexOf(".") == -1) && //$NON-NLS-1$ | ||||
|                             (this.applications.get(appName) == null)) { | ||||
|                         AppDescriptor appDesc = new AppDescriptor(appName); | ||||
|                         appDesc.start(); | ||||
|                         appDesc.bind(); | ||||
|  | @ -81,27 +80,27 @@ public class ApplicationManager implements XmlRpcHandler { | |||
|                 } | ||||
| 
 | ||||
|                 // then stop deleted ones | ||||
|                 for (Enumeration e = descriptors.elements(); e.hasMoreElements();) { | ||||
|                 for (Enumeration e = this.descriptors.elements(); e.hasMoreElements();) { | ||||
|                     AppDescriptor appDesc = (AppDescriptor) e.nextElement(); | ||||
| 
 | ||||
|                     // check if application has been removed and should be stopped | ||||
|                     if (!props.containsKey(appDesc.appName)) { | ||||
|                     if (!this.props.containsKey(appDesc.appName)) { | ||||
|                         appDesc.stop(); | ||||
|                     } else if (server.jetty != null) { | ||||
|                     } else if (this.server.jetty != null) { | ||||
|                         // If application continues to run, remount | ||||
|                         // as the mounting options may have changed. | ||||
|                         AppDescriptor ndesc = new AppDescriptor(appDesc.appName); | ||||
|                         ndesc.app = appDesc.app; | ||||
|                         appDesc.unbind(); | ||||
|                         ndesc.bind(); | ||||
|                         descriptors.put(ndesc.appName, ndesc); | ||||
|                         this.descriptors.put(ndesc.appName, ndesc); | ||||
|                     } | ||||
|                 } | ||||
|             } catch (Exception mx) { | ||||
|                 getLogger().error("Error checking applications", mx); | ||||
|             } | ||||
| 
 | ||||
|             lastModified = System.currentTimeMillis(); | ||||
|             this.lastModified = System.currentTimeMillis(); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|  | @ -118,7 +117,7 @@ public class ApplicationManager implements XmlRpcHandler { | |||
|      *  Bind an application by name | ||||
|      */ | ||||
|     public void register(String appName) { | ||||
|         AppDescriptor desc = (AppDescriptor) descriptors.get(appName); | ||||
|         AppDescriptor desc = (AppDescriptor) this.descriptors.get(appName); | ||||
|         if (desc != null) { | ||||
|             desc.bind(); | ||||
|         } | ||||
|  | @ -128,7 +127,7 @@ public class ApplicationManager implements XmlRpcHandler { | |||
|      *  Stop an application by name | ||||
|      */ | ||||
|     public void stop(String appName) { | ||||
|         AppDescriptor desc = (AppDescriptor) descriptors.get(appName); | ||||
|         AppDescriptor desc = (AppDescriptor) this.descriptors.get(appName); | ||||
|         if (desc != null) { | ||||
|             desc.stop(); | ||||
|         } | ||||
|  | @ -140,18 +139,18 @@ public class ApplicationManager implements XmlRpcHandler { | |||
|      */ | ||||
|     public void startAll() { | ||||
|         try { | ||||
|             String[] apps = server.getApplicationsOption(); | ||||
|             String[] apps = this.server.getApplicationsOption(); | ||||
|             if (apps != null) { | ||||
|                 for (int i = 0; i < apps.length; i++) { | ||||
|                     AppDescriptor desc = new AppDescriptor(apps[i]); | ||||
|                     desc.start(); | ||||
|                 } | ||||
|             } else { | ||||
|                 for (Enumeration e = props.keys(); e.hasMoreElements();) { | ||||
|                 for (Enumeration e = this.props.keys(); e.hasMoreElements();) { | ||||
|                     String appName = (String) e.nextElement(); | ||||
| 
 | ||||
|                     if (appName.indexOf(".") == -1) { | ||||
|                         String appValue = props.getProperty(appName); | ||||
|                     if (appName.indexOf(".") == -1) { //$NON-NLS-1$ | ||||
|                         String appValue = this.props.getProperty(appName); | ||||
| 
 | ||||
|                         if (appValue != null && appValue.length() > 0) { | ||||
|                             appName = appValue; | ||||
|  | @ -163,12 +162,12 @@ public class ApplicationManager implements XmlRpcHandler { | |||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             for (Enumeration e = descriptors.elements(); e.hasMoreElements();) { | ||||
|             for (Enumeration e = this.descriptors.elements(); e.hasMoreElements();) { | ||||
|                 AppDescriptor appDesc = (AppDescriptor) e.nextElement(); | ||||
|                 appDesc.bind(); | ||||
|             } | ||||
| 
 | ||||
|             lastModified = System.currentTimeMillis(); | ||||
|             this.lastModified = System.currentTimeMillis(); | ||||
|         } catch (Exception mx) { | ||||
|             getLogger().error("Error starting applications", mx); | ||||
|             mx.printStackTrace(); | ||||
|  | @ -179,7 +178,7 @@ public class ApplicationManager implements XmlRpcHandler { | |||
|      *  Stop all running applications. | ||||
|      */ | ||||
|     public void stopAll() { | ||||
|         for (Enumeration en = descriptors.elements(); en.hasMoreElements();) { | ||||
|         for (Enumeration en = this.descriptors.elements(); en.hasMoreElements();) { | ||||
|             try { | ||||
|                 AppDescriptor appDesc = (AppDescriptor) en.nextElement(); | ||||
| 
 | ||||
|  | @ -194,14 +193,14 @@ public class ApplicationManager implements XmlRpcHandler { | |||
|      *  Get an array containing all currently running applications. | ||||
|      */ | ||||
|     public Object[] getApplications() { | ||||
|         return applications.values().toArray(); | ||||
|         return this.applications.values().toArray(); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      *  Get an application by name. | ||||
|      */ | ||||
|     public Application getApplication(String name) { | ||||
|         return (Application) applications.get(name); | ||||
|         return (Application) this.applications.get(name); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|  | @ -209,7 +208,7 @@ public class ApplicationManager implements XmlRpcHandler { | |||
|      */ | ||||
|     public Object execute(String method, Vector params) | ||||
|                    throws Exception { | ||||
|         int dot = method.indexOf("."); | ||||
|         int dot = method.indexOf("."); //$NON-NLS-1$ | ||||
| 
 | ||||
|         if (dot == -1) { | ||||
|             throw new Exception("Method name \"" + method + | ||||
|  | @ -222,10 +221,10 @@ public class ApplicationManager implements XmlRpcHandler { | |||
| 
 | ||||
|         String handler = method.substring(0, dot); | ||||
|         String method2 = method.substring(dot + 1); | ||||
|         Application app = (Application) xmlrpcHandlers.get(handler); | ||||
|         Application app = (Application) this.xmlrpcHandlers.get(handler); | ||||
| 
 | ||||
|         if (app == null) { | ||||
|             app = (Application) xmlrpcHandlers.get("*"); | ||||
|             app = (Application) this.xmlrpcHandlers.get("*"); //$NON-NLS-1$ | ||||
|             // use the original method name, the handler is resolved within the app. | ||||
|             method2 = method; | ||||
|         } | ||||
|  | @ -240,33 +239,32 @@ public class ApplicationManager implements XmlRpcHandler { | |||
|     private String getMountpoint(String mountpoint) { | ||||
|         mountpoint = mountpoint.trim(); | ||||
| 
 | ||||
|         if ("".equals(mountpoint)) { | ||||
|             return "/"; | ||||
|         } else if (!mountpoint.startsWith("/")) { | ||||
|             return "/" + mountpoint; | ||||
|         if ("".equals(mountpoint)) { //$NON-NLS-1$ | ||||
|             return "/"; //$NON-NLS-1$ | ||||
|         } else if (!mountpoint.startsWith("/")) { //$NON-NLS-1$ | ||||
|             return "/" + mountpoint; //$NON-NLS-1$ | ||||
|         } | ||||
| 
 | ||||
|         return mountpoint; | ||||
|     } | ||||
| 
 | ||||
|     private String joinMountpoint(String prefix, String suffix) { | ||||
|         if (prefix.endsWith("/") || suffix.startsWith("/")) { | ||||
|         if (prefix.endsWith("/") || suffix.startsWith("/")) {  //$NON-NLS-1$//$NON-NLS-2$ | ||||
|             return prefix+suffix; | ||||
|         } else { | ||||
|             return prefix+"/"+suffix; | ||||
|         } | ||||
|         return prefix+"/"+suffix; //$NON-NLS-1$ | ||||
|     } | ||||
| 
 | ||||
|     private String getPathPattern(String mountpoint) { | ||||
|         if (!mountpoint.startsWith("/")) { | ||||
|             mountpoint = "/"+mountpoint; | ||||
|         if (!mountpoint.startsWith("/")) { //$NON-NLS-1$ | ||||
|             mountpoint = "/"+mountpoint; //$NON-NLS-1$ | ||||
|         } | ||||
| 
 | ||||
|         if ("/".equals(mountpoint)) { | ||||
|             return "/"; | ||||
|         if ("/".equals(mountpoint)) { //$NON-NLS-1$ | ||||
|             return "/"; //$NON-NLS-1$ | ||||
|         } | ||||
| 
 | ||||
|         if (mountpoint.endsWith("/")) { | ||||
|         if (mountpoint.endsWith("/")) { //$NON-NLS-1$ | ||||
|             return mountpoint.substring(0, mountpoint.length()-1); | ||||
|         } | ||||
| 
 | ||||
|  | @ -279,19 +277,18 @@ public class ApplicationManager implements XmlRpcHandler { | |||
|         File file = new File(path); | ||||
|         if (file.isAbsolute()) { | ||||
|             return file; | ||||
|         } else { | ||||
|             return file.getAbsoluteFile(); | ||||
|         } | ||||
|         return file.getAbsoluteFile(); | ||||
|     } | ||||
| 
 | ||||
|     private Log getLogger() { | ||||
|         return server.getLogger(); | ||||
|         return this.server.getLogger(); | ||||
|     } | ||||
| 
 | ||||
|     private String findResource(String path) { | ||||
|         File file = new File(path); | ||||
|         if (!file.isAbsolute() && !file.exists()) { | ||||
|             file = new File(server.getHopHome(), path); | ||||
|             file = new File(this.server.getHopHome(), path); | ||||
|         } | ||||
|         return file.getAbsolutePath(); | ||||
|     } | ||||
|  | @ -336,58 +333,58 @@ public class ApplicationManager implements XmlRpcHandler { | |||
|          * @param name the application name | ||||
|          */ | ||||
|         AppDescriptor(String name) { | ||||
|             ResourceProperties conf = props.getSubProperties(name + '.'); | ||||
|             appName = name; | ||||
|             mountpoint = getMountpoint(conf.getProperty("mountpoint", appName)); | ||||
|             pathPattern = getPathPattern(mountpoint); | ||||
|             staticDir = conf.getProperty("static"); | ||||
|             staticMountpoint = getPathPattern(conf.getProperty("staticMountpoint", | ||||
|                                         joinMountpoint(mountpoint, "static"))); | ||||
|             staticIndex = "true".equalsIgnoreCase(conf.getProperty("staticIndex")); | ||||
|             String home = conf.getProperty("staticHome"); | ||||
|             ResourceProperties conf = ApplicationManager.this.props.getSubProperties(name + '.'); | ||||
|             this.appName = name; | ||||
|             this.mountpoint = getMountpoint(conf.getProperty("mountpoint", this.appName)); //$NON-NLS-1$ | ||||
|             this.pathPattern = getPathPattern(this.mountpoint); | ||||
|             this.staticDir = conf.getProperty("static"); //$NON-NLS-1$ | ||||
|             this.staticMountpoint = getPathPattern(conf.getProperty("staticMountpoint", //$NON-NLS-1$ | ||||
|                                         joinMountpoint(this.mountpoint, "static"))); //$NON-NLS-1$ | ||||
|             this.staticIndex = "true".equalsIgnoreCase(conf.getProperty("staticIndex"));  //$NON-NLS-1$//$NON-NLS-2$ | ||||
|             String home = conf.getProperty("staticHome"); //$NON-NLS-1$ | ||||
|             if (home == null) { | ||||
|                 staticHome = new String[] {"index.html", "index.htm"}; | ||||
|                 this.staticHome = new String[] {"index.html", "index.htm"}; //$NON-NLS-1$ //$NON-NLS-2$ | ||||
|             } else { | ||||
|                 staticHome = StringUtils.split(home, ","); | ||||
|                 this.staticHome = StringUtils.split(home, ","); //$NON-NLS-1$ | ||||
|             } | ||||
|             protectedStaticDir = conf.getProperty("protectedStatic"); | ||||
|             this.protectedStaticDir = conf.getProperty("protectedStatic"); //$NON-NLS-1$ | ||||
| 
 | ||||
|             cookieDomain = conf.getProperty("cookieDomain"); | ||||
|             sessionCookieName = conf.getProperty("sessionCookieName"); | ||||
|             protectedSessionCookie = conf.getProperty("protectedSessionCookie"); | ||||
|             uploadLimit = conf.getProperty("uploadLimit"); | ||||
|             uploadSoftfail = conf.getProperty("uploadSoftfail"); | ||||
|             debug = conf.getProperty("debug"); | ||||
|             String appDirName = conf.getProperty("appdir"); | ||||
|             appDir = (appDirName == null) ? null : getAbsoluteFile(appDirName); | ||||
|             String dbDirName = conf.getProperty("dbdir"); | ||||
|             dbDir = (dbDirName == null) ? null : getAbsoluteFile(dbDirName); | ||||
|             servletClassName = conf.getProperty("servletClass"); | ||||
|             this.cookieDomain = conf.getProperty("cookieDomain"); //$NON-NLS-1$ | ||||
|             this.sessionCookieName = conf.getProperty("sessionCookieName"); //$NON-NLS-1$ | ||||
|             this.protectedSessionCookie = conf.getProperty("protectedSessionCookie"); //$NON-NLS-1$ | ||||
|             this.uploadLimit = conf.getProperty("uploadLimit"); //$NON-NLS-1$ | ||||
|             this.uploadSoftfail = conf.getProperty("uploadSoftfail"); //$NON-NLS-1$ | ||||
|             this.debug = conf.getProperty("debug"); //$NON-NLS-1$ | ||||
|             String appDirName = conf.getProperty("appdir"); //$NON-NLS-1$ | ||||
|             this.appDir = (appDirName == null) ? null : getAbsoluteFile(appDirName); | ||||
|             String dbDirName = conf.getProperty("dbdir"); //$NON-NLS-1$ | ||||
|             this.dbDir = (dbDirName == null) ? null : getAbsoluteFile(dbDirName); | ||||
|             this.servletClassName = conf.getProperty("servletClass"); //$NON-NLS-1$ | ||||
| 
 | ||||
|             // got ignore dirs | ||||
|             ignoreDirs = conf.getProperty("ignore"); | ||||
|             this.ignoreDirs = conf.getProperty("ignore"); //$NON-NLS-1$ | ||||
| 
 | ||||
|             // read and configure app repositories | ||||
|             ArrayList repositoryList = new ArrayList(); | ||||
|             Class[] parameters = { String.class }; | ||||
|             for (int i = 0; true; i++) { | ||||
|                 String repositoryArgs = conf.getProperty("repository." + i); | ||||
|                 String repositoryArgs = conf.getProperty("repository." + i); //$NON-NLS-1$ | ||||
| 
 | ||||
|                 if (repositoryArgs != null) { | ||||
|                     // lookup repository implementation | ||||
|                     String repositoryImpl = conf.getProperty("repository." + i + | ||||
|                                                               ".implementation"); | ||||
|                     String repositoryImpl = conf.getProperty("repository." + i + //$NON-NLS-1$ | ||||
|                                                               ".implementation"); //$NON-NLS-1$ | ||||
|                     if (repositoryImpl == null) { | ||||
|                         // implementation not set manually, have to guess it | ||||
|                         if (repositoryArgs.endsWith(".zip")) { | ||||
|                         if (repositoryArgs.endsWith(".zip")) { //$NON-NLS-1$ | ||||
|                             repositoryArgs = findResource(repositoryArgs); | ||||
|                             repositoryImpl = "helma.framework.repository.ZipRepository"; | ||||
|                         } else if (repositoryArgs.endsWith(".js")) { | ||||
|                             repositoryImpl = "helma.framework.repository.ZipRepository"; //$NON-NLS-1$ | ||||
|                         } else if (repositoryArgs.endsWith(".js")) { //$NON-NLS-1$ | ||||
|                             repositoryArgs = findResource(repositoryArgs); | ||||
|                             repositoryImpl = "helma.framework.repository.SingleFileRepository"; | ||||
|                             repositoryImpl = "helma.framework.repository.SingleFileRepository"; //$NON-NLS-1$ | ||||
|                         } else { | ||||
|                             repositoryArgs = findResource(repositoryArgs); | ||||
|                             repositoryImpl = "helma.framework.repository.FileRepository"; | ||||
|                             repositoryImpl = "helma.framework.repository.FileRepository"; //$NON-NLS-1$ | ||||
|                         } | ||||
|                     } | ||||
| 
 | ||||
|  | @ -408,17 +405,17 @@ public class ApplicationManager implements XmlRpcHandler { | |||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             if (appDir != null) { | ||||
|                 FileRepository appRep = new FileRepository(appDir); | ||||
|             if (this.appDir != null) { | ||||
|                 FileRepository appRep = new FileRepository(this.appDir); | ||||
|                 if (!repositoryList.contains(appRep)) { | ||||
|                     repositoryList.add(appRep); | ||||
|                 } | ||||
|             } else if (repositoryList.isEmpty()) { | ||||
|                 repositoryList.add(new FileRepository( | ||||
|                         new File(server.getAppsHome(), appName))); | ||||
|                         new File(ApplicationManager.this.server.getAppsHome(), this.appName))); | ||||
|             } | ||||
|             repositories = new Repository[repositoryList.size()]; | ||||
|             repositories = (Repository[]) repositoryList.toArray(repositories); | ||||
| 
 | ||||
|             this.repositories = (Repository[]) repositoryList.toArray(new Repository[repositoryList.size()]); | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
|  | @ -427,21 +424,21 @@ public class ApplicationManager implements XmlRpcHandler { | |||
| 
 | ||||
|             try { | ||||
|                 // create the application instance | ||||
|                 app = new Application(appName, server, repositories, appDir, dbDir); | ||||
|                 this.app = new Application(this.appName, ApplicationManager.this.server, this.repositories, this.appDir, this.dbDir); | ||||
| 
 | ||||
|                 // register ourselves | ||||
|                 descriptors.put(appName, this); | ||||
|                 applications.put(appName, app); | ||||
|                 ApplicationManager.this.descriptors.put(this.appName, this); | ||||
|                 ApplicationManager.this.applications.put(this.appName, this.app); | ||||
| 
 | ||||
|                 // the application is started later in the register method, when it's bound | ||||
|                 app.init(ignoreDirs); | ||||
|                 this.app.init(this.ignoreDirs); | ||||
| 
 | ||||
|                 // set application URL prefix if it isn't set in app.properties | ||||
|                 if (!app.hasExplicitBaseURI()) { | ||||
|                     app.setBaseURI(mountpoint); | ||||
|                 if (!this.app.hasExplicitBaseURI()) { | ||||
|                     this.app.setBaseURI(this.mountpoint); | ||||
|                 } | ||||
| 
 | ||||
|                 app.start(); | ||||
|                 this.app.start(); | ||||
|             } catch (Exception x) { | ||||
|                 getLogger().error("Error creating application " + appName, x); | ||||
|                 x.printStackTrace(); | ||||
|  | @ -462,8 +459,8 @@ public class ApplicationManager implements XmlRpcHandler { | |||
|                 getLogger().error("Couldn't stop app", x); | ||||
|             } | ||||
| 
 | ||||
|             descriptors.remove(appName); | ||||
|             applications.remove(appName); | ||||
|             ApplicationManager.this.descriptors.remove(this.appName); | ||||
|             ApplicationManager.this.applications.remove(this.appName); | ||||
|         } | ||||
| 
 | ||||
|         void bind() { | ||||
|  | @ -471,21 +468,21 @@ public class ApplicationManager implements XmlRpcHandler { | |||
|                 getLogger().info("Binding application " + appName + " :: " + app.hashCode() + " :: " + this.hashCode()); | ||||
| 
 | ||||
|                 // set application URL prefix if it isn't set in app.properties | ||||
|                 if (!app.hasExplicitBaseURI()) { | ||||
|                     app.setBaseURI(mountpoint); | ||||
|                 if (!this.app.hasExplicitBaseURI()) { | ||||
|                     this.app.setBaseURI(this.mountpoint); | ||||
|                 } | ||||
| 
 | ||||
|                 // bind to Jetty HTTP server | ||||
|                 if (jetty != null) { | ||||
|                     if (context == null) { | ||||
|                         context = new ContextHandlerCollection(); | ||||
|                         jetty.getHttpServer().setHandler(context); | ||||
|                 if (ApplicationManager.this.jetty != null) { | ||||
|                     if(ApplicationManager.this.context == null) { | ||||
|                         ApplicationManager.this.context = new ContextHandlerCollection(); | ||||
|                         ApplicationManager.this.jetty.getHttpServer().setHandler(ApplicationManager.this.context); | ||||
|                     } | ||||
| 
 | ||||
|                     // if there is a static direcory specified, mount it | ||||
|                     if (staticDir != null) { | ||||
|                     if (this.staticDir != null) { | ||||
| 
 | ||||
|                         File staticContent = getAbsoluteFile(staticDir); | ||||
|                         File staticContent = getAbsoluteFile(this.staticDir); | ||||
| 
 | ||||
|                         getLogger().info("Serving static from " + staticContent.getPath()); | ||||
|                         getLogger().info("Mounting static at " + staticMountpoint); | ||||
|  | @ -494,7 +491,7 @@ public class ApplicationManager implements XmlRpcHandler { | |||
|                         rhandler.setResourceBase(staticContent.getPath()); | ||||
|                         rhandler.setWelcomeFiles(staticHome); | ||||
| 
 | ||||
|                         staticContext = context.addContext(staticMountpoint, ""); | ||||
|                         staticContext = ApplicationManager.this.context.addContext(staticMountpoint, ""); //$NON-NLS-1$ | ||||
|                         staticContext.setHandler(rhandler); | ||||
| 
 | ||||
|                         staticContext.start(); | ||||
|  | @ -504,48 +501,49 @@ public class ApplicationManager implements XmlRpcHandler { | |||
|                     Class servletClass = servletClassName == null ? | ||||
|                             EmbeddedServletClient.class : Class.forName(servletClassName); | ||||
|                     ServletHolder holder = new ServletHolder(servletClass); | ||||
|                     holder.setInitParameter("application", appName); | ||||
|                     appContext.addServlet(holder, "/*"); | ||||
|                     appContext.addServlet(holder, "/*"); //$NON-NLS-1$ | ||||
| 
 | ||||
|                     if (cookieDomain != null) { | ||||
|                         holder.setInitParameter("cookieDomain", cookieDomain); | ||||
|                     holder.setInitParameter("application", appName); //$NON-NLS-1$ | ||||
| 
 | ||||
|                     if (this.cookieDomain != null) { | ||||
|                         holder.setInitParameter("cookieDomain", this.cookieDomain); //$NON-NLS-1$ | ||||
|                     } | ||||
| 
 | ||||
|                     if (sessionCookieName != null) { | ||||
|                         holder.setInitParameter("sessionCookieName", sessionCookieName); | ||||
|                     if (this.sessionCookieName != null) { | ||||
|                         holder.setInitParameter("sessionCookieName", this.sessionCookieName); //$NON-NLS-1$ | ||||
|                     } | ||||
| 
 | ||||
|                     if (protectedSessionCookie != null) { | ||||
|                         holder.setInitParameter("protectedSessionCookie", protectedSessionCookie); | ||||
|                     if (this.protectedSessionCookie != null) { | ||||
|                         holder.setInitParameter("protectedSessionCookie", this.protectedSessionCookie); //$NON-NLS-1$ | ||||
|                     } | ||||
| 
 | ||||
|                     if (uploadLimit != null) { | ||||
|                         holder.setInitParameter("uploadLimit", uploadLimit); | ||||
|                     if (this.uploadLimit != null) { | ||||
|                         holder.setInitParameter("uploadLimit", this.uploadLimit); //$NON-NLS-1$ | ||||
|                     } | ||||
| 
 | ||||
|                     if (uploadSoftfail != null) { | ||||
|                         holder.setInitParameter("uploadSoftfail", uploadSoftfail); | ||||
|                     if (this.uploadSoftfail != null) { | ||||
|                         holder.setInitParameter("uploadSoftfail", this.uploadSoftfail); //$NON-NLS-1$ | ||||
|                     } | ||||
| 
 | ||||
|                     if (debug != null) { | ||||
|                         holder.setInitParameter("debug", debug); | ||||
|                     if (this.debug != null) { | ||||
|                         holder.setInitParameter("debug", this.debug); //$NON-NLS-1$ | ||||
|                     } | ||||
|                      | ||||
|                     if (protectedStaticDir != null) { | ||||
|                         File protectedContent = getAbsoluteFile(protectedStaticDir); | ||||
|                         appContext.setResourceBase(protectedContent.getPath()); | ||||
| 
 | ||||
|                     if (this.protectedStaticDir != null) { | ||||
|                         File protectedContent = getAbsoluteFile(this.protectedStaticDir); | ||||
|                         this.appContext.setResourceBase(protectedContent.getPath()); | ||||
|                         getLogger().info("Serving protected static from " + | ||||
|                                        protectedContent.getPath()); | ||||
|                     } | ||||
| 
 | ||||
|                     // Remap the context paths and start | ||||
|                     context.mapContexts(); | ||||
|                     appContext.start(); | ||||
|                     ApplicationManager.this.context.mapContexts(); | ||||
|                     this.appContext.start(); | ||||
|                 } | ||||
| 
 | ||||
|                 // register as XML-RPC handler | ||||
|                 xmlrpcHandlerName = app.getXmlRpcHandlerName(); | ||||
|                 xmlrpcHandlers.put(xmlrpcHandlerName, app); | ||||
|                 this.xmlrpcHandlerName = this.app.getXmlRpcHandlerName(); | ||||
|                 ApplicationManager.this.xmlrpcHandlers.put(this.xmlrpcHandlerName, this.app); | ||||
|             } catch (Exception x) { | ||||
|                 getLogger().error("Couldn't bind app", x); | ||||
|                 x.printStackTrace(); | ||||
|  | @ -557,26 +555,26 @@ public class ApplicationManager implements XmlRpcHandler { | |||
| 
 | ||||
|             try { | ||||
|                 // unbind from Jetty HTTP server | ||||
|                 if (jetty != null) { | ||||
|                     if (appContext != null) { | ||||
|                         context.removeHandler(appContext); | ||||
|                         appContext.stop(); | ||||
|                         appContext.destroy(); | ||||
|                         appContext = null; | ||||
|                 if (ApplicationManager.this.jetty != null) { | ||||
|                     if (this.appContext != null) { | ||||
|                         ApplicationManager.this.context.removeHandler(this.appContext); | ||||
|                         this.appContext.stop(); | ||||
|                         this.appContext.destroy(); | ||||
|                         this.appContext = null; | ||||
|                     } | ||||
| 
 | ||||
|                     if (staticContext != null) { | ||||
|                         context.removeHandler(staticContext); | ||||
|                         staticContext.stop(); | ||||
|                         staticContext.destroy(); | ||||
|                         staticContext = null; | ||||
|                     if (this.staticContext != null) { | ||||
|                         ApplicationManager.this.context.removeHandler(this.staticContext); | ||||
|                         this.staticContext.stop(); | ||||
|                         this.staticContext.destroy(); | ||||
|                         this.staticContext = null; | ||||
|                     } | ||||
|                     context.mapContexts(); | ||||
|                     ApplicationManager.this.context.mapContexts(); | ||||
|                 } | ||||
| 
 | ||||
|                 // unregister as XML-RPC handler | ||||
|                 if (xmlrpcHandlerName != null) { | ||||
|                     xmlrpcHandlers.remove(xmlrpcHandlerName); | ||||
|                 if (this.xmlrpcHandlerName != null) { | ||||
|                     ApplicationManager.this.xmlrpcHandlers.remove(this.xmlrpcHandlerName); | ||||
|                 } | ||||
|             } catch (Exception x) { | ||||
|                 getLogger().error("Couldn't unbind app", x); | ||||
|  | @ -584,8 +582,9 @@ public class ApplicationManager implements XmlRpcHandler { | |||
| 
 | ||||
|         } | ||||
| 
 | ||||
|         @Override | ||||
|         public String toString() { | ||||
|             return "[AppDescriptor "+app+"]"; | ||||
|             return "[AppDescriptor "+this.app+"]"; //$NON-NLS-1$ //$NON-NLS-2$ | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -216,15 +216,6 @@ public class HelmaSecurityManager extends SecurityManager { | |||
|     public void checkMulticast(InetAddress addr) { | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * | ||||
|      * | ||||
|      * @param addr ... | ||||
|      * @param ttl ... | ||||
|      */ | ||||
|     public void checkMulticast(InetAddress addr, byte ttl) { | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * | ||||
|      */ | ||||
|  |  | |||
|  | @ -145,11 +145,13 @@ public class Server implements Runnable { | |||
|     public static void checkJavaVersion() { | ||||
|         String javaVersion = System.getProperty("java.version"); | ||||
| 
 | ||||
|         if ((javaVersion == null) || javaVersion.startsWith("1.3") | ||||
|         if ((javaVersion == null) || javaVersion.startsWith("1.5") | ||||
|                                   || javaVersion.startsWith("1.4") | ||||
|                                   || javaVersion.startsWith("1.3") | ||||
|                                   || javaVersion.startsWith("1.2") | ||||
|                                   || javaVersion.startsWith("1.1") | ||||
|                                   || javaVersion.startsWith("1.0")) { | ||||
|             System.err.println("This version of Helma requires Java 1.4 or greater."); | ||||
|             System.err.println("This version of Helma requires Java 1.6 or greater."); | ||||
| 
 | ||||
|             if (javaVersion == null) { // don't think this will ever happen, but you never know | ||||
|                 System.err.println("Your Java Runtime did not provide a version number. Please update to a more recent version."); | ||||
|  |  | |||
|  | @ -22,6 +22,8 @@ package helma.objectmodel; | |||
|  * will normally catch this and try again after a period of time. | ||||
|  */ | ||||
| public class ConcurrencyException extends Error { | ||||
|     private static final long serialVersionUID = 4031542073544406467L; | ||||
| 
 | ||||
|     /** | ||||
|      * Creates a new ConcurrencyException object. | ||||
|      * | ||||
|  |  | |||
|  | @ -21,6 +21,8 @@ package helma.objectmodel; | |||
|  * Thrown on any kind of Database-Error | ||||
|  */ | ||||
| public class DatabaseException extends RuntimeException { | ||||
|     private static final long serialVersionUID = -5715728591015640819L; | ||||
| 
 | ||||
|     /** | ||||
|      * Creates a new DatabaseException object. | ||||
|      * | ||||
|  |  | |||
|  | @ -22,6 +22,8 @@ import java.io.*; | |||
|  * This is passed to NodeListeners when a node is modified. | ||||
|  */ | ||||
| public class NodeEvent implements Serializable { | ||||
|     private static final long serialVersionUID = 4322426080131107600L; | ||||
| 
 | ||||
|     public static final int CONTENT_CHANGED = 0; | ||||
|     public static final int PROPERTIES_CHANGED = 1; | ||||
|     public static final int NODE_REMOVED = 2; | ||||
|  |  | |||
|  | @ -22,6 +22,8 @@ package helma.objectmodel; | |||
|  * it was expected. | ||||
|  */ | ||||
| public class ObjectNotFoundException extends Exception { | ||||
|     private static final long serialVersionUID = -5368941052804232094L; | ||||
| 
 | ||||
|     /** | ||||
|      * Creates a new ObjectNotFoundException object. | ||||
|      * | ||||
|  |  | |||
|  | @ -36,6 +36,8 @@ import java.util.Vector; | |||
|  * object, class helma.objectmodel.db.Node has to be used. | ||||
|  */ | ||||
| public class TransientNode implements INode, Serializable { | ||||
|     private static final long serialVersionUID = -4599844796152072979L; | ||||
| 
 | ||||
|     private static long idgen = 0; | ||||
|     protected Hashtable propMap; | ||||
|     protected Hashtable nodeMap; | ||||
|  |  | |||
|  | @ -24,6 +24,8 @@ import java.util.Date; | |||
|  * A property implementation for Nodes stored inside a database. | ||||
|  */ | ||||
| public final class TransientProperty implements IProperty, Serializable { | ||||
|     private static final long serialVersionUID = 3128899239601365229L; | ||||
| 
 | ||||
|     protected String propname; | ||||
|     protected TransientNode node; | ||||
|     public String svalue; | ||||
|  |  | |||
|  | @ -15,6 +15,8 @@ import java.util.*; | |||
| 
 | ||||
| public class SegmentedSubnodeList extends SubnodeList { | ||||
| 
 | ||||
|     private static final long serialVersionUID = -4947752577517584610L; | ||||
| 
 | ||||
|     transient Segment[] segments = null; | ||||
|     static int SEGLENGTH = 1000; | ||||
| 
 | ||||
|  |  | |||
|  | @ -25,6 +25,8 @@ import java.io.Serializable; | |||
|  */ | ||||
| public class SubnodeList implements Serializable { | ||||
| 
 | ||||
|     private static final long serialVersionUID = 711208015232333566L; | ||||
| 
 | ||||
|     protected Node node; | ||||
|     protected List list; | ||||
| 
 | ||||
|  |  | |||
|  | @ -495,6 +495,7 @@ public class Transactor { | |||
|     /** | ||||
|      * Kill this transaction thread. Used as last measure only. | ||||
|      */ | ||||
|     @SuppressWarnings("deprecation") | ||||
|     public synchronized void kill() { | ||||
| 
 | ||||
|         killed = true; | ||||
|  |  | |||
|  | @ -27,6 +27,8 @@ import java.io.*; | |||
|  */ | ||||
| public class ScriptingException extends Exception { | ||||
| 
 | ||||
|     private static final long serialVersionUID = -7191341724784015678L; | ||||
|      | ||||
|     String scriptStack = null; | ||||
| 
 | ||||
|     /** | ||||
|  |  | |||
|  | @ -0,0 +1,73 @@ | |||
| /* | ||||
|  * Helma License Notice | ||||
|  * | ||||
|  * The contents of this file are subject to the Helma License | ||||
|  * Version 2.0 (the "License"). You may not use this file except in | ||||
|  * compliance with the License. A copy of the License is available at | ||||
|  * http://adele.helma.org/download/helma/license.txt | ||||
|  * | ||||
|  * Copyright 2017 Daniel Ruthardt. All rights reserved. | ||||
|  */ | ||||
| 
 | ||||
| package helma.scripting.rhino; | ||||
| 
 | ||||
| import java.net.URI; | ||||
| 
 | ||||
| import org.mozilla.javascript.Context; | ||||
| import org.mozilla.javascript.EvaluatorException; | ||||
| import org.mozilla.javascript.Scriptable; | ||||
| import org.mozilla.javascript.commonjs.module.ModuleScript; | ||||
| import org.mozilla.javascript.commonjs.module.provider.ModuleSourceProvider; | ||||
| import org.mozilla.javascript.commonjs.module.provider.StrongCachingModuleScriptProvider; | ||||
| 
 | ||||
| /** | ||||
|  * Provides module scripts without compiling, should compiling not be possible for whatever reason. | ||||
|  * The main reason being targeted though, is the "generated bytecode for method exceeds 64K limit" issue. | ||||
|  */ | ||||
| public class CompiledOrInterpretedModuleScriptProvider extends StrongCachingModuleScriptProvider { | ||||
| 
 | ||||
|     /** | ||||
|      * Define the serialization UID. | ||||
|      */ | ||||
|     private static final long serialVersionUID = 1170789670529274963L; | ||||
| 
 | ||||
|     /** | ||||
|      * Delegates to the super constructor. | ||||
|      */ | ||||
|     public CompiledOrInterpretedModuleScriptProvider(ModuleSourceProvider moduleSourceProvider) { | ||||
|         // do what would have been done anyways | ||||
|         super(moduleSourceProvider); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public ModuleScript getModuleScript(Context cx, String moduleId, URI moduleUri, URI baseUri, Scriptable paths) throws Exception { | ||||
|         try { | ||||
|             // try to load the module script with whatever optimization level is set for the application | ||||
|             return super.getModuleScript(cx, moduleId, moduleUri, baseUri, paths); | ||||
|         } catch (EvaluatorException ignore) { | ||||
|             // unlikely, but possible exception during loading the module script without compilation | ||||
|             Exception exception; | ||||
|             // get the application's optimization level | ||||
|             int optimizationLevel = cx.getOptimizationLevel(); | ||||
|              | ||||
|             try { | ||||
|                 // set the optimization level to not compile, but interpret | ||||
|                 cx.setOptimizationLevel(-1); | ||||
|                 // load the module script with the newly set optimization level | ||||
|                 ModuleScript moduleScript = super.getModuleScript(cx, moduleId, moduleUri, baseUri, paths); | ||||
|                 // return the module script | ||||
|                 return moduleScript; | ||||
|             } catch (Exception e) { | ||||
|                 // remember the exception | ||||
|                 exception = e; | ||||
|             } finally { | ||||
|                 // re-set the optimization | ||||
|                 cx.setOptimizationLevel(optimizationLevel); | ||||
|             } | ||||
|              | ||||
|             // re-throw the exception catched when trying to load the module script without compilation  | ||||
|             throw exception; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| } | ||||
|  | @ -37,6 +37,8 @@ import java.io.*; | |||
|  * Helma global object defines a number of custom global functions. | ||||
|  */ | ||||
| public class GlobalObject extends ImporterTopLevel implements PropertyRecorder { | ||||
|     private static final long serialVersionUID = -5058912338247265290L; | ||||
| 
 | ||||
|     Application app; | ||||
|     RhinoCore core; | ||||
|     boolean isThreadScope = false; | ||||
|  | @ -68,8 +70,7 @@ public class GlobalObject extends ImporterTopLevel implements PropertyRecorder { | |||
|     public void init() { | ||||
|         String[] globalFuncs = { | ||||
|                                    "renderSkin", "renderSkinAsString", "getProperty", | ||||
|                                    "authenticate", "createSkin", "format", "encode", | ||||
|                                    "encodeXml", "encodeForm", "stripTags", "formatParagraphs", | ||||
|                                    "authenticate", "createSkin", "format", "formatParagraphs", | ||||
|                                    "getXmlDocument", "getHtmlDocument", "seal", | ||||
|                                    "getDBConnection", "getURL", "write", "writeln", | ||||
|                                    "serialize", "deserialize", "defineLibraryScope", | ||||
|  | @ -152,7 +153,7 @@ public class GlobalObject extends ImporterTopLevel implements PropertyRecorder { | |||
|         Skin skin = engine.toSkin(skinobj, "global"); | ||||
| 
 | ||||
|         if (skin != null) { | ||||
|             skin.render(engine.reval, null,  | ||||
|             skin.render(engine.reval, null, | ||||
|                     (paramobj == Undefined.instance) ? null : paramobj); | ||||
|         } | ||||
| 
 | ||||
|  | @ -379,6 +380,7 @@ public class GlobalObject extends ImporterTopLevel implements PropertyRecorder { | |||
|      * @param name the name of the libary namespace | ||||
|      * @deprecated should be implemented in JavaScript instead | ||||
|      */ | ||||
|     @Deprecated | ||||
|     public void defineLibraryScope(final String name) { | ||||
|         Object obj = get(name, this); | ||||
|         if (obj != NOT_FOUND) { | ||||
|  | @ -388,6 +390,8 @@ public class GlobalObject extends ImporterTopLevel implements PropertyRecorder { | |||
|             return; | ||||
|         } | ||||
|         ScriptableObject scope = new NativeObject() { | ||||
|             private static final long serialVersionUID = 9205558066617631601L; | ||||
| 
 | ||||
|             public String getClassName() { | ||||
|                 return name; | ||||
|             } | ||||
|  | @ -453,39 +457,6 @@ public class GlobalObject extends ImporterTopLevel implements PropertyRecorder { | |||
|         return new NativeJavaObject(this, obj, null); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * | ||||
|      * | ||||
|      * @param obj ... | ||||
|      * | ||||
|      * @return ... | ||||
|      */ | ||||
|     public String encode(Object obj) { | ||||
|         return HtmlEncoder.encodeAll(toString(obj)); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * | ||||
|      * | ||||
|      * @param obj ... | ||||
|      * | ||||
|      * @return ... | ||||
|      */ | ||||
|     public String encodeXml(Object obj) { | ||||
|         return HtmlEncoder.encodeXml(toString(obj)); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * | ||||
|      * | ||||
|      * @param obj ... | ||||
|      * | ||||
|      * @return ... | ||||
|      */ | ||||
|     public String encodeForm(Object obj) { | ||||
|         return HtmlEncoder.encodeFormValue(toString(obj)); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * | ||||
|      * | ||||
|  | @ -568,47 +539,6 @@ public class GlobalObject extends ImporterTopLevel implements PropertyRecorder { | |||
|         } | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * (Try to) strip all HTML/XML style tags from the given string argument | ||||
|      * | ||||
|      * @param str a string | ||||
|      * @return the string with tags removed | ||||
|      */ | ||||
|     public String stripTags(String str) { | ||||
|         if (str == null) { | ||||
|             return null; | ||||
|         } | ||||
| 
 | ||||
|         char[] c = str.toCharArray(); | ||||
|         boolean inTag = false; | ||||
|         int i; | ||||
|         int j = 0; | ||||
| 
 | ||||
|         for (i = 0; i < c.length; i++) { | ||||
|             if (c[i] == '<') { | ||||
|                 inTag = true; | ||||
|             } | ||||
| 
 | ||||
|             if (!inTag) { | ||||
|                 if (i > j) { | ||||
|                     c[j] = c[i]; | ||||
|                 } | ||||
| 
 | ||||
|                 j++; | ||||
|             } | ||||
| 
 | ||||
|             if (c[i] == '>') { | ||||
|                 inTag = false; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         if (i > j) { | ||||
|             return new String(c, 0, j); | ||||
|         } | ||||
| 
 | ||||
|         return str; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Serialize a JavaScript object to a file. | ||||
|      */ | ||||
|  | @ -658,10 +588,10 @@ public class GlobalObject extends ImporterTopLevel implements PropertyRecorder { | |||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Set DONTENUM attrubutes on the given properties in this object.  | ||||
|      * Set DONTENUM attrubutes on the given properties in this object. | ||||
|      * This is set on the JavaScript Object prototype. | ||||
|      */ | ||||
|     public static Object dontEnum (Context cx, Scriptable thisObj,  | ||||
|     public static Object dontEnum (Context cx, Scriptable thisObj, | ||||
|                                    Object[] args, Function funObj) { | ||||
|         if (!(thisObj instanceof ScriptableObject)) { | ||||
|             throw new EvaluatorException("dontEnum() called on non-ScriptableObject"); | ||||
|  |  | |||
|  | @ -66,9 +66,9 @@ public class HacHspConverter { | |||
|         f.append(" ("); | ||||
|         if (args != null) | ||||
|             f.append(args); | ||||
|         f.append(") {\n"); | ||||
|         f.append(") {"); | ||||
|         f.append(body); | ||||
|         f.append("\n}"); | ||||
|         f.append("}"); | ||||
| 
 | ||||
|         return f.toString(); | ||||
|     } | ||||
|  |  | |||
|  | @ -33,6 +33,8 @@ import java.io.IOException; | |||
|  */ | ||||
| public class HopObject extends ScriptableObject implements Wrapper, PropertyRecorder { | ||||
| 
 | ||||
|     private static final long serialVersionUID = 1329862822101428427L; | ||||
| 
 | ||||
|     String className; | ||||
|     final NodeProxy proxy; | ||||
|     final RhinoCore core; | ||||
|  | @ -705,6 +707,7 @@ public class HopObject extends ScriptableObject implements Wrapper, PropertyReco | |||
|      * Return its index position if it is, and -1 otherwise. | ||||
|      * @deprecated use indexOf(Object) instead. | ||||
|      */ | ||||
|     @Deprecated | ||||
|     public int jsFunction_contains(Object obj) { | ||||
|         return jsFunction_indexOf(obj); | ||||
|     } | ||||
|  |  | |||
|  | @ -29,6 +29,8 @@ import org.mozilla.javascript.*; | |||
| 
 | ||||
| public class HopObjectCtor extends FunctionObject { | ||||
| 
 | ||||
|     private static final long serialVersionUID = 3787907922712636030L; | ||||
| 
 | ||||
|     // init flag to trigger prototype compilation on | ||||
|     // static constructor property access | ||||
|     boolean initialized; | ||||
|  | @ -144,6 +146,8 @@ public class HopObjectCtor extends FunctionObject { | |||
| 
 | ||||
|     class GetById extends BaseFunction { | ||||
| 
 | ||||
|         private static final long serialVersionUID = -8041352998956882647L; | ||||
| 
 | ||||
|         public GetById(Scriptable scope) { | ||||
|             ScriptRuntime.setFunctionProtoAndParent(this, scope); | ||||
|         } | ||||
|  | @ -187,6 +191,8 @@ public class HopObjectCtor extends FunctionObject { | |||
| 
 | ||||
|     class HopCollection extends BaseFunction { | ||||
| 
 | ||||
|         private static final long serialVersionUID = -4046933261468527204L; | ||||
| 
 | ||||
|         public HopCollection(Scriptable scope) { | ||||
|             ScriptRuntime.setFunctionProtoAndParent(this, scope); | ||||
|         } | ||||
|  |  | |||
							
								
								
									
										35
									
								
								src/main/java/helma/scripting/rhino/JSONModuleSource.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								src/main/java/helma/scripting/rhino/JSONModuleSource.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,35 @@ | |||
| package helma.scripting.rhino; | ||||
| 
 | ||||
| import java.io.IOException; | ||||
| import java.io.Reader; | ||||
| import java.io.StringReader; | ||||
| import java.net.URI; | ||||
| 
 | ||||
| import org.apache.commons.io.IOUtils; | ||||
| import org.mozilla.javascript.commonjs.module.provider.ModuleSource; | ||||
| 
 | ||||
| public class JSONModuleSource extends ModuleSource { | ||||
| 
 | ||||
|     private static final long serialVersionUID = 4446798833357540398L; | ||||
| 
 | ||||
|     public JSONModuleSource(Object securityDomain, URI uri, URI base, Object validator) { | ||||
|         super(null, securityDomain, uri, base, validator); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public Reader getReader() { | ||||
|         StringBuffer content = new StringBuffer(); | ||||
|         content.append("module.exports = "); //$NON-NLS-1$ | ||||
|          | ||||
|         try { | ||||
|             content.append(IOUtils.toString(this.getUri().toURL().openStream())); | ||||
|         } catch (IOException e) { | ||||
|             content.append("null"); //$NON-NLS-1$ | ||||
|         } | ||||
|          | ||||
|         content.append(";"); //$NON-NLS-1$ | ||||
|          | ||||
|         return new StringReader(content.toString()); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
|  | @ -32,6 +32,8 @@ import java.io.IOException; | |||
|  */ | ||||
| public class JavaObject extends NativeJavaObject { | ||||
| 
 | ||||
|     private static final long serialVersionUID = 6348440950512377606L; | ||||
| 
 | ||||
|     RhinoCore core; | ||||
|     String protoName; | ||||
|     NativeJavaObject unscriptedJavaObj; | ||||
|  |  | |||
|  | @ -30,6 +30,8 @@ import java.util.Map; | |||
|  *  and helma.util.WrappedMap. | ||||
|  */ | ||||
| public class MapWrapper extends ScriptableObject implements Wrapper { | ||||
|     private static final long serialVersionUID = -8802538795495729410L; | ||||
| 
 | ||||
|     Map map; | ||||
|     RhinoCore core; | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										212
									
								
								src/main/java/helma/scripting/rhino/NodeModulesProvider.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										212
									
								
								src/main/java/helma/scripting/rhino/NodeModulesProvider.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,212 @@ | |||
| /* | ||||
|  * Helma License Notice | ||||
|  * | ||||
|  * The contents of this file are subject to the Helma License | ||||
|  * Version 2.0 (the "License"). You may not use this file except in | ||||
|  * compliance with the License. A copy of the License is available at | ||||
|  * http://adele.helma.org/download/helma/license.txt | ||||
|  * | ||||
|  * Copyright 2017 Daniel Ruthardt. All rights reserved. | ||||
|  */ | ||||
| 
 | ||||
| package helma.scripting.rhino; | ||||
| 
 | ||||
| import java.io.File; | ||||
| import java.io.IOException; | ||||
| import java.net.URI; | ||||
| import java.net.URISyntaxException; | ||||
| import java.nio.file.Files; | ||||
| 
 | ||||
| import org.apache.commons.io.FilenameUtils; | ||||
| import org.mozilla.javascript.commonjs.module.provider.ModuleSource; | ||||
| import org.mozilla.javascript.commonjs.module.provider.UrlModuleSourceProvider; | ||||
| 
 | ||||
| import com.google.gson.JsonObject; | ||||
| import com.google.gson.JsonParser; | ||||
| import com.google.gson.JsonSyntaxException; | ||||
| 
 | ||||
| /** | ||||
|  * Bridges the gap between CommonJS-style module loading and Node.js-style module loading. | ||||
|  */ | ||||
| public class NodeModulesProvider extends UrlModuleSourceProvider { | ||||
| 
 | ||||
|     /** | ||||
|      * Define the serialization UID. | ||||
|      */ | ||||
|     private static final long serialVersionUID = 6858072487233136717L; | ||||
| 
 | ||||
|     /** | ||||
|      * Delegates to the super constructor. | ||||
|      */ | ||||
|     public NodeModulesProvider(Iterable<URI> privilegedUris, Iterable<URI> fallbackUris) { | ||||
|         // do what would have been done anyways | ||||
|         super(privilegedUris, fallbackUris); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Do what Node.js's LOAD_AS_FILE(X) would do. | ||||
|      * Case 4 ("If X.node is a file, load X.node as binary addon.  STOP") is currently not supported (for | ||||
|      * quite obvious reasons). We might want to load JAR files in the future. | ||||
|      * | ||||
|      * @see https://nodejs.org/dist/latest-v9.x/docs/api/modules.html#modules_file_modules | ||||
|      * | ||||
|      * @param uri | ||||
|      *  The file to load. FILE, FILE.js and FILE.json will be tried in this order. | ||||
|      * @param base | ||||
|      *  Not used, only forwarded to | ||||
|      *  {@link UrlModuleSourceProvider#loadSource(URI, URI, Object)}. | ||||
|      * @param validator | ||||
|      *  Not used, only forwarded to | ||||
|      *  {@link UrlModuleSourceProvider#loadSource(URI, URI, Object)}. | ||||
|      * @return | ||||
|      *  The module source or null, if the module was not found. | ||||
|      * | ||||
|      * @throws IOException | ||||
|      *  See {@link UrlModuleSourceProvider#loadSource(URI, URI, Object)}. | ||||
|      * @throws URISyntaxException | ||||
|      *  See {@link UrlModuleSourceProvider#loadSource(URI, URI, Object)}. | ||||
|      */ | ||||
|     private ModuleSource loadAsFile(URI uri, URI base, Object validator) | ||||
|             throws IOException, URISyntaxException { | ||||
|         // lets assume the module is a file | ||||
|         File file = new File(uri); | ||||
|         // check if the file exists and is a file | ||||
|         if (file.exists() && file.isFile()) { | ||||
|             // check if the file is a JSON file | ||||
|             if (file.getAbsolutePath().toLowerCase().endsWith(".json")) { //$NON-NLS-1$ | ||||
|                 // return a JSON module source | ||||
|                 return new JSONModuleSource(null, file.toURI(), base, validator); | ||||
|             } else { | ||||
|                 // do what would have been done anyways | ||||
|                 return super.loadFromUri(uri, base, validator); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         // lets assume the module is a JS file | ||||
|         file = new File(new File(uri).getPath() + ".js"); //$NON-NLS-1$ | ||||
|         // check if a file.js exists and is a file | ||||
|         if (file.exists() && file.isFile()) { | ||||
|             // do what would have been done anyways | ||||
|             return super.loadFromUri(uri, base, validator); | ||||
|         } | ||||
| 
 | ||||
|         // lets assume the module is a JSON file | ||||
|         file = new File(new File(uri).getPath() + ".json"); //$NON-NLS-1$ | ||||
|         // check if a file.json exists and is a file | ||||
|         if (file.exists() && file.isFile()) { | ||||
|             // return a JSON module source | ||||
|             return new JSONModuleSource(null, file.toURI(), base, validator); | ||||
|         } | ||||
| 
 | ||||
|         // module not found | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Do what Node.js's LOAD_AS_DIRECTORY(X) would do. | ||||
|      * | ||||
|      * @see https://nodejs.org/dist/latest-v9.x/docs/api/modules.html#modules_file_modules | ||||
|      * | ||||
|      * @param uri | ||||
|      *  The directory to load. | ||||
|      * @param base | ||||
|      *  Not used, only forwarded to | ||||
|      *  {@link UrlModuleSourceProvider#loadSource(URI, URI, Object)}. | ||||
|      * @param validator | ||||
|      *  Not used, only forwarded to | ||||
|      *  {@link UrlModuleSourceProvider#loadSource(URI, URI, Object)}. | ||||
|      * @return | ||||
|      *  The module source or null, if the module was not found. | ||||
|      * | ||||
|      * @throws JsonSyntaxException | ||||
|      *  Thrown for problems accessing the module's "package.json" file. | ||||
|      * @throws IOException | ||||
|      *  See {@link UrlModuleSourceProvider#loadSource(URI, URI, Object)}. | ||||
|      * @throws URISyntaxException | ||||
|      *  See {@link UrlModuleSourceProvider#loadSource(URI, URI, Object)}. | ||||
|      */ | ||||
|     private ModuleSource loadAsDirectory(URI uri, URI base, Object validator) | ||||
|             throws JsonSyntaxException, IOException, URISyntaxException { | ||||
|         // lets assume the module is a directory | ||||
|         File directory = new File(uri); | ||||
|         // check if the directory exists and is a directory | ||||
|         if (directory.exists() && directory.isDirectory()) { | ||||
|             // the module source | ||||
|             ModuleSource moduleSource; | ||||
| 
 | ||||
|             // lets assume that there is a "package.json" file in the directory | ||||
|             File packageFile = new File(directory, "package.json"); //$NON-NLS-1$ | ||||
| 
 | ||||
|             // check if the there is a "package.json" file in the directory | ||||
|             if (packageFile.exists() && packageFile.isFile()) { | ||||
|                 // parse the JSON file | ||||
|                 JsonObject json = new JsonParser() | ||||
|                         .parse(new String(Files.readAllBytes(packageFile.toPath()))).getAsJsonObject(); | ||||
|                 // check if the JSON file defines a main JS file | ||||
|                 if (json.has("main")) { //$NON-NLS-1$ | ||||
|                     // get the main JS file, removing the filename extension | ||||
|                     String main = FilenameUtils.removeExtension(json.get("main").getAsString()); //$NON-NLS-1$ | ||||
| 
 | ||||
|                     // load as file | ||||
|                     moduleSource = this.loadAsFile(new File(directory, main).toURI(), base, validator); | ||||
|                     // check if something was loaded | ||||
|                     if (moduleSource != null) { | ||||
|                         // return the loaded module source | ||||
|                         return moduleSource; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             // load as index | ||||
|             moduleSource = this.loadAsFile(new File(directory, "index").toURI(), base, validator); //$NON-NLS-1$ | ||||
|             // check if something was loaded | ||||
|             if (moduleSource != null) { | ||||
|                 // return the loaded module source | ||||
|                 return moduleSource; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         // module not found | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Do what Node.js's require(X) would do. | ||||
|      * | ||||
|      * Case 1 is not supported, you will have to use modules from npmjs.org, re-implementing the core | ||||
|      * core module's functionality. We might want to use Nodeschnaps in the future. | ||||
|      * Case 2 is not supported, paths are always treated as relative paths within the application's | ||||
|      * "commonjs" directory. | ||||
|      * Case 5 additionally tries {@link UrlModuleSourceProvider#loadSource(URI, URI, Object)}, even if it is | ||||
|      * very unlikely that something, which hasn't been tried yet, will be done. One could say we are just | ||||
|      * delegating throwing the error. | ||||
|      * | ||||
|      * @see https://nodejs.org/dist/latest-v9.x/docs/api/modules.html#modules_file_modules | ||||
|      * @see https://github.com/killmag10/nodeschnaps | ||||
|      */ | ||||
|     protected ModuleSource loadFromUri(URI uri, URI base, Object validator) | ||||
|             throws IOException, URISyntaxException { | ||||
|         // the module source | ||||
|         ModuleSource moduleSource; | ||||
| 
 | ||||
|         // load as file | ||||
|         moduleSource = this.loadAsFile(uri, base, validator); | ||||
|         // check if something was loaded | ||||
|         if (moduleSource != null) { | ||||
|             // return the loaded module source | ||||
|             return moduleSource; | ||||
|         } | ||||
| 
 | ||||
|         // load as directory | ||||
|         moduleSource = this.loadAsDirectory(uri, base, validator); | ||||
|         // check if something was loaded | ||||
|         if (moduleSource != null) { | ||||
|             // return the loaded module source | ||||
|             return moduleSource; | ||||
|         } | ||||
| 
 | ||||
|         // do what would have been done anyways | ||||
|         return super.loadFromUri(uri, base, validator); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
|  | @ -29,6 +29,8 @@ import java.io.UnsupportedEncodingException; | |||
|  */ | ||||
| public class PathWrapper extends ScriptableObject { | ||||
| 
 | ||||
|     private static final long serialVersionUID = 514381479839863014L; | ||||
| 
 | ||||
|     RequestPath path; | ||||
|     RhinoCore core; | ||||
| 
 | ||||
|  | @ -44,7 +46,7 @@ public class PathWrapper extends ScriptableObject { | |||
|         setParentScope(core.getScope()); | ||||
|         setPrototype(null); | ||||
|         defineProperty("length", PathWrapper.class, DONTENUM | READONLY | PERMANENT); | ||||
|         defineFunctionProperties(new String[] {"href", "contains"},  | ||||
|         defineFunctionProperties(new String[] {"href", "contains"}, | ||||
|                                  PathWrapper.class, DONTENUM | PERMANENT); | ||||
|     } | ||||
| 
 | ||||
|  | @ -127,7 +129,7 @@ public class PathWrapper extends ScriptableObject { | |||
| 
 | ||||
|         return path.href(null); | ||||
|     } | ||||
|      | ||||
| 
 | ||||
|     /** | ||||
|      * Checks if the given object is contained in the request path | ||||
|      * | ||||
|  | @ -137,7 +139,7 @@ public class PathWrapper extends ScriptableObject { | |||
|     public int contains(Object obj) { | ||||
|         if (obj instanceof Wrapper) | ||||
|             obj = ((Wrapper) obj).unwrap(); | ||||
|         return path.contains(obj); | ||||
|         return path.indexOf(obj); | ||||
|     } | ||||
| 
 | ||||
|     public String getClassName() { | ||||
|  | @ -147,7 +149,7 @@ public class PathWrapper extends ScriptableObject { | |||
|     public String toString() { | ||||
|         return "PathWrapper["+path.toString()+"]"; | ||||
|     } | ||||
|      | ||||
| 
 | ||||
|     /** | ||||
|      * Return a primitive representation for this object. | ||||
|      * FIXME: We always return a string representation. | ||||
|  | @ -158,4 +160,4 @@ public class PathWrapper extends ScriptableObject { | |||
|     public Object getDefaultValue(Class hint) { | ||||
|         return toString(); | ||||
|     } | ||||
| } | ||||
| } | ||||
|  |  | |||
|  | @ -44,7 +44,7 @@ import org.mozilla.javascript.Undefined; | |||
| import org.mozilla.javascript.WrapFactory; | ||||
| import org.mozilla.javascript.Wrapper; | ||||
| import org.mozilla.javascript.commonjs.module.RequireBuilder; | ||||
| import org.mozilla.javascript.commonjs.module.provider.*; | ||||
| import org.mozilla.javascript.commonjs.module.provider.StrongCachingModuleScriptProvider; | ||||
| import org.mozilla.javascript.tools.debugger.ScopeProvider; | ||||
| 
 | ||||
| import java.io.*; | ||||
|  | @ -175,9 +175,11 @@ public final class RhinoCore implements ScopeProvider { | |||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             // install the global require() function using our custom modules provider, so that | ||||
|             // CommonJS-style as well as NodeJS-style modules can be required | ||||
|             new RequireBuilder() | ||||
|                 .setModuleScriptProvider(new StrongCachingModuleScriptProvider( | ||||
|                     new UrlModuleSourceProvider(commonJsPaths, null))) | ||||
|                 .setModuleScriptProvider(new CompiledOrInterpretedModuleScriptProvider( | ||||
|                         new NodeModulesProvider(commonJsPaths, null))) | ||||
|                 .setSandboxed(true) | ||||
|                 .createRequire(context, global) | ||||
|                 .install(global); | ||||
|  | @ -1177,6 +1179,8 @@ public final class RhinoCore implements ScopeProvider { | |||
|     } | ||||
| 
 | ||||
|     class StringTrim extends BaseFunction { | ||||
|         private static final long serialVersionUID = -1515630068911501925L; | ||||
| 
 | ||||
|         public Object call(Context cx, Scriptable scope, Scriptable thisObj, Object[] args) { | ||||
|             String str = thisObj.toString(); | ||||
|             return str.trim(); | ||||
|  | @ -1184,6 +1188,8 @@ public final class RhinoCore implements ScopeProvider { | |||
|     } | ||||
| 
 | ||||
|     class DateFormat extends BaseFunction { | ||||
|         private static final long serialVersionUID = 4694440247686532087L; | ||||
| 
 | ||||
|         public Object call(Context cx, Scriptable scope, Scriptable thisObj, Object[] args) { | ||||
|             Date date = new Date((long) ScriptRuntime.toNumber(thisObj)); | ||||
|             SimpleDateFormat df; | ||||
|  | @ -1208,6 +1214,8 @@ public final class RhinoCore implements ScopeProvider { | |||
|     } | ||||
| 
 | ||||
|     class NumberFormat extends BaseFunction { | ||||
|         private static final long serialVersionUID = -6999409297243210875L; | ||||
| 
 | ||||
|         public Object call(Context cx, Scriptable scope, Scriptable thisObj, Object[] args) { | ||||
|             DecimalFormat df; | ||||
|             if (args.length > 0 && args[0] != Undefined.instance) { | ||||
|  |  | |||
|  | @ -568,6 +568,8 @@ public class RhinoEngine implements ScriptingEngine { | |||
|                         return new GlobalProxy((GlobalObject) obj); | ||||
|                     if (obj instanceof ApplicationBean) | ||||
|                         return new ScriptBeanProxy("app"); | ||||
|                     if (obj instanceof Application) | ||||
|                         return new ApplicationProxy(); | ||||
|                     if (obj instanceof RequestBean) | ||||
|                         return new ScriptBeanProxy("req"); | ||||
|                     if (obj instanceof ResponseBean) | ||||
|  |  | |||
|  | @ -35,6 +35,8 @@ public interface SerializationProxy extends Serializable { | |||
|  * Serialization proxy for app, req, res, path objects. | ||||
|  */ | ||||
| class ScriptBeanProxy implements SerializationProxy { | ||||
|     private static final long serialVersionUID = -1002489933060844917L; | ||||
| 
 | ||||
|     String name; | ||||
| 
 | ||||
|     ScriptBeanProxy(String name) { | ||||
|  | @ -47,15 +49,38 @@ class ScriptBeanProxy implements SerializationProxy { | |||
|      * @return the object represented by this proxy | ||||
|      */ | ||||
|     public Object getObject(RhinoEngine engine) { | ||||
|         try { | ||||
|             Object object = engine.global.get(name, engine.global); | ||||
|         } catch (Exception e) { | ||||
|             System.out.println(name); | ||||
|         } | ||||
|          | ||||
|         return engine.global.get(name, engine.global); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * Serialization proxy for the application object. | ||||
|  *  | ||||
|  * @author Daniel Ruthardt | ||||
|  * @since 20170918 | ||||
|  */ | ||||
| class ApplicationProxy implements SerializationProxy { | ||||
|     private static final long serialVersionUID = -3635418002212260600L; | ||||
| 
 | ||||
|     @Override | ||||
|     public Object getObject(RhinoEngine engine) { | ||||
|         // return the application | ||||
|         return engine.app; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * Serialization proxy for global scope | ||||
|  */ | ||||
| class GlobalProxy implements SerializationProxy { | ||||
|     private static final long serialVersionUID = -3200125667487274257L; | ||||
| 
 | ||||
|     boolean shared; | ||||
| 
 | ||||
|     GlobalProxy(GlobalObject scope) { | ||||
|  | @ -76,6 +101,8 @@ class GlobalProxy implements SerializationProxy { | |||
|  * Serialization proxy for various flavors of HopObjects/Nodes | ||||
|  */ | ||||
| class HopObjectProxy implements SerializationProxy { | ||||
|     private static final long serialVersionUID = -4808579296683836009L; | ||||
| 
 | ||||
|     Object ref; | ||||
|     boolean wrapped = false; | ||||
| 
 | ||||
|  |  | |||
|  | @ -123,6 +123,8 @@ public class HelmaDebugger extends Dim implements TreeSelectionListener { | |||
| 
 | ||||
|     class DebuggerTreeNode extends DefaultMutableTreeNode { | ||||
| 
 | ||||
|         private static final long serialVersionUID = -5881442554351749706L; | ||||
| 
 | ||||
|         public DebuggerTreeNode(Object obj) { | ||||
|             super(obj); | ||||
|         } | ||||
|  | @ -156,6 +158,8 @@ public class HelmaDebugger extends Dim implements TreeSelectionListener { | |||
| 
 | ||||
|     class DebugGui extends SwingGui { | ||||
| 
 | ||||
|         private static final long serialVersionUID = 8930558796272502640L; | ||||
| 
 | ||||
|         String currentSourceUrl; | ||||
| 
 | ||||
|         public DebugGui(Dim dim, String title) { | ||||
|  |  | |||
|  | @ -40,6 +40,8 @@ import java.lang.reflect.Method; | |||
|   * An EcmaScript FileIO 'File' object | ||||
|   */ | ||||
| public class FileObject extends ScriptableObject { | ||||
|     private static final long serialVersionUID = -9098307162306984764L; | ||||
| 
 | ||||
|     File file = null; | ||||
|     Object readerWriter = null; | ||||
|     boolean atEOF = false; | ||||
|  |  | |||
|  | @ -35,6 +35,8 @@ import java.lang.reflect.Method; | |||
|  * This uses the NetComponent classes from savarese.org (ex oroinc.com). | ||||
|  */ | ||||
| public class FtpObject extends ScriptableObject { | ||||
|     private static final long serialVersionUID = 3470670009973887555L; | ||||
| 
 | ||||
|     private FTPClient ftpclient; | ||||
|     private String server; | ||||
|     private Exception lastError = null; | ||||
|  |  | |||
|  | @ -150,6 +150,8 @@ public class ImageObject { | |||
|     } | ||||
| 
 | ||||
|     static class GetInfo extends BaseFunction { | ||||
|         private static final long serialVersionUID = 109556119036857349L; | ||||
| 
 | ||||
|         public Object call(Context cx, Scriptable scope, | ||||
|                            Scriptable thisObj, Object[] args) { | ||||
|             if (args.length != 1) { | ||||
|  |  | |||
|  | @ -41,6 +41,8 @@ import javax.mail.internet.MimeUtility; | |||
|  */ | ||||
| public class MailObject extends ScriptableObject implements Serializable { | ||||
| 
 | ||||
|     private static final long serialVersionUID = -4834981850233741039L; | ||||
| 
 | ||||
|     public static final int OK = 0; | ||||
|     public static final int SUBJECT = 10; | ||||
|     public static final int TEXT = 11; | ||||
|  |  | |||
|  | @ -43,6 +43,8 @@ import java.util.Vector; | |||
|  */ | ||||
| public class XmlRpcObject extends BaseFunction { | ||||
| 
 | ||||
|     private static final long serialVersionUID = 1479373761583135438L; | ||||
| 
 | ||||
|     String url = null; | ||||
|     String method = null; | ||||
| 
 | ||||
|  |  | |||
|  | @ -29,6 +29,7 @@ import java.security.NoSuchAlgorithmException; | |||
| import javax.servlet.*; | ||||
| import javax.servlet.http.*; | ||||
| 
 | ||||
| import org.apache.commons.codec.binary.Base64; | ||||
| import org.apache.commons.fileupload.disk.DiskFileItemFactory; | ||||
| import org.apache.commons.fileupload.*; | ||||
| import org.apache.commons.fileupload.servlet.ServletFileUpload; | ||||
|  | @ -40,6 +41,8 @@ import org.apache.commons.fileupload.servlet.ServletRequestContext; | |||
|  */ | ||||
| public abstract class AbstractServletClient extends HttpServlet { | ||||
| 
 | ||||
|     private static final long serialVersionUID = -6096445259839663680L; | ||||
| 
 | ||||
|     // limit to HTTP uploads per file in kB | ||||
|     int uploadLimit = 1024; | ||||
| 
 | ||||
|  | @ -514,9 +517,9 @@ public abstract class AbstractServletClient extends HttpServlet { | |||
|             checksum[i] = (byte) (n); | ||||
|             n >>>= 8; | ||||
|         } | ||||
|         String etag = "\"" + new String(helma.util.Base64.encode(checksum)) + "\""; | ||||
|         res.setHeader("ETag", etag); | ||||
|         String etagHeader = req.getHeader("If-None-Match"); | ||||
|         String etag = "\"" + new String(Base64.encodeBase64(checksum)) + "\"";  //$NON-NLS-1$//$NON-NLS-2$ | ||||
|         res.setHeader("ETag", etag); //$NON-NLS-1$ | ||||
|         String etagHeader = req.getHeader("If-None-Match"); //$NON-NLS-1$ | ||||
|         if (etagHeader != null) { | ||||
|             StringTokenizer st = new StringTokenizer(etagHeader, ", \r\n"); | ||||
|             while (st.hasMoreTokens()) { | ||||
|  |  | |||
|  | @ -26,6 +26,8 @@ import javax.servlet.*; | |||
|  *  web server | ||||
|  */ | ||||
| public final class EmbeddedServletClient extends AbstractServletClient { | ||||
|     private static final long serialVersionUID = -1716809853688477356L; | ||||
| 
 | ||||
|     private Application app = null; | ||||
|     private String appName; | ||||
| 
 | ||||
|  |  | |||
|  | @ -39,6 +39,8 @@ import java.util.*; | |||
|  *     </ul> | ||||
|  */ | ||||
| public final class StandaloneServletClient extends AbstractServletClient { | ||||
|     private static final long serialVersionUID = 6515895361950250466L; | ||||
| 
 | ||||
|     private Application app = null; | ||||
|     private String appName; | ||||
|     private String appDir; | ||||
|  |  | |||
|  | @ -1,286 +0,0 @@ | |||
| //////////////////////license & copyright header///////////////////////// | ||||
| //                                                                     // | ||||
| //    Base64 - encode/decode data using the Base64 encoding scheme     // | ||||
| //                                                                     // | ||||
| //                Copyright (c) 1998 by Kevin Kelley                   // | ||||
| //                                                                     // | ||||
| // This library is free software; you can redistribute it and/or       // | ||||
| // modify it under the terms of the GNU Lesser General Public          // | ||||
| // License as published by the Free Software Foundation; either        // | ||||
| // version 2.1 of the License, or (at your option) any later version.  // | ||||
| //                                                                     // | ||||
| // This library is distributed in the hope that it will be useful,     // | ||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of      // | ||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the       // | ||||
| // GNU Lesser General Public License for more details.                 // | ||||
| //                                                                     // | ||||
| // You should have received a copy of the GNU Lesser General Public    // | ||||
| // License along with this library; if not, write to the Free Software // | ||||
| // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA           // | ||||
| // 02111-1307, USA, or contact the author:                             // | ||||
| //                                                                     // | ||||
| // Kevin Kelley <kelley@ruralnet.net> - 30718 Rd. 28, La Junta, CO,    // | ||||
| // 81050  USA.                                                         // | ||||
| //                                                                     // | ||||
| ////////////////////end license & copyright header/////////////////////// | ||||
| 
 | ||||
| package helma.util; | ||||
| 
 | ||||
| import java.io.*;       // needed only for main() method. | ||||
| 
 | ||||
| 
 | ||||
| /** | ||||
| *   Provides encoding of raw bytes to base64-encoded characters, and | ||||
| *  decoding of base64 characters to raw bytes. | ||||
| * | ||||
| * @author Kevin Kelley (kelley@ruralnet.net) | ||||
| * @version 1.3 | ||||
| * date 06 August 1998 | ||||
| * modified 14 February 2000 | ||||
| * modified 22 September 2000 | ||||
| */ | ||||
| public class Base64 { | ||||
| 
 | ||||
| /** | ||||
| * returns an array of base64-encoded characters to represent the | ||||
| * passed data array. | ||||
| * | ||||
| * @param data the array of bytes to encode | ||||
| * @return base64-coded character array. | ||||
| */ | ||||
| static public char[] encode(byte[] data) | ||||
| { | ||||
|     char[] out = new char[((data.length + 2) / 3) * 4]; | ||||
| 
 | ||||
|     // | ||||
|     // 3 bytes encode to 4 chars.  Output is always an even | ||||
|     // multiple of 4 characters. | ||||
|     // | ||||
|     for (int i=0, index=0; i<data.length; i+=3, index+=4) { | ||||
|         boolean quad = false; | ||||
|         boolean trip = false; | ||||
| 
 | ||||
|         int val = (0xFF & (int) data[i]); | ||||
|         val <<= 8; | ||||
|         if ((i+1) < data.length) { | ||||
|             val |= (0xFF & (int) data[i+1]); | ||||
|             trip = true; | ||||
|         } | ||||
|         val <<= 8; | ||||
|         if ((i+2) < data.length) { | ||||
|             val |= (0xFF & (int) data[i+2]); | ||||
|             quad = true; | ||||
|         } | ||||
|         out[index+3] = alphabet[(quad? (val & 0x3F): 64)]; | ||||
|         val >>= 6; | ||||
|         out[index+2] = alphabet[(trip? (val & 0x3F): 64)]; | ||||
|         val >>= 6; | ||||
|         out[index+1] = alphabet[val & 0x3F]; | ||||
|         val >>= 6; | ||||
|         out[index+0] = alphabet[val & 0x3F]; | ||||
|     } | ||||
|     return out; | ||||
| } | ||||
| 
 | ||||
|   /** | ||||
|    * Decodes a BASE-64 encoded stream to recover the original | ||||
|    * data. White space before and after will be trimmed away, | ||||
|    * but no other manipulation of the input will be performed. | ||||
|    * | ||||
|    * As of version 1.2 this method will properly handle input | ||||
|    * containing junk characters (newlines and the like) rather | ||||
|    * than throwing an error. It does this by pre-parsing the | ||||
|    * input and generating from that a count of VALID input | ||||
|    * characters. | ||||
|    **/ | ||||
| static public byte[] decode(char[] data) | ||||
| { | ||||
|     // as our input could contain non-BASE64 data (newlines, | ||||
|     // whitespace of any sort, whatever) we must first adjust | ||||
|     // our count of USABLE data so that... | ||||
|     // (a) we don't misallocate the output array, and | ||||
|     // (b) think that we miscalculated our data length | ||||
|     //     just because of extraneous throw-away junk | ||||
| 
 | ||||
|     int tempLen = data.length; | ||||
|     for( int ix=0; ix<data.length; ix++ ) | ||||
|     { | ||||
|         if( (data[ix] > 255) || codes[ data[ix] ] < 0 ) | ||||
|             --tempLen;  // ignore non-valid chars and padding | ||||
|     } | ||||
|     // calculate required length: | ||||
|     //  -- 3 bytes for every 4 valid base64 chars | ||||
|     //  -- plus 2 bytes if there are 3 extra base64 chars, | ||||
|     //     or plus 1 byte if there are 2 extra. | ||||
| 
 | ||||
|     int len = (tempLen / 4) * 3; | ||||
|     if ((tempLen % 4) == 3) len += 2; | ||||
|     if ((tempLen % 4) == 2) len += 1; | ||||
| 
 | ||||
|     byte[] out = new byte[len]; | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|     int shift = 0;   // # of excess bits stored in accum | ||||
|     int accum = 0;   // excess bits | ||||
|     int index = 0; | ||||
| 
 | ||||
|     // we now go through the entire array (NOT using the 'tempLen' value) | ||||
|     for (int ix=0; ix<data.length; ix++) | ||||
|     { | ||||
|         int value = (data[ix]>255)? -1: codes[ data[ix] ]; | ||||
| 
 | ||||
|         if ( value >= 0 )           // skip over non-code | ||||
|         { | ||||
|             accum <<= 6;            // bits shift up by 6 each time thru | ||||
|             shift += 6;             // loop, with new bits being put in | ||||
|             accum |= value;         // at the bottom. | ||||
|             if ( shift >= 8 )       // whenever there are 8 or more shifted in, | ||||
|             { | ||||
|                 shift -= 8;         // write them out (from the top, leaving any | ||||
|                 out[index++] =      // excess at the bottom for next iteration. | ||||
|                     (byte) ((accum >> shift) & 0xff); | ||||
|             } | ||||
|         } | ||||
|         // we will also have skipped processing a padding null byte ('=') here; | ||||
|         // these are used ONLY for padding to an even length and do not legally | ||||
|         // occur as encoded data. for this reason we can ignore the fact that | ||||
|         // no index++ operation occurs in that special case: the out[] array is | ||||
|         // initialized to all-zero bytes to start with and that works to our | ||||
|         // advantage in this combination. | ||||
|     } | ||||
| 
 | ||||
|     // if there is STILL something wrong we just have to throw up now! | ||||
|     if( index != out.length) | ||||
|     { | ||||
|         throw new Error("Miscalculated data length (wrote " + index + " instead of " + out.length + ")"); | ||||
|     } | ||||
| 
 | ||||
|     return out; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| // | ||||
| // code characters for values 0..63 | ||||
| // | ||||
| static private char[] alphabet = | ||||
|     "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=" | ||||
|         .toCharArray(); | ||||
| 
 | ||||
| // | ||||
| // lookup table for converting base64 characters to value in range 0..63 | ||||
| // | ||||
| static private byte[] codes = new byte[256]; | ||||
| static { | ||||
|     for (int i=0; i<256; i++) codes[i] = -1; | ||||
|     for (int i = 'A'; i <= 'Z'; i++) codes[i] = (byte)(     i - 'A'); | ||||
|     for (int i = 'a'; i <= 'z'; i++) codes[i] = (byte)(26 + i - 'a'); | ||||
|     for (int i = '0'; i <= '9'; i++) codes[i] = (byte)(52 + i - '0'); | ||||
|     codes['+'] = 62; | ||||
|     codes['/'] = 63; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /////////////////////////////////////////////////// | ||||
| // remainder (main method and helper functions) is | ||||
| // for testing purposes only, feel free to clip it. | ||||
| /////////////////////////////////////////////////// | ||||
| 
 | ||||
| public static void main(String[] args) | ||||
| { | ||||
|     boolean decode = false; | ||||
| 
 | ||||
|     if (args.length == 0) { | ||||
|         System.out.println("usage:  java Base64 [-d[ecode]] filename"); | ||||
|         System.exit(0); | ||||
|     } | ||||
|     for (int i=0; i<args.length; i++) { | ||||
|         if ("-decode".equalsIgnoreCase(args[i])) decode = true; | ||||
|         else if ("-d".equalsIgnoreCase(args[i])) decode = true; | ||||
|     } | ||||
| 
 | ||||
|     String filename = args[args.length-1]; | ||||
|     File file = new File(filename); | ||||
|     if (!file.exists()) { | ||||
|         System.out.println("Error:  file '" + filename + "' doesn't exist!"); | ||||
|         System.exit(0); | ||||
|     } | ||||
| 
 | ||||
|     if (decode) | ||||
|     { | ||||
|         char[] encoded = readChars(file); | ||||
|         byte[] decoded = decode(encoded); | ||||
|         writeBytes(file, decoded); | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         byte[] decoded = readBytes(file); | ||||
|         char[] encoded = encode(decoded); | ||||
|         writeChars(file, encoded); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| private static byte[] readBytes(File file) | ||||
| { | ||||
|     ByteArrayOutputStream baos = new ByteArrayOutputStream(); | ||||
|     try | ||||
|     { | ||||
|         InputStream fis = new FileInputStream(file); | ||||
|         InputStream is = new BufferedInputStream(fis); | ||||
|         int count = 0; | ||||
|         byte[] buf = new byte[16384]; | ||||
|         while ((count=is.read(buf)) != -1) { | ||||
|             if (count > 0) baos.write(buf, 0, count); | ||||
|         } | ||||
|         is.close(); | ||||
|     } | ||||
|     catch (Exception e) { e.printStackTrace(); } | ||||
| 
 | ||||
|     return baos.toByteArray(); | ||||
| } | ||||
| 
 | ||||
| private static char[] readChars(File file) | ||||
| { | ||||
|     CharArrayWriter caw = new CharArrayWriter(); | ||||
|     try | ||||
|     { | ||||
|         Reader fr = new FileReader(file); | ||||
|         Reader in = new BufferedReader(fr); | ||||
|         int count = 0; | ||||
|         char[] buf = new char[16384]; | ||||
|         while ((count=in.read(buf)) != -1) { | ||||
|             if (count > 0) caw.write(buf, 0, count); | ||||
|         } | ||||
|         in.close(); | ||||
|     } | ||||
|     catch (Exception e) { e.printStackTrace(); } | ||||
| 
 | ||||
|     return caw.toCharArray(); | ||||
| } | ||||
| 
 | ||||
| private static void writeBytes(File file, byte[] data) { | ||||
|     try { | ||||
|         OutputStream fos = new FileOutputStream(file); | ||||
|         OutputStream os = new BufferedOutputStream(fos); | ||||
|         os.write(data); | ||||
|         os.close(); | ||||
|     } | ||||
|     catch (Exception e) { e.printStackTrace(); } | ||||
| } | ||||
| 
 | ||||
| private static void writeChars(File file, char[] data) { | ||||
|     try { | ||||
|         Writer fos = new FileWriter(file); | ||||
|         Writer os = new BufferedWriter(fos); | ||||
|         os.write(data); | ||||
|         os.close(); | ||||
|     } | ||||
|     catch (Exception e) { e.printStackTrace(); } | ||||
| } | ||||
| /////////////////////////////////////////////////// | ||||
| // end of test code. | ||||
| /////////////////////////////////////////////////// | ||||
| 
 | ||||
| } | ||||
|  | @ -1,128 +0,0 @@ | |||
| /* | ||||
|  * Helma License Notice | ||||
|  * | ||||
|  * The contents of this file are subject to the Helma License | ||||
|  * Version 2.0 (the "License"). You may not use this file except in | ||||
|  * compliance with the License. A copy of the License is available at | ||||
|  * http://adele.helma.org/download/helma/license.txt | ||||
|  * | ||||
|  * Copyright 1998-2003 Helma Software. All Rights Reserved. | ||||
|  * | ||||
|  * $RCSfile$ | ||||
|  * $Author$ | ||||
|  * $Revision$ | ||||
|  * $Date$ | ||||
|  */ | ||||
| 
 | ||||
| package helma.util; | ||||
| 
 | ||||
| import java.io.*; | ||||
| import java.util.*; | ||||
| 
 | ||||
| /** | ||||
|  *  This file authenticates against a passwd file | ||||
|  */ | ||||
| public class CryptFile { | ||||
|     private Properties users; | ||||
|     private CryptFile parentFile; | ||||
|     private File file; | ||||
|     private long lastRead = 0; | ||||
| 
 | ||||
|     /** | ||||
|      * Creates a new CryptFile object. | ||||
|      * | ||||
|      * @param file ... | ||||
|      * @param parentFile ... | ||||
|      */ | ||||
|     public CryptFile(File file, CryptFile parentFile) { | ||||
|         this.file = file; | ||||
|         this.parentFile = parentFile; | ||||
|         users = new Properties(); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * | ||||
|      * | ||||
|      * @param username ... | ||||
|      * @param pw ... | ||||
|      * | ||||
|      * @return ... | ||||
|      */ | ||||
|     public boolean authenticate(String username, String pw) { | ||||
|         if (file.exists() && (file.lastModified() > lastRead)) { | ||||
|             readFile(); | ||||
|         } else if (!file.exists() && (users.size() > 0)) { | ||||
|             users.clear(); | ||||
|         } | ||||
| 
 | ||||
|         String realpw = users.getProperty(username); | ||||
| 
 | ||||
|         if (realpw != null) { | ||||
|             try { | ||||
|                 // check if password matches | ||||
|                 // first we try with unix crypt algorithm | ||||
|                 String cryptpw = Crypt.crypt(realpw, pw); | ||||
| 
 | ||||
|                 if (realpw.equals(cryptpw)) { | ||||
|                     return true; | ||||
|                 } | ||||
| 
 | ||||
|                 // then try MD5 | ||||
|                 if (realpw.equals(MD5Encoder.encode(pw))) { | ||||
|                     return true; | ||||
|                 } | ||||
|             } catch (Exception x) { | ||||
|                 return false; | ||||
|             } | ||||
|         } else { | ||||
|             if (parentFile != null) { | ||||
|                 return parentFile.authenticate(username, pw); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         return false; | ||||
|     } | ||||
| 
 | ||||
|     private synchronized void readFile() { | ||||
|         BufferedReader reader = null; | ||||
| 
 | ||||
|         users = new Properties(); | ||||
| 
 | ||||
|         try { | ||||
|             reader = new BufferedReader(new FileReader(file)); | ||||
| 
 | ||||
|             String line = reader.readLine(); | ||||
| 
 | ||||
|             while (line != null) { | ||||
|                 StringTokenizer st = new StringTokenizer(line, ":"); | ||||
| 
 | ||||
|                 if (st.countTokens() > 1) { | ||||
|                     users.put(st.nextToken(), st.nextToken()); | ||||
|                 } | ||||
| 
 | ||||
|                 line = reader.readLine(); | ||||
|             } | ||||
|         } catch (Exception ignore) { | ||||
|         } finally { | ||||
|             if (reader != null) { | ||||
|                 try { | ||||
|                     reader.close(); | ||||
|                 } catch (Exception x) { | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             lastRead = System.currentTimeMillis(); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * | ||||
|      * | ||||
|      * @param args ... | ||||
|      */ | ||||
|     public static void main(String[] args) { | ||||
|         CryptFile cf = new CryptFile(new File("passwd"), null); | ||||
| 
 | ||||
|         System.err.println(cf.authenticate("hns", "asdf")); | ||||
|     } | ||||
| } | ||||
|  | @ -20,6 +20,9 @@ import java.io.BufferedReader; | |||
| import java.io.StringReader; | ||||
| import java.util.Properties; | ||||
| import java.util.StringTokenizer; | ||||
| 
 | ||||
| import org.apache.commons.codec.digest.DigestUtils; | ||||
| 
 | ||||
| import helma.framework.repository.Resource; | ||||
| import helma.framework.repository.Resource; | ||||
| 
 | ||||
|  | @ -73,7 +76,7 @@ public class CryptResource { | |||
|                 } | ||||
| 
 | ||||
|                 // then try MD5 | ||||
|                 if (realpw.equals(MD5Encoder.encode(pw))) { | ||||
|                 if (realpw.equals(DigestUtils.md5(pw))) { | ||||
|                     return true; | ||||
|                 } | ||||
|             } catch (Exception x) { | ||||
|  |  | |||
|  | @ -1,107 +0,0 @@ | |||
| /* | ||||
|  * Helma License Notice | ||||
|  * | ||||
|  * The contents of this file are subject to the Helma License | ||||
|  * Version 2.0 (the "License"). You may not use this file except in | ||||
|  * compliance with the License. A copy of the License is available at | ||||
|  * http://adele.helma.org/download/helma/license.txt | ||||
|  * | ||||
|  * Copyright 1998-2003 Helma Software. All Rights Reserved. | ||||
|  * | ||||
|  * $RCSfile$ | ||||
|  * $Author$ | ||||
|  * $Revision$ | ||||
|  * $Date$ | ||||
|  */ | ||||
| 
 | ||||
| package helma.util; | ||||
| 
 | ||||
| import java.security.MessageDigest; | ||||
| import java.security.NoSuchAlgorithmException; | ||||
| 
 | ||||
| /** | ||||
|  *  | ||||
|  */ | ||||
| public class MD5Encoder { | ||||
|     private static MessageDigest md; | ||||
| 
 | ||||
|     /** used by commandline script to create admin username & password          */ | ||||
|     public static void main(String[] args) throws Exception { | ||||
|         if (args.length < 2) { | ||||
|             System.out.println("\n\nUsage: helma.util.MD5Encoder <username> <password>"); | ||||
|             System.out.println("Output:"); | ||||
|             System.out.println("adminUsername=<encoded username>"); | ||||
|             System.out.println("adminPassword=<encoded password>\n"); | ||||
|             System.exit(0); | ||||
|         } | ||||
| 
 | ||||
|         System.out.println("adminUsername=" + encode(args[0])); | ||||
|         System.out.println("adminPassword=" + encode(args[1])); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * | ||||
|      * | ||||
|      * @param str ... | ||||
|      * | ||||
|      * @return ... | ||||
|      * | ||||
|      * @throws NoSuchAlgorithmException ... | ||||
|      */ | ||||
|     public static String encode(String str) throws NoSuchAlgorithmException { | ||||
|         return encode(str.getBytes()); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * | ||||
|      * | ||||
|      * @param message ... | ||||
|      * | ||||
|      * @return ... | ||||
|      * | ||||
|      * @throws NoSuchAlgorithmException ... | ||||
|      */ | ||||
|     public static String encode(byte[] message) throws NoSuchAlgorithmException { | ||||
|         md = MessageDigest.getInstance("MD5"); | ||||
| 
 | ||||
|         byte[] b = md.digest(message); | ||||
|         StringBuffer buf = new StringBuffer(b.length * 2); | ||||
| 
 | ||||
|         for (int i = 0; i < b.length; i++) { | ||||
|             int j = (b[i] < 0) ? (256 + b[i]) : b[i]; | ||||
| 
 | ||||
|             if (j < 16) { | ||||
|                 buf.append("0"); | ||||
|             } | ||||
| 
 | ||||
|             buf.append(Integer.toHexString(j)); | ||||
|         } | ||||
| 
 | ||||
|         return buf.toString(); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      *  Convert a long to a byte array. | ||||
|      */ | ||||
|     public static byte[] toBytes(long n) { | ||||
|         byte[] b = new byte[8]; | ||||
| 
 | ||||
|         b[0] = (byte) (n); | ||||
|         n >>>= 8; | ||||
|         b[1] = (byte) (n); | ||||
|         n >>>= 8; | ||||
|         b[2] = (byte) (n); | ||||
|         n >>>= 8; | ||||
|         b[3] = (byte) (n); | ||||
|         n >>>= 8; | ||||
|         b[4] = (byte) (n); | ||||
|         n >>>= 8; | ||||
|         b[5] = (byte) (n); | ||||
|         n >>>= 8; | ||||
|         b[6] = (byte) (n); | ||||
|         n >>>= 8; | ||||
|         b[7] = (byte) (n); | ||||
| 
 | ||||
|         return b; | ||||
|     } | ||||
| } | ||||
|  | @ -26,6 +26,8 @@ import java.util.StringTokenizer; | |||
|  * This represents a MIME part of a HTTP file upload | ||||
|  */ | ||||
| public class MimePart implements Serializable { | ||||
|     private static final long serialVersionUID = 7800159441938112415L; | ||||
| 
 | ||||
|     private final String name; | ||||
|     private int contentLength; | ||||
|     private String contentType; | ||||
|  |  | |||
|  | @ -28,6 +28,8 @@ import helma.framework.repository.Repository; | |||
|  */ | ||||
| public class ResourceProperties extends Properties { | ||||
| 
 | ||||
|     private static final long serialVersionUID = -2258056784572269727L; | ||||
| 
 | ||||
|     // Delay between checks | ||||
|     private final long CACHE_TIME = 1500L; | ||||
| 
 | ||||
|  | @ -142,7 +144,7 @@ public class ResourceProperties extends Properties { | |||
|         this.parentProperties = parentProperties; | ||||
|         this.prefix = prefix; | ||||
|         resources = new LinkedHashSet(); | ||||
|         setIgnoreCase(parentProperties.ignoreCase);         | ||||
|         setIgnoreCase(parentProperties.ignoreCase); | ||||
|         forceUpdate(); | ||||
|     } | ||||
| 
 | ||||
|  | @ -481,7 +483,7 @@ public class ResourceProperties extends Properties { | |||
|      * @param value value | ||||
|      * @return the old value, if an old value got replaced | ||||
|      */ | ||||
|     public Object put(Object key, Object value) { | ||||
|     public synchronized Object put(Object key, Object value) { | ||||
|         if (value instanceof String) { | ||||
|             value = ((String) value).trim(); | ||||
|         } | ||||
|  | @ -497,7 +499,7 @@ public class ResourceProperties extends Properties { | |||
|      * @param key key | ||||
|      * @return the old value | ||||
|      */ | ||||
|     public Object remove(Object key) { | ||||
|     public synchronized Object remove(Object key) { | ||||
|         String strkey = key.toString(); | ||||
|         if (ignoreCase) { | ||||
|             strkey = (String) keyMap.remove(strkey.toLowerCase()); | ||||
|  |  | |||
|  | @ -27,6 +27,8 @@ import java.util.*; | |||
| public class SystemMap extends HashMap { | ||||
| 
 | ||||
| 
 | ||||
|     private static final long serialVersionUID = 2926260006469380544L; | ||||
| 
 | ||||
|     /** | ||||
|      *  Construct an empty SystemMap. | ||||
|      */ | ||||
|  |  | |||
|  | @ -25,6 +25,8 @@ import java.util.*; | |||
|  */ | ||||
| public final class SystemProperties extends Properties { | ||||
| 
 | ||||
|     private static final long serialVersionUID = -6994562125444162183L; | ||||
| 
 | ||||
|     final static long cacheTime = 1500L; | ||||
|     private SystemProperties defaultProps; // the default/fallback properties. | ||||
|     private File file; // the underlying properties file from which we read. | ||||
|  | @ -197,7 +199,7 @@ public final class SystemProperties extends Properties { | |||
|      * This should not be used directly if properties are read from file, | ||||
|      *  otherwise changes will be lost whe the file is next modified. | ||||
|      */ | ||||
|     public Object put(Object key, Object value) { | ||||
|     public synchronized Object put(Object key, Object value) { | ||||
|         // cut off trailing whitespace | ||||
|         if (value != null) { | ||||
|             value = value.toString().trim(); | ||||
|  | @ -209,7 +211,7 @@ public final class SystemProperties extends Properties { | |||
|     /** | ||||
|      *  Overrides method to act on the wrapped properties object. | ||||
|      */ | ||||
|     public Object get(Object key) { | ||||
|     public synchronized Object get(Object key) { | ||||
|         if ((System.currentTimeMillis() - lastcheck) > cacheTime) { | ||||
|             checkFile(); | ||||
|         } | ||||
|  | @ -220,14 +222,14 @@ public final class SystemProperties extends Properties { | |||
|     /** | ||||
|      *  Overrides method to act on the wrapped properties object. | ||||
|      */ | ||||
|     public Object remove(Object key) { | ||||
|     public synchronized Object remove(Object key) { | ||||
|         return super.remove(ignoreCase ? key.toString().toLowerCase() : key); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      *  Overrides method to act on the wrapped properties object. | ||||
|      */ | ||||
|     public boolean contains(Object obj) { | ||||
|     public synchronized boolean contains(Object obj) { | ||||
|         if ((System.currentTimeMillis() - lastcheck) > cacheTime) { | ||||
|             checkFile(); | ||||
|         } | ||||
|  | @ -238,7 +240,7 @@ public final class SystemProperties extends Properties { | |||
|     /** | ||||
|      *  Overrides method to act on the wrapped properties object. | ||||
|      */ | ||||
|     public boolean containsKey(Object key) { | ||||
|     public synchronized boolean containsKey(Object key) { | ||||
|         if ((System.currentTimeMillis() - lastcheck) > cacheTime) { | ||||
|             checkFile(); | ||||
|         } | ||||
|  | @ -249,7 +251,7 @@ public final class SystemProperties extends Properties { | |||
|     /** | ||||
|      *  Overrides method to act on the wrapped properties object. | ||||
|      */ | ||||
|     public boolean isEmpty() { | ||||
|     public synchronized boolean isEmpty() { | ||||
|         if ((System.currentTimeMillis() - lastcheck) > cacheTime) { | ||||
|             checkFile(); | ||||
|         } | ||||
|  | @ -283,7 +285,7 @@ public final class SystemProperties extends Properties { | |||
|     /** | ||||
|      *  Overrides method to act on the wrapped properties object. | ||||
|      */ | ||||
|     public Enumeration keys() { | ||||
|     public synchronized Enumeration keys() { | ||||
|         if ((System.currentTimeMillis() - lastcheck) > cacheTime) { | ||||
|             checkFile(); | ||||
|         } | ||||
|  | @ -305,7 +307,7 @@ public final class SystemProperties extends Properties { | |||
|     /** | ||||
|      *  Overrides method to act on the wrapped properties object. | ||||
|      */ | ||||
|     public Enumeration elements() { | ||||
|     public synchronized Enumeration elements() { | ||||
|         if ((System.currentTimeMillis() - lastcheck) > cacheTime) { | ||||
|             checkFile(); | ||||
|         } | ||||
|  | @ -316,7 +318,7 @@ public final class SystemProperties extends Properties { | |||
|     /** | ||||
|      *  Overrides method to act on the wrapped properties object. | ||||
|      */ | ||||
|     public int size() { | ||||
|     public synchronized int size() { | ||||
|         if ((System.currentTimeMillis() - lastcheck) > cacheTime) { | ||||
|             checkFile(); | ||||
|         } | ||||
|  | @ -327,7 +329,7 @@ public final class SystemProperties extends Properties { | |||
|     /** | ||||
|      *  Overrides method to act on the wrapped properties object. | ||||
|      */ | ||||
|     public String toString() { | ||||
|     public synchronized String toString() { | ||||
|         return super.toString(); | ||||
|     } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue