use of com.tremolosecurity.util.NVP in project OpenUnison by TremoloSecurity.
the class UriRequestProcess method postProcess.
@Override
public void postProcess(HttpFilterRequest req, HttpFilterResponse resp, UrlHolder holder, HttpFilterChain chain) throws Exception {
String proxyTo = holder.getUrl().getProxyTo();
HashMap<String, String> uriParams = (HashMap<String, String>) req.getAttribute("TREMOLO_URI_PARAMS");
Iterator<String> names;
StringBuffer proxyToURL = ProxyTools.getInstance().getGETUrl(req, holder, uriParams);
boolean first = true;
for (NVP p : req.getQueryStringParams()) {
if (first) {
proxyToURL.append('?');
first = false;
} else {
proxyToURL.append('&');
}
proxyToURL.append(p.getName()).append('=').append(URLEncoder.encode(p.getValue(), "UTF-8"));
}
com.tremolosecurity.proxy.HttpUpgradeRequestManager upgradeRequestManager = GlobalEntries.getGlobalEntries().getConfigManager().getUpgradeManager();
if (req.getHeader("Connection") != null && req.getHeader("Connection").getValues().get(0).equalsIgnoreCase("Upgrade")) {
ProxyResponse pr = (ProxyResponse) resp.getServletResponse();
upgradeRequestManager.proxyWebSocket(req, (HttpServletResponse) pr.getResponse(), proxyToURL.toString());
} else {
CloseableHttpClient httpclient = this.getHttp(proxyTo, req.getServletRequest(), holder);
// HttpGet httpget = new HttpGet(proxyToURL.toString());
// this.getHttpMethod(proxyToURL.toString());
HttpRequestBase httpMethod = new UriMethod(req.getMethod(), proxyToURL.toString());
req.setAttribute("TREMOLO_FINAL_URL", proxyToURL.toString());
setHeadersCookies(req, holder, httpMethod, proxyToURL.toString());
HttpContext ctx = (HttpContext) req.getSession().getAttribute(ProxySys.HTTP_CTX);
HttpResponse response = httpclient.execute(httpMethod, ctx);
postProcess(req, resp, holder, response, proxyToURL.toString(), chain, httpMethod);
}
}
use of com.tremolosecurity.util.NVP in project OpenUnison by TremoloSecurity.
the class ScaleMain method initFilter.
@Override
public void initFilter(HttpFilterConfig config) throws Exception {
this.scaleConfig = new ScaleConfig();
scaleConfig.setDisplayNameAttribute(this.loadAttributeValue("displayNameAttribute", "Display Name Attribute Name", config));
scaleConfig.getFrontPage().setTitle(this.loadAttributeValue("frontPage.title", "Front Page Title", config));
scaleConfig.getFrontPage().setText(this.loadAttributeValue("frontPage.text", "Front Page Text", config));
scaleConfig.setCanEditUser(this.loadAttributeValue("canEditUser", "User Fields Editable", config).equalsIgnoreCase("true"));
scaleConfig.setWorkflowName(this.loadAttributeValue("workflowName", "Save User Workflow", config));
scaleConfig.setUidAttributeName(this.loadAttributeValue("uidAttributeName", "User ID Attribute Name", config));
scaleConfig.setShowPortalOrgs(this.loadAttributeValue("showPortalOrgs", "Show Portal Orgs", config).equalsIgnoreCase("true"));
scaleConfig.setLogoutURL(this.loadAttributeValue("logoutURL", "Logout URL", config));
scaleConfig.setWarnMinutesLeft(Integer.parseInt(this.loadAttributeValue("warnMinutesLeft", "Warn when number of minutes left in the user's session", config)));
String val = this.loadOptionalAttributeValue("canDelegate", "canDelegate", config);
if (val == null) {
val = "NO";
}
scaleConfig.setCanDelegate(PreCheckAllowed.valueOf(val.toUpperCase()));
val = this.loadOptionalAttributeValue("canPreApprove", "canPreApprove", config);
if (val == null) {
val = "NO";
}
scaleConfig.setCanPreApprove(PreCheckAllowed.valueOf(val.toUpperCase()));
val = this.loadOptionalAttributeValue("enableApprovals", "enableApprovals", config);
if (val == null) {
scaleConfig.setEnableApprovals(true);
} else {
scaleConfig.setEnableApprovals(val.equalsIgnoreCase("true"));
}
val = this.loadOptionalAttributeValue("roleAttribute", "Role Attribute Name", config);
this.appType = new ApplicationType();
this.appType.setAzTimeoutMillis((long) 3000);
if (val != null) {
scaleConfig.setRoleAttribute(val);
}
Attribute attr = config.getAttribute("attributeNames");
if (attr == null) {
throw new Exception("Attribute names not found");
}
for (String attributeName : attr.getValues()) {
ScaleAttribute scaleAttr = new ScaleAttribute();
scaleAttr.setName(attributeName);
scaleAttr.setDisplayName(this.loadAttributeValue(attributeName + ".displayName", attributeName + " Display Name", config));
scaleAttr.setReadOnly(this.loadAttributeValue(attributeName + ".readOnly", attributeName + " Read Only", config).equalsIgnoreCase("true"));
val = this.loadOptionalAttributeValue(attributeName + ".required", attributeName + " Required", config);
scaleAttr.setRequired(val != null && val.equalsIgnoreCase("true"));
val = this.loadOptionalAttributeValue(attributeName + ".regEx", attributeName + " Reg Ex", config);
if (val != null) {
scaleAttr.setRegEx(val);
}
val = this.loadOptionalAttributeValue(attributeName + ".regExFailedMsg", attributeName + " Reg Ex Failed Message", config);
if (val != null) {
scaleAttr.setRegExFailedMsg(val);
}
val = this.loadOptionalAttributeValue(attributeName + ".minChars", attributeName + " Minimum Characters", config);
if (val != null) {
scaleAttr.setMinChars(Integer.parseInt(val));
}
val = this.loadOptionalAttributeValue(attributeName + ".mxnChars", attributeName + " Maximum Characters", config);
if (val != null) {
scaleAttr.setMaxChars(Integer.parseInt(val));
}
val = this.loadOptionalAttributeValue(attributeName + ".type", attributeName + " Attribute Type", config);
if (val != null) {
scaleAttr.setType(val);
}
Attribute attrVals = config.getAttribute(attributeName + ".values");
if (attrVals != null) {
for (String attrVal : attrVals.getValues()) {
String valLabel = attrVal.substring(0, attrVal.indexOf('='));
String valValue = attrVal.substring(attrVal.indexOf('=') + 1);
scaleAttr.getValues().add(new NVP(valLabel, valValue));
}
}
scaleConfig.getAttributes().put(attributeName, scaleAttr);
scaleConfig.getUserAttributeList().add(attributeName);
}
if (scaleConfig.isEnableApprovals()) {
attr = config.getAttribute("approvalAttributeNames");
if (attr == null) {
throw new Exception("Approval attribute names not found");
}
for (String attributeName : attr.getValues()) {
ScaleAttribute scaleAttr = new ScaleAttribute();
scaleAttr.setName(attributeName);
scaleAttr.setDisplayName(this.loadAttributeValue("approvals." + attributeName, "Approvals attribute " + attributeName + " Display Name", config));
scaleConfig.getApprovalAttributes().put(attributeName, scaleAttr);
}
val = this.loadOptionalAttributeValue("uiHelperClassName", "UI Helper Class Name", config);
if (val != null && !val.isEmpty()) {
UiDecisions dec = (UiDecisions) Class.forName(val).newInstance();
attr = config.getAttribute("uihelper.params");
HashMap<String, Attribute> decCfg = new HashMap<String, Attribute>();
if (attr != null) {
for (String v : attr.getValues()) {
String name = v.substring(0, v.indexOf('='));
String value = v.substring(v.indexOf('=') + 1);
Attribute param = decCfg.get(name);
if (param == null) {
param = new Attribute(name);
decCfg.put(name, param);
}
param.getValues().add(value);
}
}
dec.init(decCfg);
scaleConfig.setUiDecisions(dec);
}
val = this.loadOptionalAttributeValue("reasonIsList", "reasonIsList", config);
if (val == null) {
val = "false";
}
scaleConfig.setReasonIsList(val.equalsIgnoreCase("true"));
if (scaleConfig.isReasonIsList()) {
Attribute reasons = config.getAttribute("reasons");
if (reasons != null) {
scaleConfig.getReasons().addAll(reasons.getValues());
}
}
}
}
use of com.tremolosecurity.util.NVP in project OpenUnison by TremoloSecurity.
the class ProxyRequest method getParameterNames.
@Override
public Enumeration getParameterNames() {
HashSet<String> paramListLocal = new HashSet<String>();
paramListLocal.addAll(this.paramList);
for (NVP p : this.queryString) {
if (!paramListLocal.contains(p.getName())) {
paramListLocal.add(p.getName());
}
}
return new IteratorEnumeration(paramListLocal.iterator());
}
use of com.tremolosecurity.util.NVP in project OpenUnison by TremoloSecurity.
the class ProxyResponse method pushHeadersAndCookies.
public void pushHeadersAndCookies(UrlHolder holder) {
if (headersAndCookiesPushed) {
return;
}
headersAndCookiesPushed = true;
StringBuilder cookieVal = new StringBuilder();
org.joda.time.format.DateTimeFormatter expiresFormat = DateTimeFormat.forPattern("EEE, dd-MMM-yyyy HH:mm:ss 'GMT'").withLocale(Locale.US);
if ((holder == null || holder.getApp() == null || holder.getApp().getCookieConfig() == null || holder.getApp().getCookieConfig() == null || holder.getApp().getCookieConfig().isCookiesEnabled() == null) || holder.getApp().getCookieConfig().isCookiesEnabled()) {
for (Cookie cookie : this.cookies) {
if (holder != null) {
addCookieToResponse(holder.getApp(), cookieVal, expiresFormat, cookie, this.resp);
}
// this.resp.addCookie(cookie);
}
}
int status = ((HttpServletResponse) this.getResponse()).getStatus();
String redirectLocation = null;
if ((status < 200 || status > 299) && status != 302 && status != 301) {
if (holder != null) {
redirectLocation = holder.getConfig().getErrorPages().get(status);
}
}
boolean isHtml = redirectLocation != null && req.getAttribute("com.tremolosecurity.unison.proxy.noRedirectOnError") == null;
List<NVP> localHeaders = new ArrayList<NVP>();
for (Attribute attr : this.headers.values()) {
String val = attr.getValues().get(0);
if (redirectLocation != null) {
if (attr.getName().toLowerCase().contains("content-type")) {
isHtml = val.toLowerCase().contains("html");
} else if (attr.getName().equalsIgnoreCase("Location")) {
continue;
}
}
localHeaders.add(new NVP(attr.getName(), val));
}
if (isHtml) {
resp.setStatus(302);
localHeaders.add(new NVP("Location", redirectLocation));
}
for (NVP nvp : localHeaders) {
this.resp.addHeader(nvp.getName(), nvp.getValue());
}
this.cookies.clear();
this.headers.clear();
}
use of com.tremolosecurity.util.NVP in project OpenUnison by TremoloSecurity.
the class ScaleRegister method doFilter.
@Override
public void doFilter(HttpFilterRequest request, HttpFilterResponse response, HttpFilterChain chain) throws Exception {
Gson gson = new Gson();
request.getServletRequest().setAttribute("com.tremolosecurity.unison.proxy.noRedirectOnError", "com.tremolosecurity.unison.proxy.noRedirectOnError");
if (request.getRequestURI().endsWith("/register/config")) {
response.setContentType("application/json");
ScaleJSUtils.addCacheHeaders(response);
ScaleJSRegisterConfig localCfg = gson.fromJson(gson.toJson(this.scaleConfig), ScaleJSRegisterConfig.class);
for (String attrName : scaleConfig.getAttributes().keySet()) {
ScaleAttribute fromMainCfg = scaleConfig.getAttributes().get(attrName);
if (fromMainCfg.getDynamicSource() != null) {
ScaleAttribute fromLocalCfg = localCfg.getAttributes().get(attrName);
fromLocalCfg.setValues(fromMainCfg.getDynamicSource().getSourceList(request));
}
}
response.getWriter().println(gson.toJson(localCfg).trim());
} else if (request.getRequestURI().endsWith("/register/values")) {
String attributeName = request.getParameter("name").getValues().get(0);
List<NVP> values = this.scaleConfig.getAttributes().get(attributeName).getDynamicSource().getSourceList(request);
response.setContentType("application/json");
ScaleJSUtils.addCacheHeaders(response);
response.getWriter().println(gson.toJson(values).trim());
} else if (request.getRequestURI().endsWith("/register/submit")) {
ScaleError errors = new ScaleError();
String json = new String((byte[]) request.getAttribute(ProxySys.MSG_BODY));
NewUserRequest newUser = gson.fromJson(json, NewUserRequest.class);
if (scaleConfig.isRequireReCaptcha()) {
if (newUser.getReCaptchaCode() == null || newUser.getReCaptchaCode().isEmpty()) {
errors.getErrors().add("Please verify you are not a robot");
} else {
BasicHttpClientConnectionManager bhcm = new BasicHttpClientConnectionManager(GlobalEntries.getGlobalEntries().getConfigManager().getHttpClientSocketRegistry());
RequestConfig rc = RequestConfig.custom().setCookieSpec(CookieSpecs.STANDARD).build();
CloseableHttpClient http = HttpClients.custom().setConnectionManager(bhcm).setDefaultRequestConfig(rc).build();
HttpPost httppost = new HttpPost("https://www.google.com/recaptcha/api/siteverify");
List<NameValuePair> formparams = new ArrayList<NameValuePair>();
formparams.add(new BasicNameValuePair("secret", scaleConfig.getRcSecretKey()));
formparams.add(new BasicNameValuePair("response", newUser.getReCaptchaCode()));
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams, "UTF-8");
httppost.setEntity(entity);
CloseableHttpResponse resp = http.execute(httppost);
ReCaptchaResponse res = gson.fromJson(EntityUtils.toString(resp.getEntity()), ReCaptchaResponse.class);
if (!res.isSuccess()) {
errors.getErrors().add("Human validation failed");
}
http.close();
bhcm.close();
}
}
if (scaleConfig.isRequireTermsAndConditions() && !newUser.isCheckedTermsAndConditions()) {
errors.getErrors().add("You must accept the terms and conditions to register");
}
if (this.scaleConfig.isRequireReason() && (newUser.getReason() == null || newUser.getReason().isEmpty())) {
errors.getErrors().add("Reason is required");
}
if (this.scaleConfig.isPreSetPassword()) {
if (newUser.getPassword() == null || newUser.getPassword().isEmpty()) {
errors.getErrors().add("Password is required");
} else if (!newUser.getPassword().equals(newUser.getPassword2())) {
errors.getErrors().add("Passwords must match");
}
}
for (String attributeName : this.scaleConfig.getAttributes().keySet()) {
String value = newUser.getAttributes().get(attributeName);
if (this.scaleConfig.getAttributes().get(attributeName) == null) {
errors.getErrors().add("Invalid attribute : '" + attributeName + "'");
}
if (this.scaleConfig.getAttributes().get(attributeName).isReadOnly()) {
errors.getErrors().add("Attribute is read only : '" + this.scaleConfig.getAttributes().get(attributeName).getDisplayName() + "'");
}
if (this.scaleConfig.getAttributes().get(attributeName).isRequired() && (value == null || value.length() == 0)) {
errors.getErrors().add("Attribute is required : '" + this.scaleConfig.getAttributes().get(attributeName).getDisplayName() + "'");
}
if (this.scaleConfig.getAttributes().get(attributeName).getMinChars() > 0 && this.scaleConfig.getAttributes().get(attributeName).getMinChars() > value.length()) {
errors.getErrors().add(this.scaleConfig.getAttributes().get(attributeName).getDisplayName() + " must have at least " + this.scaleConfig.getAttributes().get(attributeName).getMinChars() + " characters");
}
if (this.scaleConfig.getAttributes().get(attributeName).getMaxChars() > 0 && this.scaleConfig.getAttributes().get(attributeName).getMaxChars() < value.length()) {
errors.getErrors().add(this.scaleConfig.getAttributes().get(attributeName).getDisplayName() + " must have at most " + this.scaleConfig.getAttributes().get(attributeName).getMaxChars() + " characters");
}
if (this.scaleConfig.getAttributes().get(attributeName).getType().equalsIgnoreCase("list")) {
if (this.scaleConfig.getAttributes().get(attributeName).getDynamicSource() == null) {
boolean found = false;
for (NVP nvp : this.scaleConfig.getAttributes().get(attributeName).getValues()) {
if (nvp.getValue().equalsIgnoreCase(value)) {
found = true;
}
}
if (!found) {
errors.getErrors().add(this.scaleConfig.getAttributes().get(attributeName).getDisplayName() + " has an invalid value");
}
}
}
if (this.scaleConfig.getAttributes().get(attributeName).getPattern() != null) {
boolean ok = true;
try {
Matcher m = this.scaleConfig.getAttributes().get(attributeName).getPattern().matcher(value);
if (m == null || !m.matches()) {
ok = false;
}
} catch (Exception e) {
ok = false;
}
if (!ok) {
errors.getErrors().add("Attribute value not valid : '" + this.scaleConfig.getAttributes().get(attributeName).getDisplayName() + "' - " + this.scaleConfig.getAttributes().get(attributeName).getRegExFailedMsg());
}
}
if (this.scaleConfig.getAttributes().get(attributeName).isUnique()) {
String filter = equal(attributeName, value).toString();
LDAPSearchResults res = GlobalEntries.getGlobalEntries().getConfigManager().getMyVD().search(GlobalEntries.getGlobalEntries().getConfigManager().getCfg().getLdapRoot(), 2, filter, new ArrayList<String>());
if (res.hasMore()) {
errors.getErrors().add(this.scaleConfig.getAttributes().get(attributeName).getDisplayName() + " is not available");
}
while (res.hasMore()) res.next();
}
if (this.scaleConfig.getAttributes().get(attributeName).getDynamicSource() != null) {
String error = this.scaleConfig.getAttributes().get(attributeName).getDynamicSource().validate(value, request);
if (error != null) {
errors.getErrors().add(this.scaleConfig.getAttributes().get(attributeName).getDisplayName() + " - " + error);
}
}
}
WFCall wfcall = null;
String wfName = this.scaleConfig.getWorkflowName();
if (errors.getErrors().isEmpty()) {
if (scaleConfig.isUseCustomSubmission()) {
AuthInfo userData = ((AuthController) request.getSession().getAttribute(ProxyConstants.AUTH_CTL)).getAuthInfo();
wfName = cru.createTremoloUser(newUser, errors.getErrors(), userData);
}
}
if (errors.getErrors().isEmpty()) {
TremoloUser user = new TremoloUser();
AuthInfo userData = ((AuthController) request.getSession().getAttribute(ProxyConstants.AUTH_CTL)).getAuthInfo();
if (this.scaleConfig.isSubmitLoggedInUser()) {
user.setUid(userData.getAttribs().get(this.scaleConfig.getUidAttributeName()).getValues().get(0));
user.getAttributes().add(new Attribute(this.scaleConfig.getUidAttributeName(), userData.getAttribs().get(this.scaleConfig.getUidAttributeName()).getValues().get(0)));
} else {
user.setUid(newUser.getAttributes().get(this.scaleConfig.getUidAttributeName()));
}
for (String attrName : newUser.getAttributes().keySet()) {
user.getAttributes().add(new Attribute(attrName, newUser.getAttributes().get(attrName)));
}
if (this.scaleConfig.isPreSetPassword()) {
user.setUserPassword(newUser.getPassword());
}
wfcall = new WFCall();
wfcall.setUidAttributeName(this.scaleConfig.getUidAttributeName());
wfcall.setReason(newUser.getReason());
wfcall.setName(wfName);
wfcall.setUser(user);
HashMap<String, Object> params = new HashMap<String, Object>();
wfcall.setRequestParams(params);
if (userData.getAuthLevel() != 0 && !this.scaleConfig.isSubmitLoggedInUser()) {
wfcall.setRequestor(userData.getAttribs().get(GlobalEntries.getGlobalEntries().getConfigManager().getCfg().getProvisioning().getApprovalDB().getUserIdAttribute()).getValues().get(0));
wfcall.getRequestParams().put(Approval.SEND_NOTIFICATION, "false");
wfcall.getRequestParams().put(Approval.REASON, newUser.getReason());
wfcall.getRequestParams().put(Approval.IMMEDIATE_ACTION, "true");
}
if (scaleConfig.isUseCustomSubmission()) {
cru.setWorkflowParameters(params, newUser, userData);
}
ExecuteWorkflow exec = new ExecuteWorkflow();
try {
exec.execute(wfcall, GlobalEntries.getGlobalEntries().getConfigManager());
} catch (Exception e) {
throw new ProvisioningException("Could not complete registration", e);
}
SubmitResponse res = new SubmitResponse();
res.setAddNewUsers(userData.getAuthLevel() != 0);
ScaleJSUtils.addCacheHeaders(response);
response.getWriter().print(gson.toJson(res));
response.getWriter().flush();
} else {
response.setStatus(500);
ScaleJSUtils.addCacheHeaders(response);
response.getWriter().print(gson.toJson(errors).trim());
response.getWriter().flush();
}
} else {
response.setStatus(500);
ScaleJSUtils.addCacheHeaders(response);
ScaleError error = new ScaleError();
error.getErrors().add("Operation not supported");
response.getWriter().print(gson.toJson(error).trim());
response.getWriter().flush();
}
}
Aggregations