Added columns to the oauth2_client table and updated client registration

Change-Id: Ic16b41859fdda464fc2315ae40b1ddded9c45dca
diff --git a/full/src/main/java/de/ids_mannheim/korap/config/FullConfiguration.java b/full/src/main/java/de/ids_mannheim/korap/config/FullConfiguration.java
index 969d4b6..32f98f8 100644
--- a/full/src/main/java/de/ids_mannheim/korap/config/FullConfiguration.java
+++ b/full/src/main/java/de/ids_mannheim/korap/config/FullConfiguration.java
@@ -79,6 +79,7 @@
 
     private int accessTokenLongExpiry;
     private int accessTokenExpiry;
+    private int refreshTokenLongExpiry;
     private int refreshTokenExpiry;
     private int authorizationCodeExpiry;
 
@@ -270,6 +271,8 @@
         
         setAccessTokenLongExpiry(TimeUtils.convertTimeToSeconds(
                 properties.getProperty("oauth2.access.token.long.expiry", "365D")));
+        setRefreshTokenLongExpiry(TimeUtils.convertTimeToSeconds(
+                properties.getProperty("oauth2.refresh.token.long.expiry", "365D")));
     }
 
     private void setMailConfiguration (Properties properties) {
@@ -663,4 +666,12 @@
     public void setAccessTokenLongExpiry (int accessTokenLongExpiry) {
         this.accessTokenLongExpiry = accessTokenLongExpiry;
     }
+
+    public int getRefreshTokenLongExpiry () {
+        return refreshTokenLongExpiry;
+    }
+
+    public void setRefreshTokenLongExpiry (int refreshTokenLongExpiry) {
+        this.refreshTokenLongExpiry = refreshTokenLongExpiry;
+    }
 }
diff --git a/full/src/main/java/de/ids_mannheim/korap/oauth2/dao/OAuth2ClientDao.java b/full/src/main/java/de/ids_mannheim/korap/oauth2/dao/OAuth2ClientDao.java
index dff99d6..989deb2 100644
--- a/full/src/main/java/de/ids_mannheim/korap/oauth2/dao/OAuth2ClientDao.java
+++ b/full/src/main/java/de/ids_mannheim/korap/oauth2/dao/OAuth2ClientDao.java
@@ -15,10 +15,14 @@
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
 
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Repository;
 import org.springframework.transaction.annotation.Transactional;
 
+import com.fasterxml.jackson.databind.JsonNode;
+
 import de.ids_mannheim.korap.config.Attributes;
+import de.ids_mannheim.korap.config.FullConfiguration;
 import de.ids_mannheim.korap.exceptions.KustvaktException;
 import de.ids_mannheim.korap.exceptions.StatusCodes;
 import de.ids_mannheim.korap.oauth2.constant.OAuth2ClientType;
@@ -42,10 +46,13 @@
 
     @PersistenceContext
     private EntityManager entityManager;
+    @Autowired
+    private FullConfiguration config;
 
     public void registerClient (String id, String secretHashcode, String name,
             OAuth2ClientType type, String url, String redirectURI,
-            String registeredBy, String description) throws KustvaktException {
+            String registeredBy, String description, int refreshTokenExpiry,
+            JsonNode source) throws KustvaktException {
         ParameterChecker.checkStringValue(id, "client_id");
         ParameterChecker.checkStringValue(name, "client_name");
         ParameterChecker.checkObjectValue(type, "client_type");
@@ -63,7 +70,17 @@
         client.setUrl(url);
         client.setRedirectURI(redirectURI);
         client.setRegisteredBy(registeredBy);
+        client.setRegistrationDate(ZonedDateTime.now());
         client.setDescription(description);
+        if (source !=null && !source.isNull()) {
+            client.setSource(source.toString());
+        }
+        else {
+            client.setPermitted(true);
+        }
+        if (refreshTokenExpiry <= 0) {
+           refreshTokenExpiry = config.getRefreshTokenLongExpiry();
+        }
         entityManager.persist(client);
     }
 
