Skip to content

Commit f51df5e

Browse files
author
mpv1989
committed
Add user access api calls
* Add ArangoDatabase.getPermissions(String) * Add ArangoCollection.getPermissions(String) * Add ArangoDB.grantDefaultDatabaseAccess(String, Permissions) * Add ArangoDB.grantDefaultCollectionAccess(String, Permissions) * Add ArangoDatabase.grantDefaultCollectionAccess(String, Permissions)
1 parent 9fd22a7 commit f51df5e

16 files changed

+224
-36
lines changed

src/main/java/com/arangodb/ArangoCollection.java

+16
Original file line numberDiff line numberDiff line change
@@ -865,10 +865,26 @@ public void revokeAccess(final String user) throws ArangoDBException {
865865
* Documentation</a>
866866
* @param user
867867
* The name of the user
868+
* @since ArangoDB 3.2.0
868869
* @throws ArangoDBException
869870
*/
870871
public void resetAccess(final String user) throws ArangoDBException {
871872
executor.execute(resetAccessRequest(user), Void.class);
872873
}
873874

875+
/**
876+
* Get the collection access level
877+
*
878+
* @see <a href= "https://docs.arangodb.com/current/HTTP/UserManagement/#get-the-specific-collection-access-level">
879+
* API Documentation</a>
880+
* @param user
881+
* The name of the user
882+
* @return permissions of the user
883+
* @since ArangoDB 3.2.0
884+
* @throws ArangoDBException
885+
*/
886+
public Permissions getPermissions(final String user) throws ArangoDBException {
887+
return executor.execute(getPermissionsRequest(user), getPermissionsResponseDeserialzer());
888+
}
889+
874890
}

src/main/java/com/arangodb/ArangoDB.java

+57-2
Original file line numberDiff line numberDiff line change
@@ -613,11 +613,66 @@ public UserEntity replaceUser(final String user, final UserUpdateOptions options
613613
return executor.execute(replaceUserRequest(db().name(), user, options), UserEntity.class);
614614
}
615615

