From 389e29881724b90daa466247aef1b8a164511bb9 Mon Sep 17 00:00:00 2001 From: Vitaly Takmazov Date: Sat, 21 Aug 2021 03:49:12 +0300 Subject: ActivityPub: add Application as an actor type --- src/main/java/com/juick/KeystoreManager.java | 4 +-- src/main/java/com/juick/SignatureManager.java | 15 ++++----- .../com/juick/www/api/activity/model/Context.java | 3 +- .../api/activity/model/objects/Application.java | 25 +++++++++++++++ .../www/api/activity/model/objects/Person.java | 13 +------- .../api/activity/model/objects/SecurityObject.java | 36 ++++++++++++++++++++++ 6 files changed, 74 insertions(+), 22 deletions(-) create mode 100644 src/main/java/com/juick/www/api/activity/model/objects/Application.java create mode 100644 src/main/java/com/juick/www/api/activity/model/objects/SecurityObject.java (limited to 'src/main') diff --git a/src/main/java/com/juick/KeystoreManager.java b/src/main/java/com/juick/KeystoreManager.java index ce7d4a3b..f968f627 100644 --- a/src/main/java/com/juick/KeystoreManager.java +++ b/src/main/java/com/juick/KeystoreManager.java @@ -17,7 +17,7 @@ package com.juick; -import com.juick.www.api.activity.model.objects.Person; +import com.juick.www.api.activity.model.objects.SecurityObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.io.Resource; @@ -74,7 +74,7 @@ public class KeystoreManager { return String.format("-----BEGIN PUBLIC KEY-----\n%s\n-----END PUBLIC KEY-----\n", String.join("\n", key)); } - public static PublicKey publicKeyOf(Person person) { + public static PublicKey publicKeyOf(SecurityObject person) { String pubkeyPem = person.getPublicKey().getPublicKeyPem(); String[] rawKey = pubkeyPem.split("\\n"); String pubkeyData = String.join("", Arrays.asList(rawKey).subList(1, rawKey.length - 1)); diff --git a/src/main/java/com/juick/SignatureManager.java b/src/main/java/com/juick/SignatureManager.java index 35d6215f..d14eedd1 100644 --- a/src/main/java/com/juick/SignatureManager.java +++ b/src/main/java/com/juick/SignatureManager.java @@ -24,6 +24,7 @@ import com.juick.service.UserService; import com.juick.util.DateFormattersHolder; import com.juick.www.api.activity.model.Context; import com.juick.www.api.activity.model.objects.Person; +import com.juick.www.api.activity.model.objects.SecurityObject; import com.juick.www.api.webfinger.model.Account; import com.juick.www.api.webfinger.model.Link; import org.apache.commons.lang3.StringUtils; @@ -93,14 +94,14 @@ public class SignatureManager { logger.info("Remote response: {}", response.getStatusCodeValue()); } - public String addSignature(Person from, String host, String method, + public String addSignature(SecurityObject from, String host, String method, String path, String dateString, String digestHeader) throws IOException { return addSignature(from, host, method, path, dateString, digestHeader, keystoreManager); } - public String addSignature(Person from, String host, String method, + public String addSignature(SecurityObject from, String host, String method, String path, String dateString, String digestHeader, KeystoreManager keystoreManager) throws IOException { List requiredHeaders = StringUtils.isEmpty(digestHeader) ? @@ -126,9 +127,9 @@ public class SignatureManager { Signature signature = Signature.fromString(signatureString); Optional context = getContext(UriComponentsBuilder.fromUriString(signature.getKeyId()) .fragment(null).build().toUri()); - if (context.isPresent() && context.get() instanceof Person) { - Person person = (Person) context.get(); - Key key = KeystoreManager.publicKeyOf(person); + if (context.isPresent() && context.get() instanceof SecurityObject) { + SecurityObject securityObject = (SecurityObject) context.get(); + Key key = KeystoreManager.publicKeyOf(securityObject); Verifier verifier = new Verifier(key, signature); try { @@ -136,9 +137,9 @@ public class SignatureManager { logger.info("signature of {} is valid: {}", signature.getKeyId(), result); if (result) { User user = new User(); - user.setUri(URI.create(person.getId())); + user.setUri(URI.create(securityObject.getId())); if (key.equals(keystoreManager.getPublicKey())) { - return userService.getUserByName(person.getName()); + return userService.getUserByName(securityObject.getName()); } return user; } else { diff --git a/src/main/java/com/juick/www/api/activity/model/Context.java b/src/main/java/com/juick/www/api/activity/model/Context.java index a9d61617..fb726565 100644 --- a/src/main/java/com/juick/www/api/activity/model/Context.java +++ b/src/main/java/com/juick/www/api/activity/model/Context.java @@ -52,7 +52,8 @@ import java.util.Map; @JsonSubTypes.Type(value = Note.class, name = "Note"), @JsonSubTypes.Type(value = OrderedCollection.class, name = "OrderedCollection"), @JsonSubTypes.Type(value = OrderedCollectionPage.class, name = "OrderedCollectionPage"), - @JsonSubTypes.Type(value = Person.class, name = "Person") + @JsonSubTypes.Type(value = Person.class, name = "Person"), + @JsonSubTypes.Type(value = Application.class, name = "Application") }) public abstract class Context { diff --git a/src/main/java/com/juick/www/api/activity/model/objects/Application.java b/src/main/java/com/juick/www/api/activity/model/objects/Application.java new file mode 100644 index 00000000..23a44e49 --- /dev/null +++ b/src/main/java/com/juick/www/api/activity/model/objects/Application.java @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2008-2021, Juick + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package com.juick.www.api.activity.model.objects; + +public class Application extends SecurityObject { + @Override + public String getType() { + return "Application"; + } +} diff --git a/src/main/java/com/juick/www/api/activity/model/objects/Person.java b/src/main/java/com/juick/www/api/activity/model/objects/Person.java index af4ca27d..52626833 100644 --- a/src/main/java/com/juick/www/api/activity/model/objects/Person.java +++ b/src/main/java/com/juick/www/api/activity/model/objects/Person.java @@ -18,9 +18,8 @@ package com.juick.www.api.activity.model.objects; import com.fasterxml.jackson.annotation.JsonTypeInfo; -import com.juick.www.api.activity.model.Context; -public class Person extends Context { +public class Person extends SecurityObject { private String name; private String preferredUsername; @@ -29,7 +28,6 @@ public class Person extends Context { private String outbox; private String following; private String followers; - private Key publicKey; @Override public String getType() { @@ -85,15 +83,6 @@ public class Person extends Context { this.followers = followers; } - @JsonTypeInfo(use = JsonTypeInfo.Id.NONE) - public Key getPublicKey() { - return publicKey; - } - - public void setPublicKey(Key publicKey) { - this.publicKey = publicKey; - } - public String getPreferredUsername() { return preferredUsername; } diff --git a/src/main/java/com/juick/www/api/activity/model/objects/SecurityObject.java b/src/main/java/com/juick/www/api/activity/model/objects/SecurityObject.java new file mode 100644 index 00000000..8d17aa29 --- /dev/null +++ b/src/main/java/com/juick/www/api/activity/model/objects/SecurityObject.java @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2008-2021, Juick + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package com.juick.www.api.activity.model.objects; + +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.juick.www.api.activity.model.Context; + +public class SecurityObject extends Context { + + private Key publicKey; + + @JsonTypeInfo(use = JsonTypeInfo.Id.NONE) + public Key getPublicKey() { + return publicKey; + } + + public void setPublicKey(Key publicKey) { + this.publicKey = publicKey; + } + +} -- cgit v1.2.3