Skip to content

Commit 4b464de

Browse files
committed
Support CRUD user/conversation settings in servers
1 parent 3438af9 commit 4b464de

59 files changed

Lines changed: 3040 additions & 55 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
<icu4j.version>74.2</icu4j.version>
4040
<jctools-core.version>4.0.3</jctools-core.version>
4141
<log4j.version>2.23.1</log4j.version>
42-
<protobuf.version>4.26.1</protobuf.version>
42+
<protobuf.version>4.27.0</protobuf.version>
4343
<swagger.version>2.2.20</swagger.version>
4444
<swagger-ui.version>5.11.10</swagger-ui.version>
4545

turms-gateway/src/main/java/im/turms/gateway/access/client/common/authorization/policy/PolicyStatementResource.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import static im.turms.server.common.access.client.dto.request.TurmsRequest.KindCase.CREATE_MESSAGE_REQUEST;
4141
import static im.turms.server.common.access.client.dto.request.TurmsRequest.KindCase.CREATE_RELATIONSHIP_GROUP_REQUEST;
4242
import static im.turms.server.common.access.client.dto.request.TurmsRequest.KindCase.CREATE_RELATIONSHIP_REQUEST;
43+
import static im.turms.server.common.access.client.dto.request.TurmsRequest.KindCase.DELETE_CONVERSATION_SETTINGS_REQUEST;
4344
import static im.turms.server.common.access.client.dto.request.TurmsRequest.KindCase.DELETE_GROUP_BLOCKED_USER_REQUEST;
4445
import static im.turms.server.common.access.client.dto.request.TurmsRequest.KindCase.DELETE_GROUP_INVITATION_REQUEST;
4546
import static im.turms.server.common.access.client.dto.request.TurmsRequest.KindCase.DELETE_GROUP_JOIN_QUESTIONS_REQUEST;
@@ -50,7 +51,9 @@
5051
import static im.turms.server.common.access.client.dto.request.TurmsRequest.KindCase.DELETE_RELATIONSHIP_GROUP_REQUEST;
5152
import static im.turms.server.common.access.client.dto.request.TurmsRequest.KindCase.DELETE_RELATIONSHIP_REQUEST;
5253
import static im.turms.server.common.access.client.dto.request.TurmsRequest.KindCase.DELETE_RESOURCE_REQUEST;
54+
import static im.turms.server.common.access.client.dto.request.TurmsRequest.KindCase.DELETE_USER_SETTINGS_REQUEST;
5355
import static im.turms.server.common.access.client.dto.request.TurmsRequest.KindCase.QUERY_CONVERSATIONS_REQUEST;
56+
import static im.turms.server.common.access.client.dto.request.TurmsRequest.KindCase.QUERY_CONVERSATION_SETTINGS_REQUEST;
5457
import static im.turms.server.common.access.client.dto.request.TurmsRequest.KindCase.QUERY_FRIEND_REQUESTS_REQUEST;
5558
import static im.turms.server.common.access.client.dto.request.TurmsRequest.KindCase.QUERY_GROUPS_REQUEST;
5659
import static im.turms.server.common.access.client.dto.request.TurmsRequest.KindCase.QUERY_GROUP_BLOCKED_USER_IDS_REQUEST;
@@ -72,7 +75,9 @@
7275
import static im.turms.server.common.access.client.dto.request.TurmsRequest.KindCase.QUERY_RESOURCE_UPLOAD_INFO_REQUEST;
7376
import static im.turms.server.common.access.client.dto.request.TurmsRequest.KindCase.QUERY_USER_ONLINE_STATUSES_REQUEST;
7477
import static im.turms.server.common.access.client.dto.request.TurmsRequest.KindCase.QUERY_USER_PROFILES_REQUEST;
78+
import static im.turms.server.common.access.client.dto.request.TurmsRequest.KindCase.QUERY_USER_SETTINGS_REQUEST;
7579
import static im.turms.server.common.access.client.dto.request.TurmsRequest.KindCase.UPDATE_CONVERSATION_REQUEST;
80+
import static im.turms.server.common.access.client.dto.request.TurmsRequest.KindCase.UPDATE_CONVERSATION_SETTINGS_REQUEST;
7681
import static im.turms.server.common.access.client.dto.request.TurmsRequest.KindCase.UPDATE_FRIEND_REQUEST_REQUEST;
7782
import static im.turms.server.common.access.client.dto.request.TurmsRequest.KindCase.UPDATE_GROUP_INVITATION_REQUEST;
7883
import static im.turms.server.common.access.client.dto.request.TurmsRequest.KindCase.UPDATE_GROUP_JOIN_QUESTION_REQUEST;
@@ -89,6 +94,7 @@
8994
import static im.turms.server.common.access.client.dto.request.TurmsRequest.KindCase.UPDATE_USER_LOCATION_REQUEST;
9095
import static im.turms.server.common.access.client.dto.request.TurmsRequest.KindCase.UPDATE_USER_ONLINE_STATUS_REQUEST;
9196
import static im.turms.server.common.access.client.dto.request.TurmsRequest.KindCase.UPDATE_USER_REQUEST;
97+
import static im.turms.server.common.access.client.dto.request.TurmsRequest.KindCase.UPDATE_USER_SETTINGS_REQUEST;
9298

