/*
* Password Management Servlets (PWM)
* http://www.pwm-project.org
*
* Copyright (c) 2006-2009 Novell, Inc.
* Copyright (c) 2009-2017 The PWM Project
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package password.pwm.config.value;
import com.google.gson.reflect.TypeToken;
import org.jdom2.Element;
import password.pwm.bean.EmailItemBean;
import password.pwm.config.PwmSetting;
import password.pwm.config.StoredValue;
import password.pwm.error.PwmOperationalException;
import password.pwm.util.java.JsonUtil;
import password.pwm.util.LocaleHelper;
import password.pwm.util.secure.PwmSecurityKey;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
public class EmailValue extends AbstractValue implements StoredValue {
final Map<String,EmailItemBean> values; //key is locale identifier
EmailValue(final Map<String,EmailItemBean> values) {
this.values = values;
}
public static StoredValueFactory factory()
{
return new StoredValueFactory() {
public EmailValue fromJson(final String input)
{
if (input == null) {
return new EmailValue(Collections.<String, EmailItemBean>emptyMap());
} else {
Map<String, EmailItemBean> srcList = JsonUtil.deserialize(input,
new TypeToken<Map<String, EmailItemBean>>() {}
);
srcList = srcList == null ? Collections.<String, EmailItemBean>emptyMap() : srcList;
srcList.remove(null);
return new EmailValue(Collections.unmodifiableMap(srcList));
}
}
public EmailValue fromXmlElement(
final Element settingElement,
final PwmSecurityKey input
)
throws PwmOperationalException
{
final Map<String, EmailItemBean> values = new TreeMap<>();
{
final List valueElements = settingElement.getChildren("value");
for (final Object loopValue : valueElements) {
final Element loopValueElement = (Element) loopValue;
final String value = loopValueElement.getText();
if (value != null && value.length() > 0) {
final String localeValue = loopValueElement.getAttribute(
"locale") == null ? "" : loopValueElement.getAttribute("locale").getValue();
values.put(localeValue, JsonUtil.deserialize(value, EmailItemBean.class));
}
}
}
// read old format values. can be removed someday.... this code iterates through the entire settings xml document to find old format versions
{
final Map<String, String> fromMap = new HashMap<>();
final Map<String, String> subjectMap = new HashMap<>();
final Map<String, String> bodyPlainMap = new HashMap<>();
final Map<String, String> bodyHtmlMap = new HashMap<>();
for (final Object loopSettingObj : settingElement.getParentElement().getChildren()) {
final Element loopSetting = (Element) loopSettingObj;
if (loopSetting.getAttribute("key") != null) {
if (loopSetting.getAttribute("key").getValue().equals(
settingElement.getAttribute("key").getValue() + ".from")) {
final List valueElements = loopSetting.getChildren("value");
for (final Object loopValue : valueElements) {
final Element loopValueElement = (Element) loopValue;
final String value = loopValueElement.getText();
if (value != null && value.length() > 0) {
final String localeValue = settingElement.getAttribute(
"locale") == null ? "" : settingElement.getAttribute(
"locale").getValue();
fromMap.put(localeValue, value);
}
}
}
if (loopSetting.getAttribute("key").getValue().equals(
settingElement.getAttribute("key").getValue() + ".subject")) {
final List valueElements = loopSetting.getChildren("value");
for (final Object loopValue : valueElements) {
final Element loopValueElement = (Element) loopValue;
final String value = loopValueElement.getText();
if (value != null && value.length() > 0) {
final String localeValue = settingElement.getAttribute(
"locale") == null ? "" : settingElement.getAttribute(
"locale").getValue();
subjectMap.put(localeValue, value);
}
}
}
if (loopSetting.getAttribute("key").getValue().equals(
settingElement.getAttribute("key").getValue() + ".plainBody")) {
final List valueElements = loopSetting.getChildren("value");
for (final Object loopValue : valueElements) {
final Element loopValueElement = (Element) loopValue;
final String value = loopValueElement.getText();
if (value != null && value.length() > 0) {
final String localeValue = settingElement.getAttribute(
"locale") == null ? "" : settingElement.getAttribute(
"locale").getValue();
bodyPlainMap.put(localeValue, value);
}
}
}
if (loopSetting.getAttribute("key").getValue().equals(
settingElement.getAttribute("key").getValue() + ".htmlBody")) {
final List valueElements = loopSetting.getChildren("value");
for (final Object loopValue : valueElements) {
final Element loopValueElement = (Element) loopValue;
final String value = loopValueElement.getText();
if (value != null && value.length() > 0) {
final String localeValue = settingElement.getAttribute(
"locale") == null ? "" : settingElement.getAttribute(
"locale").getValue();
bodyHtmlMap.put(localeValue, value);
}
}
}
}
}
final Set<String> seenLocales = new HashSet<>();
seenLocales.addAll(fromMap.keySet());
seenLocales.addAll(subjectMap.keySet());
seenLocales.addAll(bodyPlainMap.keySet());
seenLocales.addAll(bodyHtmlMap.keySet());
//final String defaultJson = PwmSetting.forKey(settingElement.getAttribute("key").getValue()).getDefaultValue(PwmSetting.Template.NOVL);
//final Map<String,EmailItemBean> defaultList = gson.fromJson(defaultJson, new TypeToken<Map<String,EmailItemBean>>() {}.getType());
//final EmailItemBean defaultBean = defaultList.read("");
/*
for (final String localeStr : seenLocales) {
values.put(localeStr,new EmailItemBean(
null,
fromMap.containsKey(localeStr) ? fromMap.read(localeStr) : defaultBean.getFrom(),
subjectMap.containsKey(localeStr) ? subjectMap.read(localeStr) : defaultBean.getSubject(),
bodyPlainMap.containsKey(localeStr)? bodyPlainMap.read(localeStr) : defaultBean.getBodyPlain(),
bodyHtmlMap.containsKey(localeStr) ? bodyHtmlMap.read(localeStr) : defaultBean.getBodyHtml()
));
}
*/
}
return new EmailValue(values);
}
};
}
public List<Element> toXmlValues(final String valueElementName) {
final List<Element> returnList = new ArrayList<>();
for (final String localeValue : values.keySet()) {
final EmailItemBean emailItemBean = values.get(localeValue);
final Element valueElement = new Element(valueElementName);
if (localeValue.length() > 0) {
valueElement.setAttribute("locale",localeValue);
}
valueElement.addContent(JsonUtil.serialize(emailItemBean));
returnList.add(valueElement);
}
return returnList;
}
public Map<String,EmailItemBean> toNativeObject() {
return Collections.unmodifiableMap(values);
}
public List<String> validateValue(final PwmSetting pwmSetting) {
if (pwmSetting.isRequired()) {
if (values == null || values.isEmpty() || values.values().iterator().next() == null) {
return Collections.singletonList("required value missing");
}
}
for (final String loopLocale : values.keySet()) {
final EmailItemBean emailItemBean = values.get(loopLocale);
if (emailItemBean.getSubject() == null || emailItemBean.getSubject().length() < 1) {
return Collections.singletonList("subject field is required " + (loopLocale.length() > 0 ? " for locale " + loopLocale:""));
}
if (emailItemBean.getFrom() == null || emailItemBean.getFrom().length() < 1) {
return Collections.singletonList("from field is required" + (loopLocale.length() > 0 ? " for locale " + loopLocale:""));
}
if (emailItemBean.getBodyPlain() == null || emailItemBean.getBodyPlain().length() < 1) {
return Collections.singletonList("plain body field is required" + (loopLocale.length() > 0 ? " for locale " + loopLocale:""));
}
}
return Collections.emptyList();
}
public String toDebugString(final Locale locale) {
if (values == null) {
return "No Email Item";
}
final StringBuilder sb = new StringBuilder();
for (final String localeKey : values.keySet()) {
final EmailItemBean emailItemBean = values.get(localeKey);
sb.append("EmailItem ").append(LocaleHelper.debugLabel(LocaleHelper.parseLocaleString(localeKey))).append(": \n");
sb.append(" To:").append(emailItemBean.getTo()).append("\n");
sb.append("From:").append(emailItemBean.getFrom()).append("\n");
sb.append("Subj:").append(emailItemBean.getSubject()).append("\n");
sb.append("Body:").append(emailItemBean.getBodyPlain()).append("\n");
sb.append("Html:").append(emailItemBean.getBodyHtml()).append("\n");
}
return sb.toString();
}
}