You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by ma...@apache.org on 2015/12/21 17:12:10 UTC
syncope git commit: Security questions page: SYNCOPE-156
Repository: syncope
Updated Branches:
refs/heads/master 14e06e0f1 -> 50ecf0d80
Security questions page: SYNCOPE-156
Project: http://git-wip-us.apache.org/repos/asf/syncope/repo
Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/50ecf0d8
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/50ecf0d8
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/50ecf0d8
Branch: refs/heads/master
Commit: 50ecf0d80163d6d828417bb71f3b52a910dfc716
Parents: 14e06e0
Author: Massimiliano Perrone <ma...@tirasa.net>
Authored: Mon Dec 21 17:11:42 2015 +0100
Committer: Massimiliano Perrone <ma...@tirasa.net>
Committed: Mon Dec 21 17:11:47 2015 +0100
----------------------------------------------------------------------
.../client/console/commons/Constants.java | 6 +-
.../syncope/client/console/pages/BasePage.java | 25 ++-
.../syncope/client/console/pages/Logs.java | 42 +---
.../client/console/pages/SecurityQuestions.java | 78 ++++++-
.../client/console/panels/ConsoleLogPanel.java | 3 +-
.../client/console/panels/CoreLogPanel.java | 3 +-
.../panels/SecurityQuestionDetailsPanel.java | 65 ++++++
.../panels/SecurityQuestionModalPanel.java | 67 ++++++
.../console/panels/SecurityQuestionsPanel.java | 223 +++++++++++++++++++
.../markup/html/bootstrap/dialog/BaseModal.java | 2 +-
.../client/console/pages/Logs.properties | 1 +
.../client/console/pages/Logs_it.properties | 1 +
.../client/console/pages/Logs_pt_BR.properties | 1 +
.../client/console/pages/SecurityQuestions.html | 38 ++--
.../console/pages/SecurityQuestions.properties | 19 ++
.../pages/SecurityQuestions_it.properties | 19 ++
.../pages/SecurityQuestions_pt_BR.properties | 19 ++
.../panels/SecurityQuestionDetailsPanel.html | 34 +++
.../SecurityQuestionDetailsPanel.properties | 18 ++
.../SecurityQuestionDetailsPanel_it.properties | 18 ++
...ecurityQuestionDetailsPanel_pt_BR.properties | 18 ++
.../panels/SecurityQuestionModalPanel.html | 24 ++
22 files changed, 653 insertions(+), 71 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/syncope/blob/50ecf0d8/client/console/src/main/java/org/apache/syncope/client/console/commons/Constants.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/commons/Constants.java b/client/console/src/main/java/org/apache/syncope/client/console/commons/Constants.java
index e5edbf3..8f78562 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/commons/Constants.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/commons/Constants.java
@@ -58,8 +58,10 @@ public final class Constants {
public static final String PREF_ANYTYPE_PAGINATOR_ROWS = "anytype.paginator.rows";
- public static final String PREF_RELATIONSHIPTYPE_PAGINATOR_ROWS = "relationshiptype.painator.rows" ;
-
+ public static final String PREF_SECURITY_QUESTIONS_PAGINATOR_ROWS = "secutiry.questions.paginator.rows";
+
+ public static final String PREF_RELATIONSHIPTYPE_PAGINATOR_ROWS = "relationshiptype.painator.rows";
+
public static final String PREF_GROUP_DETAILS_VIEW = "group.details.view";
public static final String PREF_GROUP_ATTRIBUTES_VIEW = "group.attributes.view";
http://git-wip-us.apache.org/repos/asf/syncope/blob/50ecf0d8/client/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java
index 3d03ab2..9b50853 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java
@@ -96,18 +96,27 @@ public class BasePage extends AbstractBasePage implements IAjaxIndicatorAware {
WebMarkupContainer confULContainer = new WebMarkupContainer(getULContainerId("configuration"));
confLIContainer.add(confULContainer);
+ liContainer = new WebMarkupContainer(getLIContainerId("securityQuestions"));
+ confULContainer.add(liContainer);
+ final BookmarkablePageLink<Page> securityQuestionLink = new BookmarkablePageLink<>(
+ "securityQuestions", SecurityQuestions.class);
+ MetaDataRoleAuthorizationStrategy.authorize(
+ securityQuestionLink, WebPage.ENABLE, StandardEntitlement.SECURITY_QUESTION_CREATE);
+ liContainer.add(securityQuestionLink);
+
liContainer = new WebMarkupContainer(getLIContainerId("workflow"));
confULContainer.add(liContainer);
- BookmarkablePageLink<Page> link = new BookmarkablePageLink<>("workflow", Workflow.class);
- MetaDataRoleAuthorizationStrategy.authorize(link, WebPage.ENABLE, StandardEntitlement.WORKFLOW_DEF_READ);
- liContainer.add(link);
-
+ final BookmarkablePageLink<Page> workflowLink = new BookmarkablePageLink<>("workflow", Workflow.class);
+ MetaDataRoleAuthorizationStrategy.authorize(
+ workflowLink, WebPage.ENABLE, StandardEntitlement.WORKFLOW_DEF_READ);
+ liContainer.add(workflowLink);
+
liContainer = new WebMarkupContainer(getLIContainerId("logs"));
confULContainer.add(liContainer);
- BookmarkablePageLink<Page> logsLink = new BookmarkablePageLink<>("logs", Logs.class);
+ final BookmarkablePageLink<Page> logsLink = new BookmarkablePageLink<>("logs", Logs.class);
MetaDataRoleAuthorizationStrategy.authorize(logsLink, WebPage.ENABLE, StandardEntitlement.LOG_LIST);
liContainer.add(logsLink);
-
+
liContainer = new WebMarkupContainer(getLIContainerId("types"));
confULContainer.add(liContainer);
BookmarkablePageLink<Page> typesLink = new BookmarkablePageLink<>("types", Types.class);
@@ -118,10 +127,6 @@ public class BasePage extends AbstractBasePage implements IAjaxIndicatorAware {
confULContainer.add(liContainer);
liContainer.add(new BookmarkablePageLink<>("policies", Policies.class));
- liContainer = new WebMarkupContainer(getLIContainerId("securityQuestions"));
- confULContainer.add(liContainer);
- liContainer.add(new BookmarkablePageLink<>("securityQuestions", SecurityQuestions.class));
-
liContainer = new WebMarkupContainer(getLIContainerId("layouts"));
confULContainer.add(liContainer);
liContainer.add(new BookmarkablePageLink<>("layouts", Layouts.class));
http://git-wip-us.apache.org/repos/asf/syncope/blob/50ecf0d8/client/console/src/main/java/org/apache/syncope/client/console/pages/Logs.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/Logs.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/Logs.java
index c88044a..c3d61fd 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/Logs.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/Logs.java
@@ -21,13 +21,8 @@ package org.apache.syncope.client.console.pages;
import de.agilecoders.wicket.core.markup.html.bootstrap.tabs.AjaxBootstrapTabbedPanel;
import java.util.ArrayList;
import java.util.List;
-import org.apache.syncope.client.console.commons.Constants;
import org.apache.syncope.client.console.panels.ConsoleLogPanel;
import org.apache.syncope.client.console.panels.CoreLogPanel;
-import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
-import org.apache.syncope.common.lib.to.LoggerTO;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
import org.apache.wicket.extensions.markup.html.tabs.AbstractTab;
import org.apache.wicket.extensions.markup.html.tabs.ITab;
import org.apache.wicket.markup.html.WebMarkupContainer;
@@ -40,29 +35,18 @@ public class Logs extends BasePage {
private static final long serialVersionUID = -1100228004207271271L;
- private final BaseModal<LoggerTO> coreLogModal;
-
- private final BaseModal<LoggerTO> consoleLogModal;
-
private final AjaxBootstrapTabbedPanel<ITab> tabbedPanel;
public Logs(final PageParameters parameters) {
super(parameters);
- coreLogModal = new BaseModal<>("coreLogModal");
- consoleLogModal = new BaseModal<>("consoleLogModal");
-
final WebMarkupContainer content = new WebMarkupContainer("content");
- content.add(new Label("header", "Logs"));
+ content.add(new Label("header", getString("header_title")));
content.setOutputMarkupId(true);
tabbedPanel = new AjaxBootstrapTabbedPanel<>("tabbedPanel", buildTabList());
content.add(tabbedPanel);
add(content);
- addWindowWindowClosedCallback(coreLogModal);
- addWindowWindowClosedCallback(consoleLogModal);
- add(coreLogModal);
- add(consoleLogModal);
}
private List<ITab> buildTabList() {
@@ -75,7 +59,7 @@ public class Logs extends BasePage {
@Override
public Panel getPanel(final String panelId) {
- return new CoreLogPanel(panelId, getPageReference(), coreLogModal);
+ return new CoreLogPanel(panelId, getPageReference());
}
});
@@ -85,30 +69,10 @@ public class Logs extends BasePage {
@Override
public Panel getPanel(final String panelId) {
- return new ConsoleLogPanel(panelId, getPageReference(), consoleLogModal);
+ return new ConsoleLogPanel(panelId, getPageReference());
}
});
return tabs;
}
-
- private void addWindowWindowClosedCallback(final BaseModal<?> modal) {
- modal.setWindowClosedCallback(new ModalWindow.WindowClosedCallback() {
-
- private static final long serialVersionUID = 8804221891699487139L;
-
- @Override
- public void onClose(final AjaxRequestTarget target) {
- tabbedPanel.setSelectedTab(tabbedPanel.getSelectedTab());
- target.add(tabbedPanel);
- modal.show(false);
-
- if (((AbstractBasePage) Logs.this.getPage()).isModalResult()) {
- info(getString(Constants.OPERATION_SUCCEEDED));
- feedbackPanel.refresh(target);
- ((AbstractBasePage) Logs.this.getPage()).setModalResult(false);
- }
- }
- });
- }
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/50ecf0d8/client/console/src/main/java/org/apache/syncope/client/console/pages/SecurityQuestions.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/SecurityQuestions.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/SecurityQuestions.java
index 0d21824..d58e369 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/SecurityQuestions.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/SecurityQuestions.java
@@ -18,13 +18,89 @@
*/
package org.apache.syncope.client.console.pages;
+import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
+import org.apache.syncope.client.console.SyncopeConsoleSession;
+import org.apache.syncope.client.console.commons.Constants;
+import org.apache.syncope.client.console.panels.SecurityQuestionModalPanel;
+import org.apache.syncope.client.console.panels.SecurityQuestionsPanel;
+import org.apache.syncope.client.console.wicket.ajax.markup.html.ClearIndicatingAjaxLink;
+import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
+import org.apache.syncope.common.lib.to.SecurityQuestionTO;
+import org.apache.syncope.common.lib.types.StandardEntitlement;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.markup.html.AjaxLink;
+import org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDataRoleAuthorizationStrategy;
+import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;
public class SecurityQuestions extends BasePage {
- private static final long serialVersionUID = -1100228004207271271L;
+ private static final long serialVersionUID = 931085006718655535L;
+
+ private final SecurityQuestionsPanel securityQuestionsPanel;
public SecurityQuestions(final PageParameters parameters) {
super(parameters);
+
+ final WebMarkupContainer content = new WebMarkupContainer("content");
+ content.add(new Label("header", getString("header_title")));
+ content.setOutputMarkupId(true);
+ add(content);
+
+ final BaseModal<SecurityQuestionTO> securityQuestionModal = new BaseModal<>("securityQuestionModal");
+ securityQuestionModal.setFormModel(new SecurityQuestionTO());
+ securityQuestionModal.size(Modal.Size.Large);
+ addWindowWindowClosedCallback(securityQuestionModal);
+ add(securityQuestionModal);
+
+ final AjaxLink<Void> createLink = new ClearIndicatingAjaxLink<Void>(
+ "createSecurityQuestion", getPageReference()) {
+
+ private static final long serialVersionUID = -7978723352517770644L;
+
+ @Override
+ protected void onClickInternal(final AjaxRequestTarget target) {
+ securityQuestionModal.header(new ResourceModel("createSecurityQuestion"));
+ target.add(securityQuestionModal.setContent(
+ new SecurityQuestionModalPanel(securityQuestionModal, getPageReference(), true)));
+ securityQuestionModal.addSumbitButton();
+ securityQuestionModal.show(true);
+ }
+ };
+ content.add(createLink);
+
+ if (SyncopeConsoleSession.get()
+ .owns(StandardEntitlement.SECURITY_QUESTION_CREATE)) {
+ MetaDataRoleAuthorizationStrategy.authorize(
+ createLink, ENABLE, StandardEntitlement.SECURITY_QUESTION_CREATE);
+ }
+
+ securityQuestionsPanel = new SecurityQuestionsPanel(
+ "securityQuestionPanel", getPageReference(), securityQuestionModal);
+ securityQuestionsPanel.setOutputMarkupId(true);
+
+ content.add(securityQuestionsPanel);
+ }
+
+ private void addWindowWindowClosedCallback(final BaseModal<?> modal) {
+ modal.setWindowClosedCallback(new ModalWindow.WindowClosedCallback() {
+
+ private static final long serialVersionUID = 8804221891699487139L;
+
+ @Override
+ public void onClose(final AjaxRequestTarget target) {
+ target.add(securityQuestionsPanel);
+ modal.show(false);
+
+ if (((AbstractBasePage) SecurityQuestions.this.getPage()).isModalResult()) {
+ info(getString(Constants.OPERATION_SUCCEEDED));
+ feedbackPanel.refresh(target);
+ ((AbstractBasePage) SecurityQuestions.this.getPage()).setModalResult(false);
+ }
+ }
+ });
}
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/50ecf0d8/client/console/src/main/java/org/apache/syncope/client/console/panels/ConsoleLogPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ConsoleLogPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ConsoleLogPanel.java
index 09b56d1..a024a03 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ConsoleLogPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ConsoleLogPanel.java
@@ -24,7 +24,6 @@ import java.util.List;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.config.LoggerConfig;
-import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
import org.apache.syncope.common.lib.SyncopeConstants;
import org.apache.syncope.common.lib.to.LoggerTO;
import org.apache.syncope.common.lib.types.LoggerLevel;
@@ -36,7 +35,7 @@ public class ConsoleLogPanel extends AbstractLogsPanel<LoggerTO> {
private static final ConsoleLoggerController CONSOLE_LOGGER_CONTROLLER = new ConsoleLoggerController();
- public ConsoleLogPanel(final String id, final PageReference pageReference, final BaseModal<LoggerTO> modal) {
+ public ConsoleLogPanel(final String id, final PageReference pageReference) {
super(id, pageReference, CONSOLE_LOGGER_CONTROLLER.getLoggers());
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/50ecf0d8/client/console/src/main/java/org/apache/syncope/client/console/panels/CoreLogPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/CoreLogPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/CoreLogPanel.java
index 3732781..c620f10 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/CoreLogPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/CoreLogPanel.java
@@ -19,7 +19,6 @@
package org.apache.syncope.client.console.panels;
import org.apache.syncope.client.console.SyncopeConsoleSession;
-import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
import org.apache.syncope.common.lib.to.LoggerTO;
import org.apache.syncope.common.lib.types.LoggerType;
import org.apache.syncope.common.rest.api.service.LoggerService;
@@ -29,7 +28,7 @@ public class CoreLogPanel extends AbstractLogsPanel<LoggerTO> {
private static final long serialVersionUID = 3905038169553185171L;
- public CoreLogPanel(final String id, final PageReference pageReference, final BaseModal<LoggerTO> modal) {
+ public CoreLogPanel(final String id, final PageReference pageReference) {
super(id, pageReference, SyncopeConsoleSession.get().getService(LoggerService.class).list(LoggerType.LOG));
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/50ecf0d8/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionDetailsPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionDetailsPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionDetailsPanel.java
new file mode 100644
index 0000000..bef4212
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionDetailsPanel.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.apache.syncope.client.console.panels;
+
+import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
+import org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel;
+import org.apache.syncope.common.lib.to.SecurityQuestionTO;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.model.CompoundPropertyModel;
+import org.apache.wicket.model.PropertyModel;
+
+public class SecurityQuestionDetailsPanel extends Panel {
+
+ private static final long serialVersionUID = 6278708606604582875L;
+
+ public SecurityQuestionDetailsPanel(
+ final String id,
+ final BaseModal<SecurityQuestionTO> modal) {
+ super(id);
+
+ final WebMarkupContainer container = new WebMarkupContainer("container");
+
+ container.setOutputMarkupId(
+ true);
+ add(container);
+
+ final Form<SecurityQuestionTO> form = new Form<>("form");
+
+ final SecurityQuestionTO securityQuestionTO = modal.getFormModel();
+ form.setModel(new CompoundPropertyModel<>(securityQuestionTO));
+ container.add(form);
+
+ final AjaxTextFieldPanel key = new AjaxTextFieldPanel(
+ "key", getString("key"), new PropertyModel<String>(securityQuestionTO, "key"));
+ key.addRequiredLabel();
+ final String keyModelObject = String.valueOf(key.getModelObject());
+ key.setEnabled(keyModelObject == null || keyModelObject.isEmpty());
+ form.add(key);
+
+ final AjaxTextFieldPanel content = new AjaxTextFieldPanel(
+ "content", getString("content"), new PropertyModel<String>(securityQuestionTO, "content"));
+ content.addRequiredLabel();
+ content.setEnabled(true);
+ content.setVisible(true);
+ form.add(content);
+ }
+}
http://git-wip-us.apache.org/repos/asf/syncope/blob/50ecf0d8/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionModalPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionModalPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionModalPanel.java
new file mode 100644
index 0000000..c66207c
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionModalPanel.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.apache.syncope.client.console.panels;
+
+import org.apache.syncope.client.console.SyncopeConsoleSession;
+import org.apache.syncope.client.console.commons.Constants;
+import org.apache.syncope.client.console.pages.AbstractBasePage;
+import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
+import org.apache.syncope.common.lib.to.SecurityQuestionTO;
+import org.apache.syncope.common.rest.api.service.SecurityQuestionService;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.markup.html.form.Form;
+
+public class SecurityQuestionModalPanel extends AbstractModalPanel {
+
+ private static final long serialVersionUID = 4024126489500665435L;
+
+ private final boolean createFlag;
+
+ public SecurityQuestionModalPanel(
+ final BaseModal<SecurityQuestionTO> modal,
+ final PageReference pageRef,
+ final boolean createFlag) {
+ super(modal, pageRef);
+ this.createFlag = createFlag;
+ add(new SecurityQuestionDetailsPanel("securityQuestionDetailsPanel", modal));
+ }
+
+ @Override
+ public void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
+ try {
+ final SecurityQuestionTO securityQuestionTO = SecurityQuestionTO.class.cast(form.getModelObject());
+
+ if (createFlag) {
+ SyncopeConsoleSession.get().getService(SecurityQuestionService.class).create(securityQuestionTO);
+ } else {
+ SyncopeConsoleSession.get().getService(SecurityQuestionService.class).update(securityQuestionTO);
+ }
+
+ if (pageRef.getPage() instanceof AbstractBasePage) {
+ ((AbstractBasePage) pageRef.getPage()).setModalResult(true);
+ }
+ modal.close(target);
+ } catch (Exception e) {
+ LOG.error("While creating or updating SecutiryQuestionTO", e);
+ error(getString(Constants.ERROR) + ": " + e.getMessage());
+ modal.getFeedbackPanel().refresh(target);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/syncope/blob/50ecf0d8/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java
new file mode 100644
index 0000000..cc3ea1b
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java
@@ -0,0 +1,223 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.apache.syncope.client.console.panels;
+
+import java.io.Serializable;
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.syncope.client.console.SyncopeConsoleSession;
+import org.apache.syncope.client.console.commons.Constants;
+import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
+import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
+import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
+import org.apache.syncope.client.console.wicket.markup.html.form.ActionLinksPanel;
+import org.apache.syncope.common.lib.to.SecurityQuestionTO;
+import org.apache.syncope.common.lib.types.StandardEntitlement;
+import org.apache.syncope.common.rest.api.service.SecurityQuestionService;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
+import org.apache.wicket.extensions.markup.html.repeater.data.sort.SortOrder;
+import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn;
+import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
+import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
+import org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvider;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.repeater.Item;
+import org.apache.wicket.model.CompoundPropertyModel;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.model.ResourceModel;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class SecurityQuestionsPanel extends AbstractTypesPanel<SecurityQuestionTO> {
+
+ private static final long serialVersionUID = 3323019773236588850L;
+
+ private static final Logger LOG = LoggerFactory.getLogger(SecurityQuestionsPanel.class);
+
+ private static final String PAGINATOR_ROWS_KEYS = Constants.PREF_SECURITY_QUESTIONS_PAGINATOR_ROWS;
+
+ private final BaseModal<SecurityQuestionTO> modal;
+
+ public SecurityQuestionsPanel(
+ final String id, final PageReference pageReference, final BaseModal<SecurityQuestionTO> modal) {
+ super(id, pageReference);
+ this.pageRows = prefMan.getPaginatorRows(getRequest(), PAGINATOR_ROWS_KEYS);
+ this.modal = modal;
+
+ final WebMarkupContainer container = new WebMarkupContainer("container");
+ container.setOutputMarkupId(true);
+ add(container);
+
+ buildDataTable(container,
+ getColumns(container, pageReference),
+ new SecurityQuestionsPanel.SecurityQuestionsProvider(),
+ PAGINATOR_ROWS_KEYS);
+
+ }
+
+ private List<IColumn<SecurityQuestionTO, String>> getColumns(
+ final WebMarkupContainer webContainer, final PageReference pageReference) {
+
+ final List<IColumn<SecurityQuestionTO, String>> columns = new ArrayList<>();
+
+ for (Field field : SecurityQuestionTO.class.getDeclaredFields()) {
+
+ if (field != null && !Modifier.isStatic(field.getModifiers())) {
+ final String fieldName = field.getName();
+ if (field.getType().isArray()) {
+ final IColumn<SecurityQuestionTO, String> column = new PropertyColumn<SecurityQuestionTO, String>(
+ new ResourceModel(field.getName()), field.getName()) {
+
+ private static final long serialVersionUID = 3282547854226892169L;
+
+ @Override
+ public String getCssClass() {
+ String css = super.getCssClass();
+ if ("key".equals(fieldName)) {
+ css = StringUtils.isBlank(css)
+ ? "medium_fixedsize"
+ : css + " medium_fixedsize";
+ }
+ return css;
+ }
+ };
+ columns.add(column);
+
+ } else {
+ final IColumn<SecurityQuestionTO, String> column = new PropertyColumn<SecurityQuestionTO, String>(
+ new ResourceModel(field.getName()), field.getName(), field.getName()) {
+
+ private static final long serialVersionUID = 3282547854226892169L;
+
+ @Override
+ public String getCssClass() {
+ String css = super.getCssClass();
+ if ("key".equals(fieldName)) {
+ css = StringUtils.isBlank(css)
+ ? "medium_fixedsize"
+ : css + " medium_fixedsize";
+ }
+ return css;
+ }
+ };
+ columns.add(column);
+ }
+ }
+ }
+
+ columns.add(new AbstractColumn<SecurityQuestionTO, String>(new ResourceModel("actions", "")) {
+
+ private static final long serialVersionUID = 2054811145491901166L;
+
+ @Override
+ public String getCssClass() {
+ return "action";
+ }
+
+ @Override
+ public void populateItem(final Item<ICellPopulator<SecurityQuestionTO>> item, final String componentId,
+ final IModel<SecurityQuestionTO> model) {
+
+ final SecurityQuestionTO securityQuestionTO = model.getObject();
+
+ final ActionLinksPanel.Builder<Serializable> actionLinks = ActionLinksPanel.builder(pageReference);
+ actionLinks.setDisableIndicator(true);
+ actionLinks
+ .addWithRoles(new ActionLink<Serializable>() {
+
+ private static final long serialVersionUID = -3722207913631435501L;
+
+ @Override
+ public void onClick(final AjaxRequestTarget target, final Serializable ignore) {
+ modal.header(Model.of(String.valueOf(securityQuestionTO.getKey())));
+ modal.setFormModel(securityQuestionTO);
+ target.add(modal.setContent(
+ new SecurityQuestionModalPanel(modal, pageReference, false)));
+ modal.addSumbitButton();
+ modal.show(true);
+ }
+ }, ActionLink.ActionType.EDIT, StandardEntitlement.SECURITY_QUESTION_UPDATE)
+ .addWithRoles(new ActionLink<Serializable>() {
+
+ private static final long serialVersionUID = -3722207913631435501L;
+
+ @Override
+ public void onClick(final AjaxRequestTarget target, final Serializable ignore) {
+ try {
+ SyncopeConsoleSession.get().getService(SecurityQuestionService.class
+ ).delete(securityQuestionTO.getKey());
+ info(getString(Constants.OPERATION_SUCCEEDED));
+ feedbackPanel.refresh(target);
+ target.add(webContainer);
+ } catch (Exception e) {
+ LOG.error("While deleting SecutiryQuestionTO", e);
+ error(getString(Constants.ERROR) + ": " + e.getMessage());
+ feedbackPanel.refresh(target);
+ }
+
+ }
+ }, ActionLink.ActionType.DELETE, StandardEntitlement.SECURITY_QUESTION_DELETE);
+
+ item.add(actionLinks.build(componentId));
+ }
+ });
+
+ return columns;
+
+ }
+
+ private final class SecurityQuestionsProvider extends SortableDataProvider<SecurityQuestionTO, String> {
+
+ private static final long serialVersionUID = -185944053385660794L;
+
+ private final SortableDataProviderComparator<SecurityQuestionTO> comparator;
+
+ private SecurityQuestionsProvider() {
+ super();
+ setSort("key", SortOrder.ASCENDING);
+ comparator = new SortableDataProviderComparator<>(this);
+ }
+
+ @Override
+ public Iterator<SecurityQuestionTO> iterator(final long first, final long count) {
+ final List<SecurityQuestionTO> list = SyncopeConsoleSession.get().getService(SecurityQuestionService.class).
+ list();
+ Collections.sort(list, comparator);
+ return list.subList((int) first, (int) first + (int) count).iterator();
+ }
+
+ @Override
+ public long size() {
+ return SyncopeConsoleSession.get().getService(SecurityQuestionService.class).list().size();
+ }
+
+ @Override
+ public IModel<SecurityQuestionTO> model(final SecurityQuestionTO object) {
+ return new CompoundPropertyModel<>(object);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/syncope/blob/50ecf0d8/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java
index ff5bc7a..d8a0b8e 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java
@@ -79,7 +79,7 @@ public class BaseModal<T extends Serializable> extends Modal<T> implements Notif
feedbackPanel.setOutputMarkupId(true);
add(feedbackPanel);
- form = new Form<T>(FORM);
+ form = new Form<>(FORM);
add(form);
content = new AbstractModalPanel(this, null) {
http://git-wip-us.apache.org/repos/asf/syncope/blob/50ecf0d8/client/console/src/main/resources/org/apache/syncope/client/console/pages/Logs.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Logs.properties b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Logs.properties
index e37b4bc..20b2c4f 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Logs.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Logs.properties
@@ -14,4 +14,5 @@
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
+header_title=Logs
logLevel=Log Level
http://git-wip-us.apache.org/repos/asf/syncope/blob/50ecf0d8/client/console/src/main/resources/org/apache/syncope/client/console/pages/Logs_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Logs_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Logs_it.properties
index e37b4bc..20b2c4f 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Logs_it.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Logs_it.properties
@@ -14,4 +14,5 @@
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
+header_title=Logs
logLevel=Log Level
http://git-wip-us.apache.org/repos/asf/syncope/blob/50ecf0d8/client/console/src/main/resources/org/apache/syncope/client/console/pages/Logs_pt_BR.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Logs_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Logs_pt_BR.properties
index e37b4bc..20b2c4f 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Logs_pt_BR.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Logs_pt_BR.properties
@@ -14,4 +14,5 @@
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
+header_title=Logs
logLevel=Log Level
http://git-wip-us.apache.org/repos/asf/syncope/blob/50ecf0d8/client/console/src/main/resources/org/apache/syncope/client/console/pages/SecurityQuestions.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/SecurityQuestions.html b/client/console/src/main/resources/org/apache/syncope/client/console/pages/SecurityQuestions.html
index c1550ee..93608d2 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/pages/SecurityQuestions.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/SecurityQuestions.html
@@ -19,21 +19,31 @@ under the License.
-->
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
<wicket:extend>
-
- <section class="content-header">
- <h1>
- Security Questions
- <small>Work in progress</small>
- </h1>
- </section>
-
- <section class="content">
- <div class="progress progress active" style="margin:100px">
- <div style="width: 70%" aria-valuemax="100" aria-valuemin="0" aria-valuenow="20" role="progressbar" class="progress-bar progress-bar-success progress-bar-striped">
- <span class="sr-only">20% Complete</span>
+ <div class="wrapper">
+ <div class="admin-content-page" wicket:id="content">
+ <div class="box box-solid box-primary">
+ <div class="box-header with-border">
+ <h3 class="box-title">
+ <span wicket:id="header"></span>
+ </h3>
+ <div class="box-tools pull-right">
+ <ul class="nav navbar-nav actions">
+ <li>
+ <a wicket:message="title:createSecurityQuestion" wicket:id="createSecurityQuestion">
+ <i class="glyphicon glyphicon-link"></i>
+ </a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ <div class="box-body">
+ <div class="realms">
+ <div wicket:id="securityQuestionPanel"></div>
+ </div>
+ </div>
</div>
</div>
- </section>
-
+ </div>
+ <div wicket:id="securityQuestionModal"></div>
</wicket:extend>
</html>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/syncope/blob/50ecf0d8/client/console/src/main/resources/org/apache/syncope/client/console/pages/SecurityQuestions.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/SecurityQuestions.properties b/client/console/src/main/resources/org/apache/syncope/client/console/pages/SecurityQuestions.properties
new file mode 100644
index 0000000..bb64381
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/SecurityQuestions.properties
@@ -0,0 +1,19 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you 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.
+header_title=Security Questions
+createSecurityQuestion=Create new Secutiry Questions
+content=Content
http://git-wip-us.apache.org/repos/asf/syncope/blob/50ecf0d8/client/console/src/main/resources/org/apache/syncope/client/console/pages/SecurityQuestions_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/SecurityQuestions_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/pages/SecurityQuestions_it.properties
new file mode 100644
index 0000000..5943987
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/SecurityQuestions_it.properties
@@ -0,0 +1,19 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you 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.
+header_title=Security Questions
+createSecurityQuestion=Crea una nuova domanda di sicurezza
+content=Contenuto
http://git-wip-us.apache.org/repos/asf/syncope/blob/50ecf0d8/client/console/src/main/resources/org/apache/syncope/client/console/pages/SecurityQuestions_pt_BR.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/SecurityQuestions_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/pages/SecurityQuestions_pt_BR.properties
new file mode 100644
index 0000000..770e81d
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/SecurityQuestions_pt_BR.properties
@@ -0,0 +1,19 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you 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.
+header_title=Security Questions
+createSecurityQuestion=Cria um novo Security Question
+content=Conte\u00fado
http://git-wip-us.apache.org/repos/asf/syncope/blob/50ecf0d8/client/console/src/main/resources/org/apache/syncope/client/console/panels/SecurityQuestionDetailsPanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/SecurityQuestionDetailsPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/panels/SecurityQuestionDetailsPanel.html
new file mode 100644
index 0000000..153d686
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/SecurityQuestionDetailsPanel.html
@@ -0,0 +1,34 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you 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.
+-->
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
+ <wicket:panel>
+ <span wicket:id="container">
+ <div class="form-group">
+ <form wicket:id="form">
+ <div class="form-group">
+ <span wicket:id="key">[key]</span>
+ </div>
+ <div class="form-group">
+ <span wicket:id="content">[content]</span>
+ </div>
+ </form>
+ </div>
+ </span>
+ </wicket:panel>
+</html>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/syncope/blob/50ecf0d8/client/console/src/main/resources/org/apache/syncope/client/console/panels/SecurityQuestionDetailsPanel.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/SecurityQuestionDetailsPanel.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/SecurityQuestionDetailsPanel.properties
new file mode 100644
index 0000000..d55b703
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/SecurityQuestionDetailsPanel.properties
@@ -0,0 +1,18 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you 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.
+key=Key
+content=Content
http://git-wip-us.apache.org/repos/asf/syncope/blob/50ecf0d8/client/console/src/main/resources/org/apache/syncope/client/console/panels/SecurityQuestionDetailsPanel_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/SecurityQuestionDetailsPanel_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/SecurityQuestionDetailsPanel_it.properties
new file mode 100644
index 0000000..17eeed6
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/SecurityQuestionDetailsPanel_it.properties
@@ -0,0 +1,18 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you 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.
+key=Key
+content=Contenuto
http://git-wip-us.apache.org/repos/asf/syncope/blob/50ecf0d8/client/console/src/main/resources/org/apache/syncope/client/console/panels/SecurityQuestionDetailsPanel_pt_BR.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/SecurityQuestionDetailsPanel_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/SecurityQuestionDetailsPanel_pt_BR.properties
new file mode 100644
index 0000000..6523f0d
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/SecurityQuestionDetailsPanel_pt_BR.properties
@@ -0,0 +1,18 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you 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.
+key=Key
+content=Conte\u00fado
http://git-wip-us.apache.org/repos/asf/syncope/blob/50ecf0d8/client/console/src/main/resources/org/apache/syncope/client/console/panels/SecurityQuestionModalPanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/SecurityQuestionModalPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/panels/SecurityQuestionModalPanel.html
new file mode 100644
index 0000000..224b6c0
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/SecurityQuestionModalPanel.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you 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.
+-->
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
+ <wicket:extend>
+ <div wicket:id="securityQuestionDetailsPanel">[securityQuestionDetailsPanel]</div>
+ </wicket:extend>
+</html>