616-
public void updateUserDefaultDatabaseAccess(final String user, final Permissions permissions) {
616+
/**
617+
* @deprecated use {@link #grantDefaultDatabaseAccess(String, Permissions)} instead
618+
*
619+
* @param user
620+
* The name of the user
621+
* @param permissions
622+
* The permissions the user grant
623+
* @since ArangoDB 3.2.0
624+
* @throws ArangoDBException
625+
*/
626+
@Deprecated
627+
public void updateUserDefaultDatabaseAccess(final String user, final Permissions permissions)
628+
throws ArangoDBException {
617629
executor.execute(updateUserDefaultDatabaseAccessRequest(user, permissions), Void.class);
618630
}
619631

620-
public void updateUserDefaultCollectionAccess(final String user, final Permissions permissions) {
632+
/**
633+
* Sets the default access level for databases for the user <code>user</code>. You need permission to the _system
634+
* database in order to execute this call.
635+
*
636+
* @param user
637+
* The name of the user
638+
* @param permissions
639+
* The permissions the user grant
640+
* @since ArangoDB 3.2.0
641+
* @throws ArangoDBException
642+
*/
643+
public void grantDefaultDatabaseAccess(final String user, final Permissions permissions) throws ArangoDBException {
644+
executor.execute(updateUserDefaultDatabaseAccessRequest(user, permissions), Void.class);
645+
}
646+
647+
/**
648+
* @deprecated user {@link #grantDefaultCollectionAccess(String, Permissions)} instead
649+
*
650+
* @param user
651+
* The name of the user
652+
* @param permissions
653+
* The permissions the user grant
654+
* @since ArangoDB 3.2.0
655+
* @throws ArangoDBException
656+
*/
657+
@Deprecated
658+
public void updateUserDefaultCollectionAccess(final String user, final Permissions permissions)
659+
throws ArangoDBException {
660+
executor.execute(updateUserDefaultCollectionAccessRequest(user, permissions), Void.class);
661+
}
662+
663+
/**
664+
* Sets the default access level for collections for the user <code>user</code>. You need permission to the _system
665+
* database in order to execute this call.
666+
*
667+
* @param user
668+
* The name of the user
669+
* @param permissions
670+
* The permissions the user grant
671+
* @since ArangoDB 3.2.0
672+
* @throws ArangoDBException
673+
*/
674+
public void grantDefaultCollectionAccess(final String user, final Permissions permissions)
675+
throws ArangoDBException {
621676
executor.execute(updateUserDefaultCollectionAccessRequest(user, permissions), Void.class);
622677
}
623678

src/main/java/com/arangodb/ArangoDatabase.java

+50-7
Original file line numberDiff line numberDiff line change
@@ -215,8 +215,8 @@ public Boolean drop() throws ArangoDBException {
215215
}
216216

217217
/**
218-
* Grants or revoke access to the database for user user. You need permission to the _system database in order to
219-
* execute this call.
218+
* Grants or revoke access to the database for user <code>user</code>. You need permission to the _system database
219+
* in order to execute this call.
220220
*
221221
* @see <a href= "https://docs.arangodb.com/current/HTTP/UserManagement/index.html#grant-or-revoke-database-access">
222222
* API Documentation</a>
@@ -231,8 +231,8 @@ public void grantAccess(final String user, final Permissions permissions) throws
231231
}
232232

233233
/**
234-
* Grants access to the database for user user. You need permission to the _system database in order to execute this
235-
* call.
234+
* Grants access to the database for user <code>user</code>. You need permission to the _system database in order to
235+
* execute this call.
236236
*
237237
* @see <a href= "https://docs.arangodb.com/current/HTTP/UserManagement/index.html#grant-or-revoke-database-access">
238238
* API Documentation</a>
@@ -245,8 +245,8 @@ public void grantAccess(final String user) throws ArangoDBException {
245245
}
246246

247247
/**
248-
* Revokes access to the database dbname for user user. You need permission to the _system database in order to
249-
* execute this call.
248+
* Revokes access to the database dbname for user <code>user</code>. You need permission to the _system database in
249+
* order to execute this call.
250250
*
251251
* @see <a href= "https://docs.arangodb.com/current/HTTP/UserManagement/index.html#grant-or-revoke-database-access">
252252
* API Documentation</a>
@@ -265,16 +265,59 @@ public void revokeAccess(final String user) throws ArangoDBException {
265265
* API Documentation</a>
266266
* @param user
267267
* The name of the user
268+
* @since ArangoDB 3.2.0
268269
* @throws ArangoDBException
269270
*/
270271
public void resetAccess(final String user) throws ArangoDBException {
271272
executor.execute(resetAccessRequest(user), Void.class);
272273
}
273274

274-
public void updateUserDefaultCollectionAccess(final String user, final Permissions permissions) {
275+
/**
276+
* Sets the default access level for collections within this database for the user <code>user</code>. You need
277+
* permission to the _system database in order to execute this call.
278+
*
279+
* @param user
280+
* The name of the user
281+
* @param permissions
282+
* The permissions the user grant
283+
* @since ArangoDB 3.2.0
284+
* @throws ArangoDBException
285+
*/
286+
public void grantDefaultCollectionAccess(final String user, final Permissions permissions)
287+
throws ArangoDBException {
288+
executor.execute(updateUserDefaultCollectionAccessRequest(user, permissions), Void.class);
289+
}
290+
291+
/**
292+
* @deprecated use {@link #grantDefaultCollectionAccess(String, Permissions)} instead
293+
* @param user
294+
* The name of the user
295+
* @param permissions
296+
* The permissions the user grant
297+
* @since ArangoDB 3.2.0
298+
* @throws ArangoDBException
299+
*/
300+
@Deprecated
301+
public void updateUserDefaultCollectionAccess(final String user, final Permissions permissions)
302+
throws ArangoDBException {
275303
executor.execute(updateUserDefaultCollectionAccessRequest(user, permissions), Void.class);
276304
}
277305

306+
/**
307+
* Get specific database access level
308+
*
309+
* @see <a href= "https://docs.arangodb.com/current/HTTP/UserManagement/#get-the-database-access-level"> API
310+
* Documentation</a>
311+
* @param user
312+
* The name of the user
313+
* @return permissions of the user
314+
* @since ArangoDB 3.2.0
315+
* @throws ArangoDBException
316+
*/
317+
public Permissions getPermissions(final String user) throws ArangoDBException {
318+
return executor.execute(getPermissionsRequest(user), getPermissionsResponseDeserialzer());
319+
}
320+
278321
/**
279322
* Create a cursor and return the first results
280323
*

src/main/java/com/arangodb/entity/Permissions.java

-5
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,4 @@ public enum Permissions {
3636
RO,
3737
NONE;
3838

39-
@Override
40-
public String toString() {
41-
return super.toString().toLowerCase();
42-
}
43-
4439
}

src/main/java/com/arangodb/internal/InternalArangoCollection.java

+23-2
Original file line numberDiff line numberDiff line change
@@ -685,12 +685,33 @@ protected Request getRevisionRequest() {
685685
protected Request grantAccessRequest(final String user, final Permissions permissions) {
686686
return new Request(ArangoDBConstants.SYSTEM, RequestType.PUT,
687687
executor.createPath(ArangoDBConstants.PATH_API_USER, user, ArangoDBConstants.DATABASE, db.name(), name))
688-
.setBody(
689-
util().serialize(OptionsBuilder.build(new UserAccessOptions(), permissions.toString())));
688+
.setBody(util().serialize(OptionsBuilder.build(new UserAccessOptions(), permissions)));
690689
}
691690

692691
protected Request resetAccessRequest(final String user) {
693692
return new Request(ArangoDBConstants.SYSTEM, RequestType.DELETE, executor
694693
.createPath(ArangoDBConstants.PATH_API_USER, user, ArangoDBConstants.DATABASE, db.name(), name));
695694
}
695+
696+
protected Request getPermissionsRequest(final String user) {
697+
return new Request(ArangoDBConstants.SYSTEM, RequestType.GET, executor
698+
.createPath(ArangoDBConstants.PATH_API_USER, user, ArangoDBConstants.DATABASE, db.name(), name));
699+
}
700+
701+
protected ResponseDeserializer<Permissions> getPermissionsResponseDeserialzer() {
702+
return new ResponseDeserializer<Permissions>() {
703+
@Override
704+
public Permissions deserialize(final Response response) throws VPackException {
705+
final VPackSlice body = response.getBody();
706+
if (body != null) {
707+
final VPackSlice result = body.get(ArangoDBConstants.RESULT);
708+
if (!result.isNone()) {
709+
return util().deserialize(result, Permissions.class);
710+
}
711+
}
712+
return null;
713+
}
714+
};
715+
}
716+
696717
}

src/main/java/com/arangodb/internal/InternalArangoDB.java

+3-4
Original file line numberDiff line numberDiff line change
@@ -256,15 +256,14 @@ protected Request replaceUserRequest(final String database, final String user, f
256256

257257
protected Request updateUserDefaultDatabaseAccessRequest(final String user, final Permissions permissions) {
258258
return new Request(ArangoDBConstants.SYSTEM, RequestType.PUT,
259-
executor.createPath(ArangoDBConstants.PATH_API_USER, user, ArangoDBConstants.DATABASE, "*")).setBody(
260-
util().serialize(OptionsBuilder.build(new UserAccessOptions(), permissions.toString())));
259+
executor.createPath(ArangoDBConstants.PATH_API_USER, user, ArangoDBConstants.DATABASE, "*"))
260+
.setBody(util().serialize(OptionsBuilder.build(new UserAccessOptions(), permissions)));
261261
}
262262

263263
protected Request updateUserDefaultCollectionAccessRequest(final String user, final Permissions permissions) {
264264
return new Request(ArangoDBConstants.SYSTEM, RequestType.PUT,
265265
executor.createPath(ArangoDBConstants.PATH_API_USER, user, ArangoDBConstants.DATABASE, "*", "*"))
266-
.setBody(
267-
util().serialize(OptionsBuilder.build(new UserAccessOptions(), permissions.toString())));
266+
.setBody(util().serialize(OptionsBuilder.build(new UserAccessOptions(), permissions)));
268267
}
269268

270269
protected Request getLogsRequest(final LogOptions options) {

src/main/java/com/arangodb/internal/InternalArangoDatabase.java

+24-4
Original file line numberDiff line numberDiff line change
@@ -134,8 +134,8 @@ public Boolean deserialize(final Response response) throws VPackException {
134134

135135
protected Request grantAccessRequest(final String user, final Permissions permissions) {
136136
return new Request(ArangoDBConstants.SYSTEM, RequestType.PUT,
137-
executor.createPath(ArangoDBConstants.PATH_API_USER, user, ArangoDBConstants.DATABASE, name)).setBody(
138-
util().serialize(OptionsBuilder.build(new UserAccessOptions(), permissions.toString())));
137+
executor.createPath(ArangoDBConstants.PATH_API_USER, user, ArangoDBConstants.DATABASE, name))
138+
.setBody(util().serialize(OptionsBuilder.build(new UserAccessOptions(), permissions)));
139139
}
140140

141141
protected Request resetAccessRequest(final String user) {
@@ -146,8 +146,28 @@ protected Request resetAccessRequest(final String user) {
146146
protected Request updateUserDefaultCollectionAccessRequest(final String user, final Permissions permissions) {
147147
return new Request(ArangoDBConstants.SYSTEM, RequestType.PUT,
148148
executor.createPath(ArangoDBConstants.PATH_API_USER, user, ArangoDBConstants.DATABASE, name, "*"))
149-
.setBody(
150-
util().serialize(OptionsBuilder.build(new UserAccessOptions(), permissions.toString())));
149+
.setBody(util().serialize(OptionsBuilder.build(new UserAccessOptions(), permissions)));
150+
}
151+
152+
protected Request getPermissionsRequest(final String user) {
153+
return new Request(ArangoDBConstants.SYSTEM, RequestType.GET,
154+
executor.createPath(ArangoDBConstants.PATH_API_USER, user, ArangoDBConstants.DATABASE, name));
155+
}
156+
157+
protected ResponseDeserializer<Permissions> getPermissionsResponseDeserialzer() {
158+
return new ResponseDeserializer<Permissions>() {
159+
@Override
160+
public Permissions deserialize(final Response response) throws VPackException {
161+
final VPackSlice body = response.getBody();
162+
if (body != null) {
163+
final VPackSlice result = body.get(ArangoDBConstants.RESULT);
164+
if (!result.isNone()) {
165+
return util().deserialize(result, Permissions.class);
166+
}
167+
}
168+
return null;
169+
}
170+
};
151171
}
152172

153173
protected Request queryRequest(

src/main/java/com/arangodb/internal/velocypack/VPackDeserializers.java

+11
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import com.arangodb.entity.CollectionStatus;
3636
import com.arangodb.entity.CollectionType;
3737
import com.arangodb.entity.LogLevel;
38+
import com.arangodb.entity.Permissions;
3839
import com.arangodb.velocypack.VPackDeserializationContext;
3940
import com.arangodb.velocypack.VPackDeserializer;
4041
import com.arangodb.velocypack.VPackSlice;
@@ -142,4 +143,14 @@ public License deserialize(
142143
return License.valueOf(vpack.getAsString().toUpperCase());
143144
}
144145
};
146+
147+
public static final VPackDeserializer<Permissions> PERMISSIONS = new VPackDeserializer<Permissions>() {
148+
@Override
149+
public Permissions deserialize(
150+
final VPackSlice parent,
151+
final VPackSlice vpack,
152+
final VPackDeserializationContext context) throws VPackException {
153+
return Permissions.valueOf(vpack.getAsString().toUpperCase());
154+
}
155+
};
145156
}

src/main/java/com/arangodb/internal/velocypack/VPackDriverModule.java

+3
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import com.arangodb.entity.CollectionType;
3131
import com.arangodb.entity.DocumentField;
3232
import com.arangodb.entity.LogLevel;
33+
import com.arangodb.entity.Permissions;
3334
import com.arangodb.entity.QueryEntity;
3435
import com.arangodb.internal.velocystream.internal.AuthenticationRequest;
3536
import com.arangodb.model.TraversalOptions;
@@ -66,6 +67,7 @@ public String translateName(final Field field) {
6667
context.registerSerializer(BaseEdgeDocument.class, VPackSerializers.BASE_EDGE_DOCUMENT);
6768
context.registerSerializer(TraversalOptions.Order.class, VPackSerializers.TRAVERSAL_ORDER);
6869
context.registerSerializer(LogLevel.class, VPackSerializers.LOG_LEVEL);
70+
context.registerSerializer(Permissions.class, VPackSerializers.PERMISSIONS);
6971

7072
context.registerDeserializer(Response.class, VPackDeserializers.RESPONSE);
7173
context.registerDeserializer(CollectionType.class, VPackDeserializers.COLLECTION_TYPE);
@@ -75,6 +77,7 @@ public String translateName(final Field field) {
7577
context.registerDeserializer(QueryEntity.PROPERTY_STARTED, Date.class, VPackDeserializers.DATE_STRING);
7678
context.registerDeserializer(LogLevel.class, VPackDeserializers.LOG_LEVEL);
7779
context.registerDeserializer(ArangoDBVersion.License.class, VPackDeserializers.LICENSE);
80+
context.registerDeserializer(Permissions.class, VPackDeserializers.PERMISSIONS);
7881
}
7982

8083
@Override

src/main/java/com/arangodb/internal/velocypack/VPackSerializers.java

+12
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import com.arangodb.entity.CollectionType;
3030
import com.arangodb.entity.DocumentField;
3131
import com.arangodb.entity.LogLevel;
32+
import com.arangodb.entity.Permissions;
3233
import com.arangodb.internal.velocystream.internal.AuthenticationRequest;
3334
import com.arangodb.model.TraversalOptions;
3435
import com.arangodb.model.TraversalOptions.Order;
@@ -159,4 +160,15 @@ public void serialize(
159160
builder.add(attribute, value.getLevel());
160161
}
161162
};
163+
164+
public static final VPackSerializer<Permissions> PERMISSIONS = new VPackSerializer<Permissions>() {
165+
@Override
166+
public void serialize(
167+
final VPackBuilder builder,
168+
final String attribute,
169+
final Permissions value,
170+
final VPackSerializationContext context) throws VPackException {
171+
builder.add(attribute, value.toString().toLowerCase());
172+
}
173+
};
162174
}

src/main/java/com/arangodb/model/OptionsBuilder.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import java.util.Map;
2525

2626
import com.arangodb.entity.EdgeDefinition;
27+
import com.arangodb.entity.Permissions;
2728

2829
/**
2930
* @author Mark Vollmary
@@ -100,7 +101,7 @@ public static DBCreateOptions build(final DBCreateOptions options, final String
100101
return options.name(name);
101102
}
102103

103-
public static UserAccessOptions build(final UserAccessOptions options, final String grant) {
104+
public static UserAccessOptions build(final UserAccessOptions options, final Permissions grant) {
104105
return options.grant(grant);
105106
}
106107

0 commit comments

Comments
 (0)