caf.js 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. /****************************************************************
  2. ** Licensed Materials - Property of IBM
  3. **
  4. ** IBM Cognos Products: CAFJ
  5. **
  6. ** © Copyright IBM Corp. 2005, 2015
  7. ** US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
  8. *****************************************************************/
  9. // Copyright (C) 2008 Cognos ULC, an IBM Company. All rights reserved.
  10. // Cognos (R) is a trademark of Cognos ULC, (formerly Cognos Incorporated).
  11. var CAF_HEX_CHARS = "0123456789abcdef";
  12. // Encodes the passed getData string so that it can be used safely with third party tools
  13. // that check for specific characters in GET requets.
  14. // Requires global variables caf_tpXSSCheckingUsed, and caf_tpXSSChars
  15. // to be set externally by CAF getJavascriptConfig (usually using XTS)
  16. function CAFXSSEncode(getData) {
  17. if (typeof caf_tpXSSCheckingUsed == "undefined" || typeof caf_tpXSSChars == "undefined" ||
  18. !caf_tpXSSCheckingUsed) {
  19. return getData;
  20. }
  21. var res = "";
  22. res += "XSSSTART";
  23. var c = '';
  24. var isXSSChar = false;
  25. var j = 0;
  26. var h1 = 0;
  27. var h2 = 0;
  28. var str = "" + getData; // ensure param is string
  29. for (var i = 0; i < str.length; i++) {
  30. c = str.charAt(i);
  31. if (c == '%') {
  32. res += '*';
  33. } else if (c == '*') {
  34. res += "_2a";
  35. } else if (c == '_') {
  36. res += "_5f";
  37. } else {
  38. isXSSChar = false;
  39. for (j = 0; j < caf_tpXSSChars.length; ++j) {
  40. if (c == caf_tpXSSChars.charAt(j)) {
  41. isXSSChar = true;
  42. break;
  43. }
  44. }
  45. if (isXSSChar) {
  46. res += '_';
  47. h1 = Math.floor(c.charCodeAt(0) / 16);
  48. h2 = c.charCodeAt(0) - h1 * 16;
  49. res += CAF_HEX_CHARS.charAt(h1);
  50. res += CAF_HEX_CHARS.charAt(h2);
  51. } else {
  52. res += c;
  53. }
  54. }
  55. }
  56. res += "XSSEND";
  57. return res;
  58. }
  59. // CAFXSSEncode utility function that accepts full URLs.
  60. // Extracts get data from the passed url, gets it encoded value, and returns the modified URL
  61. function CAFXSSEncodeURL(url) {
  62. var str = "" + url; // ensure param is string
  63. var array = str.split("?");
  64. if (array.length == 2) {
  65. var hostPath = array[0];
  66. var getData = array[1];
  67. getData = CAFXSSEncode(getData);
  68. str = hostPath + "?" + getData;
  69. }
  70. return str;
  71. }
  72. // Series 7 XSS encode for URLs.
  73. // Requires global variables caf_tpXSSCheckingUsed, and caf_tpXSSChars to be set
  74. function CAFS7XSSEncodeURL(url) {
  75. if (typeof caf_tpXSSCheckingUsed == "undefined" || typeof caf_tpXSSChars == "undefined" ||
  76. !caf_tpXSSCheckingUsed) {
  77. return url;
  78. }
  79. var str = "" + url; // ensure param is string
  80. var array = str.split("?");
  81. if (array.length == 2) {
  82. var hostPath = array[0];
  83. var getData = array[1];
  84. var qs = "AFDATA";
  85. var isXSSChar = false;
  86. for (var i = 0; i < getData.length; i++) {
  87. c = getData.charAt(i);
  88. if (c == '%') {
  89. qs += '_25';
  90. } else if (c == '_') {
  91. qs += "_5f";
  92. } else {
  93. isXSSChar = false;
  94. for (j = 0; j < caf_tpXSSChars.length; ++j) {
  95. if (c == caf_tpXSSChars.charAt(j)) {
  96. isXSSChar = true;
  97. break;
  98. }
  99. }
  100. if (isXSSChar) {
  101. qs += '_';
  102. h1 = Math.floor(c.charCodeAt(0) / 16);
  103. h2 = c.charCodeAt(0) - h1 * 16;
  104. qs += CAF_HEX_CHARS.charAt(h1);
  105. qs += CAF_HEX_CHARS.charAt(h2);
  106. } else {
  107. qs += c;
  108. }
  109. }
  110. }
  111. str = hostPath + "?" + qs;
  112. }
  113. return str;
  114. }
  115. function CAFContainsInvalidString(str) {
  116. var res = null;
  117. var re = new RegExp("(</?form\\b|</?script\\b|<embed\\b|</?object\\b|<applet\\b|<meta\\b|\\bonevent\\b|\\bonsubmit\\b|\\bonload\\b|\\bonmouse\\b|<iframe\\b|<frameset\\b|\\bjavascript\\b|\\bexpression\\()", "i");
  118. var ar = re.exec(str);
  119. if (ar != null) {
  120. res = ar[1];
  121. }
  122. return res;
  123. }
  124. // CAFIsUrlSafe
  125. // Takes the given URL and determines if it is well formed
  126. // syntactically and does not contain any forbidden elements.
  127. // param: url - A string containing the url to check. Null returns
  128. // false.
  129. // return: boolean indicating safe/not safe.
  130. function CAFIsUrlSafe( url ) {
  131. if ( url == null || url.length == 0 ) {
  132. return false;
  133. }
  134. // NOTE:
  135. // The period inside a set class, the square brackets, do not need escaping. They will mean a literal period character.
  136. // Outside of the set class, unescaped will result in the regular expression period meaning. If escaped with two
  137. // backslashes, it will mean the literal period character.
  138. //NOTE:
  139. // The relative URL portion in the regular expression does NOT match the java regular expression. Javascript
  140. // has not possesive quantifier, namely ?>. Howe
  141. // Check if URL well formed.
  142. var reUrl =
  143. "^(\/|\\.\/|\\.\\.\/|#.+|[^.]([^:]+\/?))(([^\/]+|([^\/]+\/)+[^\/]+))$" + // relative path
  144. "|" +
  145. "^http(s)?:\/\/" + // protocol
  146. "([\\w-]+)([\\w.-]+)([\\w-]+)" + // domain
  147. "(:(\\d|[1-9]\\d|[1-9]\\d\\d|[1-9]" + // valid ports
  148. "\\d\\d\\d|[1-5]\\d\\d\\d\\d|6[0-4]\\d" + // 1-65535
  149. "\\d\\d|65[0-4]\\d\\d|655[0-2]\\d|6553[0-5]))?" +
  150. "((\/?)|" + // "/" optional if no path
  151. "((\/[0-9a-z_!~*'().;?<>:@&=+$,%#-]+)+\/?))$"; // path
  152. var re = new RegExp( reUrl, "i" );
  153. var match = re.test( url );
  154. if ( match == false ) {
  155. return false;
  156. }
  157. // Look for evilness within the string.
  158. var reBad = new RegExp("(<\/?form|<\/?script|<embed|<\/?object|<applet|<meta|onevent|onsubmit|onload|onmouse|<iframe|<frameset|javascript|expression\\()", "i");
  159. var bad = reBad.test( url );
  160. if ( bad == true ) {
  161. return false;
  162. }
  163. return true;
  164. }
  165. // defect 45617 - validate email address using a simplified pattern for the address specification of RFC 5322 section-3.4.1
  166. // CAF server will also do this validation therefore changes here need to be reflected on the server as well
  167. function CAFIsValidEmailAddress(emailAddr) {
  168. var regExp = new RegExp("^[a-zA-Z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\\.[a-zA-Z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\\.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-z0A-Z-9])?$");
  169. return regExp.test(emailAddr);
  170. }