Skip to content
This repository was archived by the owner on Apr 6, 2021. It is now read-only.

Commit e8712b0

Browse files
author
chrisisbeef
committed
Added logging and reference implementation using Log4js
1 parent 21b1558 commit e8712b0

File tree

8 files changed

+343
-13
lines changed

8 files changed

+343
-13
lines changed

dist/esapi.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,8 @@ if ( !IllegalArgumentException ) {
209209

210210
var $ESAPI_Properties = {
211211
logger: {
212-
Level: Log4js.Level.ALL,
212+
Implementation: 'org.owasp.esapi.reference.logging.Log4jsLogFactory',
213+
Level: Level.WARNING,
213214
Appenders: [ Log4js.ConsoleAppender ]
214215
},
215216

src/main/javascript/core.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,14 @@ if (!String.prototype.endsWith) {
9999
};
100100
}
101101

102+
if (!Object.prototype.implements) {
103+
Object.prototype.implements = function( oClazz ) {
104+
for ( p in oClazz.prototype ) {
105+
eval("if ( !this."+p+" ) { throw new SyntaxError(oClazz.constructor.toString() + ' must implement ' + property.toString() ); }");
106+
}
107+
};
108+
}
109+
102110
// Declare Core Exceptions
103111
if ( !Exception ) {
104112
var Exception = function( sMsg, oException ) {

src/main/javascript/esapi.properties.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,10 @@
1212
*/
1313

1414
var $ESAPI_Properties = {
15-
logger: {
16-
Level: Log4js.Level.ALL,
17-
Appenders: [ Log4js.ConsoleAppender ]
15+
logging: {
16+
Implementation: 'org.owasp.esapi.reference.logging.Log4JSLogFactory',
17+
Level: 'org.owasp.esapi.Logger.ALL',
18+
Appenders: [ new Log4js.ConsoleAppender() ]
1819
},
1920

2021
encoder: {

src/main/javascript/org.owasp.esapi.js

Lines changed: 130 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,19 @@ org.owasp.esapi = {
3434
};
3535
},
3636

37+
HTTPUtilities: function() {
38+
return {
39+
addCookie: false,
40+
getSessionID: false,
41+
getCookie: false,
42+
killAllCookies: false,
43+
killCookie: false,
44+
logHTTPRequest: false,
45+
sendForward: false,
46+
getRequestParameter: false
47+
};
48+
},
49+
3750
IntrusionException: function(sUserMessage, sLogMessage, oCause) {
3851
var _super = new org.owasp.esapi.EnterpriseSecurityException(sUserMessage, sLogMessage, oCause);
3952

@@ -46,6 +59,53 @@ org.owasp.esapi = {
4659
};
4760
},
4861

62+
LogFactory: function() {
63+
return {
64+
getLogger: false
65+
};
66+
},
67+
68+
Logger: {
69+
EventType: function( sName, bNewSuccess ) {
70+
var type = sName;
71+
var success = bNewSuccess;
72+
73+
return {
74+
isSuccess: function() {
75+
return success;
76+
},
77+
78+
toString: function() {
79+
return type;
80+
}
81+
};
82+
},
83+
84+
OFF: Number.MAX_VALUE,
85+
FATAL: 1000,
86+
ERROR: 800,
87+
WARNING: 600,
88+
INFO: 400,
89+
DEBUG: 200,
90+
TRACE: 100,
91+
ALL: Number.MIN_VALUE,
92+
93+
prototype: {
94+
setLevel: false,
95+
fatal: false,
96+
error: false,
97+
isErrorEnabled: false,
98+
warning: false,
99+
isWarningEnabled: false,
100+
info: false,
101+
isInfoEnabled: false,
102+
debug: false,
103+
isDebugEnabled: false,
104+
trace: false,
105+
isTraceEnabled: false
106+
}
107+
},
108+
49109
PreparedString: function(sTemplate, oCodec, sParameterCharacter) {
50110
// Private Scope
51111
var parts = [];
@@ -101,11 +161,72 @@ org.owasp.esapi = {
101161
};
102162
},
103163

164+
ValidationErrorList: function() {
165+
var errorList = Array();
166+
167+
return {
168+
addError: function( sContext, oValidationException ) {
169+
if ( sContext == null ) throw new RuntimeException( "Context cannot be null: " + oValidationException.getLogMessage(), oValidationException );
170+
if ( oValidationException == null ) throw new RuntimeException( "Context (" + sContext + ") - Error cannot be null" );
171+
if ( errorList[sContext] ) throw new RuntimeException( "Context (" + sContext + ") already exists. must be unique." );
172+
errorList[sContext] = oValidationException;
173+
},
174+
175+
errors: function() {
176+
return errorList;
177+
},
178+
179+
isEmpty: function() {
180+
return errorList.length == 0;
181+
},
182+
183+
size: function() {
184+
return errorList.length;
185+
}
186+
};
187+
},
188+
189+
ValidationRule: function() {
190+
return {
191+
getValid: false,
192+
setAllowNull: false,
193+
getTypeName: false,
194+
setTypeName: false,
195+
setEncoder: false,
196+
assertValid: false,
197+
getValid: false,
198+
getSafe: false,
199+
isValid: false,
200+
whitelist: false
201+
};
202+
},
203+
204+
Validator: function() {
205+
return {
206+
addRule: false,
207+
getRule: false,
208+
getValidInput: false,
209+
isValidDate: false,
210+
getValidDate: false,
211+
isValidSafeHTML: false,
212+
getValidSafeHTML: false,
213+
isValidCreditCard: false,
214+
getValidCreditCard: false,
215+
isValidFilename: false,
216+
getValidFilename: false,
217+
isValidNumber: false,
218+
getValidNumber: false,
219+
isValidPrintable: false,
220+
getValidPrintable: false
221+
};
222+
},
223+
104224
ESAPI: function() {
105225
var _properties = $ESAPI_Properties;
106226

107227
var _encoder = null;
108228
var _validator = null;
229+
var _logFactory = null;
109230

110231
return {
111232
properties: _properties,
@@ -118,13 +239,16 @@ org.owasp.esapi = {
118239
return _encoder;
119240
},
120241

121-
logger: function(sModuleName) {
122-
var _logger = Log4js.getLogger(sModuleName);
123-
_logger.setLevel(_properties.logger.level);
124-
for (var i = 0; i < _properties.logger.appenders.length; i++) {
125-
_logger.addAppender(new _properties.logger.appenders[i]());
242+
logFactory: function() {
243+
eval('$require('+_properties.logging.Implementation+');');
244+
if ( !_logFactory ) {
245+
eval("_logFactory = new " + _properties.logging.Implementation + "();" );
126246
}
127-
return _logger;
247+
return _logFactory;
248+
},
249+
250+
logger: function(sModuleName) {
251+
return this.logFactory().getLogger(sModuleName);
128252
},
129253

130254
validator: function() {
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
/*
2+
* OWASP Enterprise Security API (ESAPI)
3+
*
4+
* This file is part of the Open Web Application Security Project (OWASP)
5+
* Enterprise Security API (ESAPI) project. For details, please see
6+
* <a href="http://www.owasp.org/index.php/ESAPI">http://www.owasp.org/index.php/ESAPI</a>.
7+
*
8+
* Copyright (c) 2008 - The OWASP Foundation
9+
*
10+
* The ESAPI is published by OWASP under the BSD license. You should read and accept the
11+
* LICENSE before you use, modify, and/or redistribute this software.
12+
*/
13+
14+
$namespace('org.owasp.esapi.reference.logging');
15+
16+
org.owasp.esapi.reference.logging = {
17+
Log4JSLogFactory: function() {
18+
var loggersMap = Array();
19+
20+
var Log4JSLogger = function( sModuleName ) {
21+
var jsLogger = null;
22+
var moduleName = null;
23+
var Level = Log4js.Level;
24+
25+
jsLogger = Log4js.getLogger( moduleName );
26+
27+
var convertESAPILevel = function( nLevel ) {
28+
var Logger = org.owasp.esapi.Logger;
29+
switch (nLevel) {
30+
case Logger.OFF: return Log4js.Level.OFF;
31+
case Logger.FATAL: return Log4js.Level.FATAL;
32+
case Logger.ERROR: return Log4js.Level.ERROR;
33+
case Logger.WARNING: return Log4js.Level.WARN;
34+
case Logger.INFO: return Log4js.Level.INFO;
35+
case Logger.DEBUG: return Log4js.Level.DEBUG;
36+
case Logger.TRACE: return Log4js.Level.TRACE;
37+
case Logger.ALL: return Log4js.Level.ALL;
38+
}
39+
};
40+
41+
return {
42+
setLevel: function( nLevel ) {
43+
try {
44+
jsLogger.setLevel( convertESAPILevel( nLevel ) );
45+
} catch (e) {
46+
this.error( org.owasp.esapi.Logger.SECURITY_FAILURE, "", e );
47+
}
48+
},
49+
50+
trace: function( oEventType, sMessage, oException ) {
51+
this.log( Level.TRACE, oEventType, sMessage, oException );
52+
},
53+
54+
debug: function( oEventType, sMessage, oException ) {
55+
this.log( Level.DEBUG, oEventType, sMessage, oException );
56+
},
57+
58+
info: function( oEventType, sMessage, oException ) {
59+
this.log( Level.INFO, oEventType, sMessage, oException );
60+
},
61+
62+
warning: function( oEventType, sMessage, oException ) {
63+
this.log( Level.WARN, oEventType, sMessage, oException );
64+
},
65+
66+
error: function( oEventType, sMessage, oException ) {
67+
this.log( Level.ERROR, oEventType, sMessage, oException );
68+
},
69+
70+
fatal: function( oEventType, sMessage, oException ) {
71+
this.log( Level.FATAL, oEventType, sMessage, oException );
72+
},
73+
74+
log: function( oLevel, oEventType, sMessage, oException ) {
75+
switch(oLevel) {
76+
case Level.TRACE: if ( !jsLogger.isTraceEnabled() ) { return; } break;
77+
case Level.DEBUG: if ( !jsLogger.isDebugEnabled() ) { return; } break;
78+
case Level.INFO: if ( !jsLogger.isInfoEnabled() ) { return; } break;
79+
case Level.WARNING: if ( !jsLogger.isWarnEnabled() ) { return; } break;
80+
case Level.ERROR: if ( !jsLogger.isErrorEnabled() ) { return; } break;
81+
case Level.FATAL: if ( !jsLogger.isFatalEnabled() ) { return; } break;
82+
}
83+
84+
if ( !sMessage ) {
85+
sMessage = "";
86+
}
87+
88+
var clean = sMessage.replace("\n","_").replace("\r","_");
89+
if ( $ESAPI.properties.logging.EncodingRequired ) {
90+
clean = $ESAPI.encoder().encodeForHTML(clean);
91+
if ( clean != sMessage) {
92+
clean += " [Encoded]";
93+
}
94+
}
95+
96+
var appInfo = ( $ESAPI.properties.logging.LogUrl ? window.location.href : "" ) +
97+
( $ESAPI.properties.logging.LogApplicationName ? "/" + $ESAPI.properties.logging.ApplicationName : "" );
98+
99+
jsLogger.log( oLevel, appInfo != "" ? "[" + appInfo + "] " : "" + clean, oException );
100+
},
101+
102+
addAppender: function( oAppender ) {
103+
jsLogger.addAppender( oAppender );
104+
},
105+
106+
isDebugEnabled: function() { return jsLogger.isDebugEnabled(); },
107+
isErrorEnabled: function() { return jsLogger.isErrorEnabled(); },
108+
isFatalEnabled: function() { return jsLogger.isFatalEnabled(); },
109+
isInfoEnabled: function() { return jsLogger.isInfoEnabled(); },
110+
isTraceEnabled: function() { return jsLogger.isTraceEnabled(); },
111+
isWarningEnabled: function() { return jsLogger.isWarnEnabled(); }
112+
};
113+
};
114+
115+
return {
116+
getLogger: function ( moduleName ) {
117+
var key = ( typeof moduleName == 'string' ) ? moduleName : moduleName.constructor.toString();
118+
var logger = loggersMap[key];
119+
if ( !logger ) {
120+
logger = new Log4JSLogger(key);
121+
122+
if ( Log4js.config && Log4js.config[moduleName] ) {
123+
logger.setLevel( Log4js.config[moduleName].level?Log4js.config[moduleName].level:eval($ESAPI.properties.logging.Level));
124+
if ( Log4js.config[moduleName].appenders ) {
125+
Log4js.config[moduleName].appenders.each(function(e){
126+
logger.addAppender(e);
127+
});
128+
}
129+
} else {
130+
eval('logger.setLevel( '+$ESAPI.properties.logging.Level+' );');
131+
$ESAPI.properties.logging.Appenders.each(function(e){
132+
logger.addAppender(e);
133+
});
134+
}
135+
136+
loggersMap[key] = logger;
137+
}
138+
return logger;
139+
}
140+
};
141+
}
142+
};
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
/*
2+
* OWASP Enterprise Security API (ESAPI)
3+
*
4+
* This file is part of the Open Web Application Security Project (OWASP)
5+
* Enterprise Security API (ESAPI) project. For details, please see
6+
* <a href="http://www.owasp.org/index.php/ESAPI">http://www.owasp.org/index.php/ESAPI</a>.
7+
*
8+
* Copyright (c) 2008 - The OWASP Foundation
9+
*
10+
* The ESAPI is published by OWASP under the BSD license. You should read and accept the
11+
* LICENSE before you use, modify, and/or redistribute this software.
12+
*/
13+
14+
$namespace('org.owasp.esapi.reference.validation');
15+

0 commit comments

Comments
 (0)