diff --git a/full/src/main/java/de/ids_mannheim/korap/oauth2/dto/OAuth2ClientInfoDto.java b/full/src/main/java/de/ids_mannheim/korap/oauth2/dto/OAuth2ClientInfoDto.java
index 3f22288..04dc175 100644
--- a/full/src/main/java/de/ids_mannheim/korap/oauth2/dto/OAuth2ClientInfoDto.java
+++ b/full/src/main/java/de/ids_mannheim/korap/oauth2/dto/OAuth2ClientInfoDto.java
@@ -1,11 +1,14 @@
 package de.ids_mannheim.korap.oauth2.dto;
 
 import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonInclude.Include;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.annotation.JsonProperty;
 
+import de.ids_mannheim.korap.exceptions.KustvaktException;
 import de.ids_mannheim.korap.oauth2.constant.OAuth2ClientType;
 import de.ids_mannheim.korap.oauth2.entity.OAuth2Client;
+import de.ids_mannheim.korap.utils.JsonUtils;
 
 /** Describes information about an OAuth2 client.
  * 
@@ -24,9 +27,15 @@
     private String redirect_uri;
     @JsonProperty("registered_by")
     private String registeredBy;
+    @JsonProperty("registration_date")
+    private String registrationDate;
     private OAuth2ClientType type;
+    
+    @JsonProperty("permitted")
+    private boolean isPermitted;
+    private JsonNode source;
 
-    public OAuth2ClientInfoDto (OAuth2Client client) {
+    public OAuth2ClientInfoDto (OAuth2Client client) throws KustvaktException {
         this.id = client.getId();
         this.name = client.getName();
         this.description = client.getDescription();
@@ -34,7 +43,12 @@
         this.url = client.getUrl();
         this.registeredBy = client.getRegisteredBy();
         this.redirect_uri = client.getRedirectURI();
-
+        this.registrationDate = client.getRegistrationDate().toString();
+        this.isPermitted = client.isPermitted();
+        String source = client.getSource();
+        if (source != null) {
+            this.source = JsonUtils.readTree(source);
+        }
         if (client.isSuper()) {
             this.isSuper = "true";
         }
@@ -103,5 +117,26 @@
     public void setRedirect_uri (String redirect_uri) {
         this.redirect_uri = redirect_uri;
     }
+    
+    public String getRegistrationDate () {
+        return registrationDate;
+    }
+    public void setRegistrationDate (String registrationDate) {
+        this.registrationDate = registrationDate;
+    }
+    
+    public JsonNode getSource () {
+        return source;
+    }
+    public void setSource (JsonNode source) {
+        this.source = source;
+    }
+    
+    public boolean isPermitted () {
+        return isPermitted;
+    }
+    public void setPermitted (boolean isPermitted) {
+        this.isPermitted = isPermitted;
+    }
 
 }
diff --git a/full/src/main/java/de/ids_mannheim/korap/oauth2/entity/OAuth2Client.java b/full/src/main/java/de/ids_mannheim/korap/oauth2/entity/OAuth2Client.java
index fb5cbbb..b7d1031 100644
--- a/full/src/main/java/de/ids_mannheim/korap/oauth2/entity/OAuth2Client.java
+++ b/full/src/main/java/de/ids_mannheim/korap/oauth2/entity/OAuth2Client.java
@@ -1,5 +1,6 @@
 package de.ids_mannheim.korap.oauth2.entity;
 
+import java.time.ZonedDateTime;
 import java.util.List;
 
 import javax.persistence.Column;
@@ -33,12 +34,20 @@
     private boolean isSuper;
     @Column(name = "redirect_uri")
     private String redirectURI;
-    @Column(name = "registered_by")
+    @Column(name = "registered_by", updatable = false)
     private String registeredBy;
+    @Column(name = "registration_date", updatable = false)
+    private ZonedDateTime registrationDate;
+    
+    @Column(name = "refresh_token_expiry")
+    private int refresTokenExpiry;
     private String description;
-
     private String url;
 
+    private String source;
+    @Column(name = "is_permitted")
+    private boolean isPermitted;
+    
     @OneToMany(fetch = FetchType.LAZY, mappedBy = "client")
     private List<RefreshToken> refreshTokens;
     
@@ -113,6 +122,13 @@
     public void setRegisteredBy (String registeredBy) {
         this.registeredBy = registeredBy;
     }
+    
+    public ZonedDateTime getRegistrationDate () {
+        return registrationDate;
+    }
+    public void setRegistrationDate (ZonedDateTime registrationDate) {
+        this.registrationDate = registrationDate;
+    }
 
     public String getDescription () {
         return description;
@@ -130,4 +146,19 @@
         this.url = url;
     }
 
+    public String getSource () {
+        return source;
+    }
+
+    public void setSource (String source) {
+        this.source = source;
+    }
+
+    public boolean isPermitted () {
+        return isPermitted;
+    }
+    
+    public void setPermitted (boolean isPermitted) {
+        this.isPermitted = isPermitted;
+    }
 }
diff --git a/full/src/main/java/de/ids_mannheim/korap/oauth2/service/OAuth2ClientService.java b/full/src/main/java/de/ids_mannheim/korap/oauth2/service/OAuth2ClientService.java
index 505140c..d714111 100644
--- a/full/src/main/java/de/ids_mannheim/korap/oauth2/service/OAuth2ClientService.java
+++ b/full/src/main/java/de/ids_mannheim/korap/oauth2/service/OAuth2ClientService.java
@@ -13,6 +13,8 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import com.fasterxml.jackson.databind.JsonNode;
+
 import de.ids_mannheim.korap.config.FullConfiguration;
 import de.ids_mannheim.korap.dao.AdminDao;
 import de.ids_mannheim.korap.encryption.RandomCodeGenerator;
@@ -128,10 +130,13 @@
 
         String id = codeGenerator.createRandomCode();
         id = codeGenerator.filterRandomCode(id);
+        
         try {
             clientDao.registerClient(id, secretHashcode, clientJson.getName(),
                     clientJson.getType(), url, redirectURI, registeredBy,
-                    clientJson.getDescription());
+                    clientJson.getDescription(),
+                    clientJson.getRefreshTokenExpiry(),
+                    clientJson.getSource());
         }
         catch (KustvaktException e) {
             throw new KustvaktException(e.getStatusCode(),
diff --git a/full/src/main/java/de/ids_mannheim/korap/web/input/OAuth2ClientJson.java b/full/src/main/java/de/ids_mannheim/korap/web/input/OAuth2ClientJson.java
index b11ac63..7180eda 100644
--- a/full/src/main/java/de/ids_mannheim/korap/web/input/OAuth2ClientJson.java
+++ b/full/src/main/java/de/ids_mannheim/korap/web/input/OAuth2ClientJson.java
@@ -1,6 +1,7 @@
 package de.ids_mannheim.korap.web.input;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.JsonNode;
 
 import de.ids_mannheim.korap.oauth2.constant.OAuth2ClientType;
 
@@ -11,6 +12,8 @@
  * To accommodate desktop applications such as R, url and redirectURI
  * are not compulsory.
  * 
+ * Source is json description of a plugin.
+ * 
  * @author margaretha
  *
  */
@@ -27,7 +30,11 @@
     // the user to after they have authorized a client.
     @JsonProperty("redirect_uri")
     private String redirectURI;
+    // Default 365 days
+    private int refreshTokenExpiry; // in seconds
     
+    // plugins
+    private JsonNode source;
 
     public String getName () {
         return name;
@@ -68,4 +75,20 @@
     public void setDescription (String description) {
         this.description = description;
     }
+
+    public int getRefreshTokenExpiry () {
+        return refreshTokenExpiry;
+    }
+
+    public void setRefreshTokenExpiry (int refreshTokenExpiry) {
+        this.refreshTokenExpiry = refreshTokenExpiry;
+    }
+
+    public JsonNode getSource () {
+        return source;
+    }
+
+    public void setSource (JsonNode source2) {
+        this.source = source2;
+    }
 }