-
Notifications
You must be signed in to change notification settings - Fork 28
Expand file tree
/
Copy pathAssetsValidation.java
More file actions
141 lines (121 loc) · 5.15 KB
/
Copy pathAssetsValidation.java
File metadata and controls
141 lines (121 loc) · 5.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
package com.platform.assets;
public class AssetsValidation {
private final static int MAX_NAME_LENGTH = 30;
public final int MAX_IPFSHASH_LENGTH = 46;
public final static String ROOT_NAME_CHARACTERS = "^[A-Z0-9._]{3,}$";
private final static String SUB_NAME_CHARACTERS = "^[A-Z0-9._]+$";
private final static String UNIQUE_TAG_CHARACTERS = "^[-A-Za-z0-9@$%&*()[\\\\]{}_.?:]+$";
private final static String MSG_CHANNEL_TAG_CHARACTERS = "^[A-Za-z0-9_]+$";
private final static String DOUBLE_PUNCTUATION = "^.*[._]{2,}.*$";
private final static String LEADING_PUNCTUATION = "^[._].*$";
private final static String TRAILING_PUNCTUATION = "^.*[._]$";
public final static String SUB_NAME_DELIMITER = "/";
public final static String UNIQUE_TAG_DELIMITER = "#";
private final static String MSG_CHANNEL_TAG_DELIMITER = "~";
private final static String UNIQUE_INDICATOR = "^[^^~#!]+#[^~#!\\/]+$";
private final static String MSG_CHANNEL_INDICATOR = "^[^^~#!]+~[^~#!\\/]+$";
private final static String OWNER_INDICATOR = "^[^^~#!]+!$";
private final static String RAVEN_NAMES = "^RVN|^RAVEN|^RAVENCOIN|^RAVENC0IN|^RAVENCO1N|^RAVENC01N";
private static boolean isRootNameValid(final String name) {
return name.matches(ROOT_NAME_CHARACTERS) &&
!name.matches(DOUBLE_PUNCTUATION) &&
!name.matches(LEADING_PUNCTUATION) &&
!name.matches(TRAILING_PUNCTUATION) &&
!name.matches(RAVEN_NAMES);
}
private static boolean isSubNameValid(final String name) {
return name.matches(SUB_NAME_CHARACTERS) &&
!name.matches(DOUBLE_PUNCTUATION) &&
!name.matches(LEADING_PUNCTUATION) &&
!name.matches(TRAILING_PUNCTUATION);
}
private static boolean isUniqueTagValid(final String tag) {
return tag.matches(UNIQUE_TAG_CHARACTERS);
}
private static boolean isChannelTagValid(final String tag) {
return tag.matches(MSG_CHANNEL_TAG_CHARACTERS) &&
tag.matches(DOUBLE_PUNCTUATION) &&
tag.matches(LEADING_PUNCTUATION) &&
tag.matches(TRAILING_PUNCTUATION);
}
private static boolean isNameValidBeforeTag(final String name) {
String[] parts = name.split(SUB_NAME_DELIMITER,-1);
if (parts.length > 0 && !isRootNameValid(parts[0])) {
return false;
}
if (parts.length > 1) {
for (int i = 1; i < parts.length; i++) {
if (!isSubNameValid(parts[i])) {
return false;
}
}
}
return true;
}
private static boolean isAssetNameASubasset(final String name) {
String[] parts = name.split(SUB_NAME_DELIMITER,-1);
if (parts.length > 0 && !isRootNameValid(parts[0])) {
return false;
}
return parts.length > 1;
}
public static boolean isAssetNameValid(final String name, AssetType assetType) {
assetType = AssetType.INVALID;
if (name.matches(UNIQUE_INDICATOR)) {
if (name.length() > MAX_NAME_LENGTH) {
return false;
}
String[] parts = name.split(UNIQUE_TAG_DELIMITER,-1);
if (parts.length > 0) {
int lastItemIndex = parts.length - 1;
boolean valid = isNameValidBeforeTag(parts[0]) && isUniqueTagValid(parts[lastItemIndex]);
if (!valid) {
return false;
}
}
assetType = AssetType.UNIQUE;
return true;
} else if (name.matches(MSG_CHANNEL_INDICATOR)) {
if (name.length() > MAX_NAME_LENGTH) {
return false;
}
String[] parts = name.split(MSG_CHANNEL_TAG_DELIMITER,-1);
if (parts.length > 0) {
int lastItemIndex = parts.length - 1;
boolean valid = isNameValidBeforeTag(parts[0]) && isChannelTagValid(parts[lastItemIndex]);
if (!valid) {
return false;
}
}
assetType = AssetType.CHANNEL;
return true;
} else if (name.matches(OWNER_INDICATOR)) {
if (name.length() > MAX_NAME_LENGTH + 1) {
return false;
}
boolean valid = isNameValidBeforeTag(name.substring(0, name.length() - 1));
if (!valid) {
return false;
}
assetType = AssetType.OWNER;
return true;
} else {
if (name.length() > MAX_NAME_LENGTH) {
return false;
}
boolean valid = isNameValidBeforeTag(name);
if (!valid) {
return false;
}
assetType = isAssetNameASubasset(name) ? AssetType.SUB : AssetType.ROOT;
return true;
}
}
public static boolean isAssetNameValid(final String name) {
AssetType assetType = null;
return isAssetNameValid(name, assetType);
}
public static boolean isAssetNameAnOwner(final String name) {
return isAssetNameValid(name) && name.matches(OWNER_INDICATOR);
}
}