9399
/**
94100
* @author James Chen
@@ -104,6 +110,8 @@ public enum PolicyStatementResource {
104110
Set.of(UPDATE_USER_ONLINE_STATUS_REQUEST), Set.of(QUERY_USER_ONLINE_STATUSES_REQUEST)),
105111
USER_PROFILE(Collections.emptySet(), Collections.emptySet(), Collections.emptySet(),
106112
Set.of(QUERY_USER_PROFILES_REQUEST)),
113+
USER_SETTING(Collections.emptySet(), Set.of(DELETE_USER_SETTINGS_REQUEST),
114+
Set.of(UPDATE_USER_SETTINGS_REQUEST), Set.of(QUERY_USER_SETTINGS_REQUEST)),
107115
NEARBY_USER(Collections.emptySet(), Collections.emptySet(), Collections.emptySet(),
108116
Set.of(QUERY_NEARBY_USERS_REQUEST)),
109117
// endregion
@@ -147,6 +155,9 @@ public enum PolicyStatementResource {
147155
// region conversation
148156
CONVERSATION(Collections.emptySet(), Collections.emptySet(),
149157
Set.of(UPDATE_CONVERSATION_REQUEST), Set.of(QUERY_CONVERSATIONS_REQUEST)),
158+
CONVERSATION_SETTING(Collections.emptySet(), Set.of(DELETE_CONVERSATION_SETTINGS_REQUEST),
159+
Set.of(UPDATE_CONVERSATION_SETTINGS_REQUEST),
160+
Set.of(QUERY_CONVERSATION_SETTINGS_REQUEST)),
150161
// endregion
151162
// region typing status
152163
TYPING_STATUS(Collections.emptySet(), Collections.emptySet(),

turms-gateway/src/main/java/im/turms/gateway/domain/session/service/PasswordSessionIdentityAccessManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ public boolean updateGlobalProperties(TurmsProperties properties) {
7070
"Refused an illegal operation that tried to enable the previously disabled password-based identity and access management, "
7171
+ "because "
7272
+ "\"turms.gateway.session.identity-access-management.enabled\" is false, or "
73-
+ "\"turms.gateway.session.identity-access-management.type\" is not \"password\" at startup. "
73+
+ "\"turms.gateway.session.identity-access-management.type\" is not \"password\" on startup. "
7474
+ "To enable it, you need to update the \"turms.gateway.session.identity-access-management.enabled\" setting to true and restart the server");
7575
return false;
7676
} else {

turms-server-common/src/main/java/im/turms/server/common/access/common/ResponseStatusCode.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,12 @@ public enum ResponseStatusCode {
327327
403),
328328
NOT_FRIEND_TO_SEND_TYPING_STATUS(4102, "Only friends can send their typing status", 403),
329329

330+
// Conversation - Setting
331+
NOT_RELATED_USER_TO_UPDATE_PRIVATE_CONVERSATION_SETTING(4200,
332+
"Only the related user can update the private conversation setting", 403),
333+
NOT_GROUP_MEMBER_TO_UPDATE_GROUP_CONVERSATION_SETTING(4201,
334+
"Only the group member can update the group conversation setting", 403),
335+
330336
// Message
331337

332338
// Message - Send

turms-server-common/src/main/java/im/turms/server/common/domain/common/repository/BaseRepository.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,15 @@ public Flux<T> findByIds(Collection<K> ids) {
150150
return mongoClient.findMany(entityClass, filter);
151151
}
152152

153+
public Flux<String> findObjectFieldsById(
154+
K id,
155+
String parentField,
156+
Collection<String> includedFields) {
157+
Filter filter = Filter.newBuilder(1)
158+
.eq(DomainFieldName.ID, id);
159+
return mongoClient.findObjectFields(entityClass, filter, parentField, includedFields);
160+
}
161+
153162
public Flux<ChangeStreamDocument<T>> watch(FullDocument fullDocument) {
154163
return mongoClient.watch(entityClass, fullDocument);
155164
}

turms-server-common/src/main/java/im/turms/server/common/infra/collection/CollectionUtil.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
package im.turms.server.common.infra.collection;
1919

2020
import java.util.ArrayList;
21+
import java.util.BitSet;
2122
import java.util.Collection;
2223
import java.util.Collections;
2324
import java.util.HashMap;
@@ -662,6 +663,14 @@ public static <T> Set<T> union(Collection<Set<T>> collections) {
662663
return set;
663664
}
664665

666+
public static BitSet newBitSet(byte[] bytes) {
667+
BitSet set = new BitSet(bytes.length);
668+
for (byte b : bytes) {
669+
set.set(b);
670+
}
671+
return set;
672+
}
673+
665674
// endregion
666675

667676
}

turms-server-common/src/main/java/im/turms/server/common/infra/property/constant/PasswordType.java renamed to turms-server-common/src/main/java/im/turms/server/common/infra/lang/StringPattern.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@
1515
* limitations under the License.
1616
*/
1717

