Skip to content

Commit

Permalink
EL式、変数のときの再帰評価を削除。
Browse files Browse the repository at this point in the history
  • Loading branch information
mygreen committed Dec 8, 2024
1 parent 54ab392 commit cfe120d
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 85 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -48,16 +48,6 @@ public MessageInterpolator() {

}

/**
* EL式のときは再帰的評価するかどうか。
*/
private boolean recursiveForEl = false;

/**
* リソースファイルのキーを除く変数のときは再帰的評価するかどうか。
*/
private boolean recursiveForVar = false;

/**
* 再帰処理の最大回数
*/
Expand Down Expand Up @@ -216,14 +206,10 @@ private String evaluate(final String expression, final Map<String, ?> values, fi
final String varName = expression.substring(1, expression.length()-1);

if(values.containsKey(varName)) {
// 該当するキーが存在する場合
// 該当するキーが存在する場合(再帰評価は行わない)
final Object value = values.get(varName);
final String eval = (value == null) ? "" : value.toString();
if(!eval.isEmpty() && recursivable(recursive && recursiveForVar, maxRecursiveDepth, currentRecursiveDepth, eval)) {
return parse(eval, values, recursive, currentRecursiveDepth + 1, messageResolver);
} else {
return eval;
}
return eval;

} else if(messageResolver != null) {
// メッセージコードをとして解決をする。
Expand All @@ -245,14 +231,10 @@ private String evaluate(final String expression, final Map<String, ?> values, fi
}

} else if(expression.startsWith("${")) {
// EL式で処理する
// EL式を評価する(再帰評価は行わない)
final String expr = expression.substring(2, expression.length()-1);
final String eval = evaluateExpression(expr, values);
if(recursivable(recursive && recursiveForEl, maxRecursiveDepth, currentRecursiveDepth, eval)) {
return parse(eval, values, recursive, currentRecursiveDepth + 1, messageResolver);
} else {
return eval;
}
return eval;

}

Expand Down Expand Up @@ -335,52 +317,6 @@ public void setExpressionLanguage(ExpressionLanguage expressionLanguage) {
this.expressionLanguage = expressionLanguage;
}

/**
* EL式の場合は再帰的評価するか判定する。
*
* @since 2.3
* @return {@literal true}のとき再帰的評価する。
*/
public boolean isRecursiveForEl() {
return recursiveForEl;
}

/**
* EL式の場合は再帰的評価するかどうか設定する。
* <p>入力値などの任意の値がEL式(<code>${...}</code>)の形式の場合、
* 不要に再帰的に評価されてELインジェクションが発生してしまうのを防ぐために設定します。
* <p>デフォルト値は、{@literal false} で再帰的に評価しない。
*
* @since 2.3
* @param recursiveForEl {@literal true} のとき再帰的評価する。
*/
public void setRecursiveForEl(boolean recursiveForEl) {
this.recursiveForEl = recursiveForEl;
}

/**
* リソースファイルのキーを除く変数を再帰的に評価するかどうか判定する。
*
* @since 2.3
* @return {@literal true}のとき再帰的に評価する。
*/
public boolean isRecursiveForVar() {
return recursiveForVar;
}

/**
* リソースファイルのキーを除く変数を再帰的評価するかどうか設定する。
* <p>入力値などの任意の値が変数(<code>{...}</code>)の形式の場合、
* 不要に再帰的に評価されてELインジェクションが発生してしまうのを防ぐために設定します。
* <p>デフォルト値は、{@literal false} で再帰的に評価しない。
*
* @since 2.3
* @param recursiveForVar {@literal true} のとき再帰的評価する。
*/
public void setRecursiveForVar(boolean recursiveForVar) {
this.recursiveForVar = recursiveForVar;
}

/**
* 評価した変数やEL式を再帰的に処するときの最大回数を取得します。
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;

import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
Expand All @@ -20,6 +21,8 @@
*/
public class MessageInterpolatorTest {

private MessageResolver testMessageResolver = new ResourceBundleMessageResolver();

/**
* 変数のみ - EL式なし
*/
Expand Down Expand Up @@ -156,33 +159,32 @@ public void testInterpolate_lack_end() {
/**
* 再起的にメッセージを評価する。
* 変数の再起
* ※v2.3からは、ELインジェクション対策のため変数は再帰的評価は行わない。
*/
@Test
public void testInterpolate_recursive_vars() {

MessageInterpolator interpolator = new MessageInterpolator();
interpolator.setRecursiveForVar(true);
interpolator.setRecursiveForEl(true);

String message = "{abc} : {message}";

Map<String, Object> vars = new HashMap<>();
vars.put("message", "${1+2}");

String actual = interpolator.interpolate(message, vars, true);
assertThat(actual, is("{abc} : 3"));
assertThat(actual, is("{abc} : ${1+2}"));

}

/**
* 再起的にメッセージを評価する。
* 式の再起
* ※v2.3からは、ELインジェクション対策のためEL式は再帰的評価は行わない。
*/
@Test
public void testInterpolate_recursive_el() {

MessageInterpolator interpolator = new MessageInterpolator();
interpolator.setRecursiveForEl(true);

String message = "{abc} : ${value}";

Expand All @@ -191,7 +193,7 @@ public void testInterpolate_recursive_el() {
vars.put("min", 3);

String actual = interpolator.interpolate(message, vars, true);
assertThat(actual, is("{abc} : 3"));
assertThat(actual, is("{abc} : {min}"));

}

Expand All @@ -203,33 +205,28 @@ public void testInterpolate_recursive_el() {
public void testInterpolate_recursive_maxDepth() {

MessageInterpolator interpolator = new MessageInterpolator();
interpolator.setRecursiveForVar(true);

String message = "{abc} : {value}";
String message = "{abc} : {testRecursive.value}";

// depth2
{
interpolator.setMaxRecursiveDepth(2);

Map<String, Object> vars = new HashMap<>();
vars.put("value", "{min}");
vars.put("min", "{value}");
Map<String, Object> vars = Collections.emptyMap();

String actual = interpolator.interpolate(message, vars, true);
assertThat(actual, is("{abc} : {value}"));
String actual = interpolator.interpolate(message, vars, true, testMessageResolver);
assertThat(actual, is("{abc} : {testRecursive.value}"));

}

// depth3
{
interpolator.setMaxRecursiveDepth(3);

Map<String, Object> vars = new HashMap<>();
vars.put("value", "{min}");
vars.put("min", "{value}");
Map<String, Object> vars = Collections.emptyMap();

String actual = interpolator.interpolate(message, vars, true);
assertThat(actual, is("{abc} : {min}"));
String actual = interpolator.interpolate(message, vars, true, testMessageResolver);
assertThat(actual, is("{abc} : {testRecursive.min}"));

}

Expand Down
3 changes: 3 additions & 0 deletions src/test/resources/SheetValidationMessages.properties
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,6 @@ sample.web.validator.hibernatevalidator.DateRange.message=値を{min}~{max}の
##
cellFieldError.pattern.list.email=メールアドレスの書式に一致しません。

# 再帰用のテスト
testRecursive.value={testRecursive.min}
testRecursive.min={testRecursive.value}

0 comments on commit cfe120d

Please sign in to comment.