Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions addon-sdk/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

<javax.servlet-api.version>4.0.1</javax.servlet-api.version>
<jetty.version>11.0.16</jetty.version>
<jetty.version>11.0.22</jetty.version>
<gson.version>2.10.1</gson.version>
<jsonwebtoken.version>0.11.5</jsonwebtoken.version>
</properties>
Expand All @@ -24,7 +24,7 @@
<dependency>
<groupId>com.cake.clockify</groupId>
<artifactId>addon-sdk-annotation-processor</artifactId>
<version>1.0.6</version>
<version>1.0.7</version>
</dependency>

<dependency>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.cake.clockify.addonsdk.clockify;

import io.jsonwebtoken.JwtParser;
import io.jsonwebtoken.Jwts;

import java.security.interfaces.RSAPublicKey;
import java.util.Map;

public class ClockifySignatureParser {
public static final String CLAIM_TYPE = "type";
public static final String CLAIM_BACKEND_URL = "backendUrl";
public static final String CLAIM_PTO_URL = "ptoUrl";
public static final String CLAIM_REPORTS_URL = "reportsUrl";
public static final String CLAIM_WORKSPACE_ID = "workspaceId";
public static final String CLAIM_ADDON_ID = "addonId";
public static final String CLAIM_USER_ID = "user";
public static final String CLAIM_WORKSPACE_ROLE = "workspaceRole";

public static final String ISSUER = "clockify";
public static final String ADDON = "addon";
private final JwtParser parser;

/**
* @param addonKey the key declared inside the addon manifest
* @param publicKey the RSA256 public key
*/
public ClockifySignatureParser(String addonKey, RSAPublicKey publicKey) {
this.parser = Jwts.parserBuilder()
.requireIssuer(ISSUER)
.requireSubject(addonKey)
.require(CLAIM_TYPE, ADDON)
.setSigningKey(publicKey)
.build();
}

public Map<String, Object> parseClaims(String token) {
return parser.parseClaimsJws(token).getBody();
}
}

This file was deleted.

2 changes: 1 addition & 1 deletion annotation-processor/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

<groupId>com.cake.clockify</groupId>
<artifactId>addon-sdk-annotation-processor</artifactId>
<version>1.0.6</version>
<version>1.0.8</version>

<properties>
<maven.compiler.source>17</maven.compiler.source>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,15 @@

@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class Constants {
public static final String MANIFEST_FILE = "clockify-manifest-v1.2.json";
public static final String DELIMITER_NAME_PARTS = "_";

public static final String REGEX_METHOD_NAME_SPLIT = "[.\\-_]";
public static final String REGEX_UPPER_CASE_SPLIT = "(?=\\p{Upper})";

public static final String CLOCKIFY_MODEL_PACKAGE = "com.cake.clockify.addonsdk.clockify.model";
public static final String CLOCKIFY_MANIFESTS_DIR = "clockify-manifests";

public static final String CLOCKIFY_PREFIX = "Clockify";
public static final String CLOCKIFY_MANIFEST_INTERFACE = "ClockifyManifest";
public static final String CLOCKIFY_PATH_INTERFACE = "ClockifyResource";
}
Original file line number Diff line number Diff line change
Expand Up @@ -44,11 +44,13 @@ private void processAnnotation(TypeElement annotation, RoundEnvironment roundEnv
for (Element element : elements) {
DeclaredType type = (DeclaredType) element.asType();

try {
files.addAll(new ClockifyManifestProcessor(type).process());
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
for (String manifestPath: Utils.getClockifyManifestPaths()) {
try {
files.addAll(new ClockifyManifestProcessor(type, manifestPath).process());
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,18 @@

import javax.lang.model.type.DeclaredType;
import java.io.InputStream;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.Map;

import static com.cake.clockify.annotationprocessor.Constants.CLOCKIFY_PREFIX;
import static com.cake.clockify.annotationprocessor.Constants.MANIFEST_FILE;
import static com.cake.clockify.annotationprocessor.Constants.CLOCKIFY_MANIFESTS_DIR;
import static com.cake.clockify.annotationprocessor.Constants.REGEX_METHOD_NAME_SPLIT;
import static com.cake.clockify.annotationprocessor.Constants.REGEX_UPPER_CASE_SPLIT;
import static java.util.Collections.emptyList;
Expand All @@ -31,8 +35,19 @@ public class Utils {
);

@SneakyThrows
public static JsonNode readManifestDefinition(ObjectMapper mapper) {
InputStream is = Utils.class.getClassLoader().getResourceAsStream(MANIFEST_FILE);
public static List<String> getClockifyManifestPaths() {
URL url = Utils.class.getClassLoader().getResource(CLOCKIFY_MANIFESTS_DIR);
Path path = Paths.get(url.toURI());
try (var files = Files.walk(path, 1)) {
return files.filter(p -> p.toFile().isFile())
.map(p -> CLOCKIFY_MANIFESTS_DIR + "/" + p.getFileName().toString())
.toList();
}
}

@SneakyThrows
public static JsonNode readManifestDefinition(ObjectMapper mapper, String manifestPath) {
InputStream is = Utils.class.getClassLoader().getResourceAsStream(manifestPath);
return mapper.readTree(is);
}

Expand Down Expand Up @@ -174,4 +189,11 @@ public static String getPropertyDescription(JsonNode node) {
}
return "";
}

public static String getVersionedPackageName(JsonNode manifest, String packageName) {
String version = manifest.get("version").asText();
String versionSubpackage = "v" + version.replace(".", "_");

return packageName + "." + versionSubpackage;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import com.cake.clockify.annotationprocessor.Utils;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.squareup.javapoet.JavaFile;

import javax.lang.model.type.DeclaredType;
Expand All @@ -17,8 +18,8 @@ public class ClockifyManifestProcessor {
private final String packageName;
private final String className;

public ClockifyManifestProcessor(DeclaredType type) {
this.manifest = Utils.readManifestDefinition(new ObjectMapper());
public ClockifyManifestProcessor(DeclaredType type, String manifestPath) {
this.manifest = Utils.readManifestDefinition(new ObjectMapper(), manifestPath);

String[] qualifiedNames = Utils.getPackageAndClassNames(type);
this.packageName = qualifiedNames[0];
Expand All @@ -39,11 +40,17 @@ private List<JavaFile> getObjectDefinitions() {
if (isObjectDefinition(node)) {
DefinitionProcessor processor = new DefinitionProcessor(
manifest,
packageName,
Utils.getDefinitionSimpleClassName(definition),
definition
);

javaFiles.addAll(processor.process());
} else if (isEnumDefinition(node)) {
EnumConstantsProcessor processor = new EnumConstantsProcessor(
manifest,
definition
);

javaFiles.addAll(processor.process());
}
});
Expand All @@ -52,10 +59,15 @@ private List<JavaFile> getObjectDefinitions() {
}

private List<JavaFile> getManifestDefinition() {
return new DefinitionProcessor(manifest, packageName, className, null).process();
return new DefinitionProcessor(manifest, className, null).process();
}

private boolean isObjectDefinition(JsonNode node) {
return NodeConstants.OBJECT.equals(Utils.getNodeType(node, manifest.get(NodeConstants.DEFINITIONS)));
}

private boolean isEnumDefinition(JsonNode node) {
String type = Utils.getNodeType(node, manifest.get(NodeConstants.DEFINITIONS));
return NodeConstants.STRING.equals(type) && node.get(NodeConstants.ENUM) instanceof ArrayNode;
}
}
Loading