18-
package im.turms.server.common.infra.property.constant;
18+
package im.turms.server.common.infra.lang;
1919

2020
/**
2121
* @author James Chen
2222
*/
23-
public enum PasswordType {
23+
public enum StringPattern {
2424
NUMERIC,
2525
ALPHABETIC,
2626
ALPHANUMERIC

turms-server-common/src/main/java/im/turms/server/common/infra/lang/StringUtil.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.nio.charset.StandardCharsets;
2323
import java.util.ArrayList;
2424
import java.util.Arrays;
25+
import java.util.BitSet;
2526
import java.util.Collection;
2627
import java.util.Collections;
2728
import java.util.LinkedList;
@@ -750,4 +751,23 @@ public static float findSimilarity(String x, String y) {
750751
return 1.0F - distance / (float) maxLength;
751752
}
752753

754+
public static boolean allCharsInSet(String string, BitSet set) {
755+
byte coder = getCoder(string);
756+
if (LATIN1 == coder) {
757+
byte[] bytes = getBytes(string);
758+
for (byte b : bytes) {
759+
if (!set.get(b)) {
760+
return false;
761+
}
762+
}
763+
return true;
764+
}
765+
int length = string.length();
766+
for (int i = 0; i < length; i++) {
767+
if (!set.get(string.charAt(i))) {
768+
return false;
769+
}
770+
}
771+
return true;
772+
}
753773
}

turms-server-common/src/main/java/im/turms/server/common/infra/property/PropertyConstraints.java

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@
2323
import jakarta.validation.constraints.Size;
2424

2525
import im.turms.server.common.infra.validation.LessThanOrEqualTo;
26+
import im.turms.server.common.infra.validation.MatchesStringPattern;
2627
import im.turms.server.common.infra.validation.ValidCron;
28+
import im.turms.server.common.infra.validation.ValidRegex;
2729

2830
/**
2931
* @author James Chen
@@ -33,23 +35,29 @@ public record PropertyConstraints(
3335
long max,
3436
@Nullable String lessThanOrEqualTo,
3537
@Nullable Size size,
36-
@Nullable ValidCron validCron
38+
@Nullable ValidCron validCron,
39+
@Nullable ValidRegex validRegex,
40+
@Nullable MatchesStringPattern matchesStringPattern
3741
) {
3842

3943
public static final PropertyConstraints NULL =
40-
new PropertyConstraints(Long.MIN_VALUE, Long.MAX_VALUE, null, null, null);
44+
new PropertyConstraints(Long.MIN_VALUE, Long.MAX_VALUE, null, null, null, null, null);
4145

4246
public static PropertyConstraints of(
4347
@Nullable Min min,
4448
@Nullable Max max,
4549
@Nullable LessThanOrEqualTo lessThanOrEqualTo,
4650
@Nullable Size size,
47-
@Nullable ValidCron validCron) {
51+
@Nullable ValidCron validCron,
52+
@Nullable ValidRegex validRegex,
53+
@Nullable MatchesStringPattern matchesStringPattern) {
4854
if (min == null
4955
&& max == null
5056
&& lessThanOrEqualTo == null
5157
&& size == null
52-
&& validCron == null) {
58+
&& validCron == null
59+
&& validRegex == null
60+
&& matchesStringPattern == null) {
5361
return NULL;
5462
}
5563
return new PropertyConstraints(
@@ -63,7 +71,9 @@ public static PropertyConstraints of(
6371
? null
6472
: lessThanOrEqualTo.value(),
6573
size,
66-
validCron);
74+
validCron,
75+
validRegex,
76+
matchesStringPattern);
6777
}
6878

69-
}
79+
}

turms-server-common/src/main/java/im/turms/server/common/infra/property/TurmsPropertiesInspector.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,9 @@
5151
import im.turms.server.common.infra.security.SensitiveProperty;
5252
import im.turms.server.common.infra.serialization.SerializationException;
5353
import im.turms.server.common.infra.validation.LessThanOrEqualTo;
54+
import im.turms.server.common.infra.validation.MatchesStringPattern;
5455
import im.turms.server.common.infra.validation.ValidCron;
56+
import im.turms.server.common.infra.validation.ValidRegex;
5557

5658
import static im.turms.server.common.infra.json.JsonCodecPool.MAPPER;
5759

@@ -163,7 +165,9 @@ private static void collectFieldInfos(
163165
field.getDeclaredAnnotation(Max.class),
164166
field.getDeclaredAnnotation(LessThanOrEqualTo.class),
165167
field.getDeclaredAnnotation(Size.class),
166-
field.getDeclaredAnnotation(ValidCron.class));
168+
field.getDeclaredAnnotation(ValidCron.class),
169+
field.getDeclaredAnnotation(ValidRegex.class),
170+
field.getDeclaredAnnotation(MatchesStringPattern.class));
167171
propertyFieldInfos.add(new PropertyFieldInfo(
168172
field,
169173
VarAccessorFactory.get(field),
@@ -232,4 +236,4 @@ private static String getTypeName(Class<?> type) {
232236
return type.getTypeName();
233237
}
234238

235-
}
239+
}

0 commit comments

Comments
 (0)