YARN-4769. Add support for CSRF header in the dump capacity scheduler logs and kill app buttons in RM web UI. Contributed by Varun Vasudev

This commit is contained in:
Jian He 2016-04-06 16:13:47 -07:00
parent aede8c10ec
commit 93bacda08b
3 changed files with 23 additions and 1 deletions

View File

@ -62,7 +62,7 @@ public class RestCsrfPreventionFilter implements Filter {
public static final String CUSTOM_METHODS_TO_IGNORE_PARAM = public static final String CUSTOM_METHODS_TO_IGNORE_PARAM =
"methods-to-ignore"; "methods-to-ignore";
static final String BROWSER_USER_AGENTS_DEFAULT = "^Mozilla.*,^Opera.*"; static final String BROWSER_USER_AGENTS_DEFAULT = "^Mozilla.*,^Opera.*";
static final String HEADER_DEFAULT = "X-XSRF-HEADER"; public static final String HEADER_DEFAULT = "X-XSRF-HEADER";
static final String METHODS_TO_IGNORE_DEFAULT = "GET,OPTIONS,HEAD,TRACE"; static final String METHODS_TO_IGNORE_DEFAULT = "GET,OPTIONS,HEAD,TRACE";
private String headerName = HEADER_DEFAULT; private String headerName = HEADER_DEFAULT;
private Set<String> methodsToIgnore = null; private Set<String> methodsToIgnore = null;

View File

@ -24,12 +24,14 @@
import java.security.PrivilegedExceptionAction; import java.security.PrivilegedExceptionAction;
import java.util.Collection; import java.util.Collection;
import java.util.Map;
import org.apache.commons.lang.StringEscapeUtils; import org.apache.commons.lang.StringEscapeUtils;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.security.UserGroupInformation; import org.apache.hadoop.security.UserGroupInformation;
import org.apache.hadoop.security.http.RestCsrfPreventionFilter;
import org.apache.hadoop.util.StringUtils; import org.apache.hadoop.util.StringUtils;
import org.apache.hadoop.yarn.api.ApplicationBaseProtocol; import org.apache.hadoop.yarn.api.ApplicationBaseProtocol;
import org.apache.hadoop.yarn.api.protocolrecords.GetApplicationAttemptsRequest; import org.apache.hadoop.yarn.api.protocolrecords.GetApplicationAttemptsRequest;
@ -143,6 +145,7 @@ public ApplicationReport run() throws Exception {
.append(" type: 'PUT',") .append(" type: 'PUT',")
.append(" url: '/ws/v1/cluster/apps/").append(aid).append("/state',") .append(" url: '/ws/v1/cluster/apps/").append(aid).append("/state',")
.append(" contentType: 'application/json',") .append(" contentType: 'application/json',")
.append(getCSRFHeaderString(conf))
.append(" data: '{\"state\":\"KILLED\"}',") .append(" data: '{\"state\":\"KILLED\"}',")
.append(" dataType: 'json'") .append(" dataType: 'json'")
.append(" }).done(function(data){") .append(" }).done(function(data){")
@ -369,4 +372,21 @@ protected void createApplicationMetricsTable(Block html) {
protected LogAggregationStatus getLogAggregationStatus() { protected LogAggregationStatus getLogAggregationStatus() {
return null; return null;
} }
public static String getCSRFHeaderString(Configuration conf) {
String ret = "";
if (conf.getBoolean(YarnConfiguration.RM_CSRF_ENABLED, false)) {
ret = " headers : { '";
Map<String, String> filterParams = RestCsrfPreventionFilter
.getFilterParams(conf, YarnConfiguration.RM_CSRF_PREFIX);
if (filterParams
.containsKey(RestCsrfPreventionFilter.CUSTOM_HEADER_PARAM)) {
ret += filterParams.get(RestCsrfPreventionFilter.CUSTOM_HEADER_PARAM);
} else {
ret += RestCsrfPreventionFilter.HEADER_DEFAULT;
}
ret += "' : 'null' },";
}
return ret;
}
} }

View File

@ -42,6 +42,7 @@
import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.PartitionResourcesInfo; import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.PartitionResourcesInfo;
import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.ResourceInfo; import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.ResourceInfo;
import org.apache.hadoop.yarn.server.security.ApplicationACLsManager; import org.apache.hadoop.yarn.server.security.ApplicationACLsManager;
import org.apache.hadoop.yarn.server.webapp.AppBlock;
import org.apache.hadoop.yarn.util.Times; import org.apache.hadoop.yarn.util.Times;
import org.apache.hadoop.yarn.util.resource.Resources; import org.apache.hadoop.yarn.util.resource.Resources;
import org.apache.hadoop.yarn.webapp.ResponseInfo; import org.apache.hadoop.yarn.webapp.ResponseInfo;
@ -357,6 +358,7 @@ public void render(Block html) {
.append(" type: 'POST',") .append(" type: 'POST',")
.append(" url: '/ws/v1/cluster/scheduler/logs',") .append(" url: '/ws/v1/cluster/scheduler/logs',")
.append(" contentType: 'text/plain',") .append(" contentType: 'text/plain',")
.append(AppBlock.getCSRFHeaderString(rm.getConfig()))
.append(" data: 'time=' + timePeriod,") .append(" data: 'time=' + timePeriod,")
.append(" dataType: 'text'") .append(" dataType: 'text'")
.append(" }).done(function(data){") .append(" }).done(function(data){")