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>