DRILL-8215: Remove SecurityContext from PluginConfigWrapper

diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/CredentialResources.java b/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/CredentialResources.java
index c63043e..02c784e 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/CredentialResources.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/CredentialResources.java
@@ -125,11 +125,18 @@
       default:
         return Collections.emptyList();
     }
-    return StreamSupport.stream(
+    List<PluginConfigWrapper> results = StreamSupport.stream(
         Spliterators.spliteratorUnknownSize(storage.storedConfigs(filter).entrySet().iterator(), Spliterator.ORDERED), false)
-      .map(entry -> new PluginConfigWrapper(entry.getKey(), entry.getValue(), sc))
+      .map(entry -> new PluginConfigWrapper(entry.getKey(), entry.getValue()))
       .sorted(PLUGIN_COMPARATOR)
       .collect(Collectors.toList());
+
+    if (results.isEmpty()) {
+      return Collections.emptyList();
+    } else {
+      return results;
+    }
+
   }
 
   @POST
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/PluginConfigWrapper.java b/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/PluginConfigWrapper.java
index ff5170d..69d6211 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/PluginConfigWrapper.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/PluginConfigWrapper.java
@@ -19,10 +19,8 @@
 
 import java.util.Optional;
 
-import javax.ws.rs.core.SecurityContext;
 import javax.xml.bind.annotation.XmlRootElement;
 
-import com.fasterxml.jackson.annotation.JacksonInject;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import org.apache.drill.common.logical.CredentialedStoragePluginConfig;
 import org.apache.drill.common.logical.StoragePluginConfig;
@@ -39,15 +37,12 @@
 public class PluginConfigWrapper {
   private final String name;
   private final StoragePluginConfig config;
-  private final SecurityContext sc;
 
   @JsonCreator
   public PluginConfigWrapper(@JsonProperty("name") String name,
-                             @JsonProperty("config") StoragePluginConfig config,
-                             @JacksonInject SecurityContext sc) {
+                             @JsonProperty("config") StoragePluginConfig config) {
     this.name = name;
     this.config = config;
-    this.sc = sc;
   }
 
   public String getName() { return name; }
@@ -59,34 +54,32 @@
   }
 
   @JsonIgnore
-  public String getUserName() {
+  public String getUserName(String activeUser) {
     if (!(config instanceof CredentialedStoragePluginConfig)) {
       return null;
     }
 
     CredentialedStoragePluginConfig securedStoragePluginConfig = (CredentialedStoragePluginConfig) config;
     CredentialsProvider credentialsProvider = securedStoragePluginConfig.getCredentialsProvider();
-    String queryUser = sc.getUserPrincipal().getName();
     Optional<UsernamePasswordCredentials> credentials = new UsernamePasswordCredentials.Builder()
       .setCredentialsProvider(credentialsProvider)
-      .setQueryUser(queryUser)
+      .setQueryUser(activeUser)
       .build();
 
     return credentials.map(UsernamePasswordCredentials::getUsername).orElse(null);
   }
 
   @JsonIgnore
-  public String getPassword() {
+  public String getPassword(String activeUser) {
     if (!(config instanceof CredentialedStoragePluginConfig)) {
       return null;
     }
 
     CredentialedStoragePluginConfig securedStoragePluginConfig = (CredentialedStoragePluginConfig) config;
     CredentialsProvider credentialsProvider = securedStoragePluginConfig.getCredentialsProvider();
-    String queryUser = sc.getUserPrincipal().getName();
     Optional<UsernamePasswordCredentials> credentials = new UsernamePasswordCredentials.Builder()
       .setCredentialsProvider(credentialsProvider)
-      .setQueryUser(queryUser)
+      .setQueryUser(activeUser)
       .build();
 
     return credentials.map(UsernamePasswordCredentials::getPassword).orElse(null);
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/StorageResources.java b/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/StorageResources.java
index 2d36f77..0dff081 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/StorageResources.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/StorageResources.java
@@ -163,7 +163,7 @@
   @Operation(externalDocs = @ExternalDocumentation(description = "Apache Drill REST API documentation:", url = "https://drill.apache.org/docs/rest-api-introduction/"))
   public Response getPluginConfig(@PathParam("name") String name) {
     try {
-      return Response.ok(new PluginConfigWrapper(name, storage.getStoredConfig(name), sc))
+      return Response.ok(new PluginConfigWrapper(name, storage.getStoredConfig(name)))
         .build();
     } catch (Exception e) {
       logger.error("Failure while trying to access storage config: {}", name, e);
@@ -389,7 +389,7 @@
         .build();
     }
 
-    return Response.ok(new PluginConfigWrapper(name, storage.getStoredConfig(name), sc))
+    return Response.ok(new PluginConfigWrapper(name, storage.getStoredConfig(name)))
       .header(HttpHeaders.CONTENT_DISPOSITION, String.format("attachment;filename=\"%s.%s\"", name, format))
       .build();
   }
@@ -511,7 +511,7 @@
     pluginGroup = StringUtils.isNotEmpty(pluginGroup) ? pluginGroup.replace("/", "") : ALL_PLUGINS;
     return StreamSupport.stream(
       Spliterators.spliteratorUnknownSize(storage.storedConfigs(filter).entrySet().iterator(), Spliterator.ORDERED), false)
-        .map(entry -> new PluginConfigWrapper(entry.getKey(), entry.getValue(), sc))
+        .map(entry -> new PluginConfigWrapper(entry.getKey(), entry.getValue()))
         .sorted(PLUGIN_COMPARATOR)
         .collect(Collectors.toList());
   }
@@ -554,7 +554,7 @@
   }
 
   /**
-   * Model class for Storage Plugin page.
+   * Model class for Storage Plugin and Credentials page.
    * It contains a storage plugin as well as the CSRF token for the page.
    */
   public static class StoragePluginModel {
@@ -579,6 +579,26 @@
       return securityContext.getUserPrincipal().getName();
     }
 
+    public String getUserName() {
+      String username = plugin.getUserName(getActiveUser());
+      if (StringUtils.isEmpty(username)) {
+        return "";
+      }
+      else {
+        return username;
+      }
+    }
+
+    public String getPassword() {
+      String password = plugin.getPassword(getActiveUser());
+      if (StringUtils.isEmpty(password)) {
+        return "";
+      }
+      else {
+        return password;
+      }
+    }
+
     public String getType() {
       return type;
     }
diff --git a/exec/java-exec/src/main/resources/rest/credentials/list.ftl b/exec/java-exec/src/main/resources/rest/credentials/list.ftl
index 8872594..b7f53ae 100644
--- a/exec/java-exec/src/main/resources/rest/credentials/list.ftl
+++ b/exec/java-exec/src/main/resources/rest/credentials/list.ftl
@@ -42,17 +42,19 @@
       <table class="table table-hover">
         <tbody>
         <#list model as pluginModel>
+          <#if pluginModel.getPlugin()?? >
           <tr>
             <td style="border:none; max-width: 200px; overflow: hidden; text-overflow: ellipsis;">
                 ${pluginModel.getPlugin().getName()}
             </td>
             <td style="border:none;">
               <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#new-plugin-modal" data-plugin="${pluginModel.getPlugin().getName()}"
-                      data-username="${pluginModel.getPlugin().getUserName()}" data-password="${pluginModel.getPlugin().getPassword()}">
+                      data-username="${pluginModel.getUserName()}" data-password="${pluginModel.getPassword()}">
                 Update Credentials
               </button>
             </td>
           </tr>
+          </#if>
         </#list>
         </tbody>
       </table>