blob: 498266829974913c0cf34b5423beb197e28ee4de [file] [log] [blame]
/*
* Copyright 2011 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.gwt.user.server.rpc;
import com.google.gwt.user.client.rpc.RpcToken;
import com.google.gwt.user.client.rpc.RpcTokenException;
import com.google.gwt.user.client.rpc.XsrfProtectedService;
import junit.framework.TestCase;
import java.lang.reflect.Method;
/**
* Tests {@link AbstractXsrfProtectedServiceServlet}'s XSRF enforcement logic.
*/
public class AbstractXsrfProtectedServiceServletTest extends TestCase {
private boolean isValidateCalled;
@Override
public void setUp() {
isValidateCalled = false;
}
private MockXsrfProtectedServiceServlet mockServlet =
new MockXsrfProtectedServiceServlet();
private class MockXsrfProtectedServiceServlet extends
AbstractXsrfProtectedServiceServlet {
@Override
protected void validateXsrfToken(RpcToken token, Method method)
throws RpcTokenException {
isValidateCalled = true;
}
}
@XsrfProtect
private interface RpcWithXsrfProtect {
void foo();
}
@XsrfProtect
private interface RpcWithXsrfProtectAndMethodOverride {
@NoXsrfProtect
void foo();
}
@NoXsrfProtect
private interface RpcWithNoXsrfProtect {
void foo();
}
@NoXsrfProtect
private interface RpcWithNoXsrfProtectAndMethodOverride {
@XsrfProtect
void foo();
}
private interface RpcWithoutAnnotationAndMethodXsrfProtect {
@XsrfProtect
void foo();
}
private interface RpcWithoutAnnotationAndMethodNoXsrfProtect {
@NoXsrfProtect
void foo();
}
private interface RpcWithoutAnnotationsAndWithRpcTokenMethod {
void foo();
RpcToken getToken();
}
@NoXsrfProtect
private interface
RpcWithoutAnnotationsAndWithRpcTokenMethodAndNoProtectOverride {
void foo();
RpcToken getToken();
}
@XsrfProtect
private interface
RpcWithoutAnnotationsAndWithRpcTokenMethodAndProtectOverride {
void foo();
RpcToken getToken();
}
@SuppressWarnings("rpc-validation")
private interface XsrfProtectedRpc extends XsrfProtectedService {
void foo();
}
@SuppressWarnings("rpc-validation")
private interface XsrfProtectedRpcWithOverride extends XsrfProtectedRpc {
void fooBar();
@NoXsrfProtect
void insecure();
}
private interface RpcWithoutAnyAnnotations {
void foo();
}
public void testShouldValidatedXsrfToken() throws Exception {
checkXsrfValidationLogic(RpcWithXsrfProtect.class, "foo", true);
checkXsrfValidationLogic(RpcWithXsrfProtectAndMethodOverride.class, "foo",
false);
checkXsrfValidationLogic(RpcWithNoXsrfProtect.class, "foo", false);
checkXsrfValidationLogic(RpcWithNoXsrfProtectAndMethodOverride.class, "foo",
true);
checkXsrfValidationLogic(RpcWithoutAnnotationAndMethodXsrfProtect.class,
"foo", true);
checkXsrfValidationLogic(RpcWithoutAnnotationAndMethodNoXsrfProtect.class,
"foo", false);
checkXsrfValidationLogic(RpcWithoutAnnotationsAndWithRpcTokenMethod.class,
"foo", true);
checkXsrfValidationLogic(
RpcWithoutAnnotationsAndWithRpcTokenMethodAndNoProtectOverride.class,
"foo", false);
checkXsrfValidationLogic(
RpcWithoutAnnotationsAndWithRpcTokenMethodAndNoProtectOverride.class,
"getToken", false);
checkXsrfValidationLogic(
RpcWithoutAnnotationsAndWithRpcTokenMethodAndProtectOverride.class,
"foo", true);
checkXsrfValidationLogic(
RpcWithoutAnnotationsAndWithRpcTokenMethodAndProtectOverride.class,
"getToken", true);
checkXsrfValidationLogic(RpcWithoutAnyAnnotations.class, "foo", false);
checkXsrfValidationLogic(RpcWithoutAnnotationsAndWithRpcTokenMethod.class,
"getToken", false);
checkXsrfValidationLogic(XsrfProtectedRpc.class, "foo", true);
checkXsrfValidationLogic(XsrfProtectedRpcWithOverride.class, "foo", true);
checkXsrfValidationLogic(XsrfProtectedRpcWithOverride.class, "insecure",
false);
}
private void checkXsrfValidationLogic(Class<?> rpcClass, String methodName,
boolean mustCallValidate) throws Exception {
isValidateCalled = false;
Method method = rpcClass.getMethod(methodName, new Class[] {});
RPCRequest request = new RPCRequest(method, new Object[] {}, null, 0);
mockServlet.onAfterRequestDeserialized(request);
assertEquals(mustCallValidate, isValidateCalled);
}
}