diff --git a/.gitignore b/.gitignore index 0e13eeb..5d459b2 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,8 @@ buildNumber.properties .mvn/timing.properties # https://github.com/takari/maven-wrapper#usage-without-binary-jar .mvn/wrapper/maven-wrapper.jar + +# Intellij +.idea +# Intellij recommends to share iml files, however, better don't share files which might be outdated +*.iml \ No newline at end of file diff --git a/doc/design.md b/doc/design.md index 343d714..06f1b6b 100644 --- a/doc/design.md +++ b/doc/design.md @@ -40,6 +40,28 @@ This section describes the runtime behavior of the software. ## Creating Database Objects +### Creating Database Users +`dsn~creating-database-users~1` + +Users can create database users by providing a username and a password. + +Covers: + +* `req~creating-users~1` + +Needs: impl, utest, itest + +### Granting System Privileges to Database Users +`dsn~granting-system-privileges-to-database-users~1` + +Users can select and grant System Privileges to created database users from the list of supported System Privileges. + +Covers: + +* `req~granting-system-privileges-to-users~1` + +Needs: impl, utest, itest + ### Creating Scripts `dsn~creating-scripts~1` diff --git a/doc/system_requirements.md b/doc/system_requirements.md index b4433d0..2b28d73 100644 --- a/doc/system_requirements.md +++ b/doc/system_requirements.md @@ -73,6 +73,28 @@ In this section lists functional requirements from the user's perspective. The r ### Creating Database Objects +#### Creating Users +`req~creating-users~1` + +Users can create database users through TDDB. + +Covers: + +* [feat~creating-database-objects~1](#creating-database-objects) + +Needs: dsn + +### Granting System Privileges to Users +`req~granting-system-privileges-to-users~1` + +Users can grant System Privileges to created database users. + +Covers: + +* [feat~creating-database-objects~1](#creating-database-objects) + +Needs: dsn + #### Creating Scripts `req~creating-scripts~1` diff --git a/src/main/java/com/exasol/dbbuilder/ExasolObjectFactory.java b/src/main/java/com/exasol/dbbuilder/ExasolObjectFactory.java index 996e831..cfdd9b0 100644 --- a/src/main/java/com/exasol/dbbuilder/ExasolObjectFactory.java +++ b/src/main/java/com/exasol/dbbuilder/ExasolObjectFactory.java @@ -38,6 +38,7 @@ public Schema createSchema(final String name) { } @Override + // [impl->dsn~creating-database-users~1] public User createUser(final String name) { return new User(this.writer, name); } diff --git a/src/main/java/com/exasol/dbbuilder/SystemPrivilege.java b/src/main/java/com/exasol/dbbuilder/SystemPrivilege.java index cf798d2..6eeabdc 100644 --- a/src/main/java/com/exasol/dbbuilder/SystemPrivilege.java +++ b/src/main/java/com/exasol/dbbuilder/SystemPrivilege.java @@ -4,7 +4,15 @@ * Privilege as used in a {@code GRANT}. */ public enum SystemPrivilege { - CREATE_SESSION, KILL_ANY_SESSION; + GRANT_ANY_OBJECT_PRIVILEGE, GRANT_ANY_PRIVILEGE, GRANT_ANY_PRIORITY_GROUP, MANAGE_PRIORITY_GROUPS, CREATE_SESSION, + KILL_ANY_SESSION, ALTER_SYSTEM, IMPORT, EXPORT, CREATE_USER, ALTER_USER, DROP_USER, IMPERSONATE_ANY_USER, + CREATE_ROLE, DROP_ANY_ROLE, GRANT_ANY_ROLE, CREATE_CONNECTION, ALTER_ANY_CONNECTION, DROP_ANY_CONNECTION, + GRANT_ANY_CONNECTION, USE_ANY_CONNECTION, ACCESS_ANY_CONNECTION, CREATE_SCHEMA, ALTER_ANY_SCHEMA, DROP_ANY_SCHEMA, + CREATE_VIRTUAL_SCHEMA, ALTER_ANY_VIRTUAL_SCHEMA, ALTER_ANY_VIRTUAL_SCHEMA_REFRESH, DROP_ANY_VIRTUAL_SCHEMA, + CREATE_TABLE, CREATE_ANY_TABLE, ALTER_ANY_TABLE, DELETE_ANY_TABLE, DROP_ANY_TABLE, INSERT_ANY_TABLE, + SELECT_ANY_TABLE, SELECT_ANY_DICTIONARY, UPDATE_ANY_TABLE, CREATE_VIEW, CREATE_ANY_VIEW, DROP_ANY_VIEW, + CREATE_FUNCTION, CREATE_ANY_FUNCTION, DROP_ANY_FUNCTION, EXECUTE_ANY_FUNCTION, CREATE_SCRIPT, CREATE_ANY_SCRIPT, + DROP_ANY_SCRIPT, EXECUTE_ANY_SCRIPT; @Override public String toString() { diff --git a/src/main/java/com/exasol/dbbuilder/User.java b/src/main/java/com/exasol/dbbuilder/User.java index 13dc4aa..a342c92 100644 --- a/src/main/java/com/exasol/dbbuilder/User.java +++ b/src/main/java/com/exasol/dbbuilder/User.java @@ -118,6 +118,7 @@ public User grant(final DatabaseObject object, final ObjectPrivilege... privileg * @param privileges system privileges * @return {@link User} instance for fluent programming */ + // [impl->dsn~granting-system-privileges-to-database-users~1] public User grant(final SystemPrivilege... privileges) { this.systemPrivileges.addAll(Set.of(privileges)); this.writer.write(this, privileges); diff --git a/src/test/java/com/exasol/dbbuilder/DatabaseObjectCreationIT.java b/src/test/java/com/exasol/dbbuilder/DatabaseObjectCreationIT.java index c988559..a252aef 100644 --- a/src/test/java/com/exasol/dbbuilder/DatabaseObjectCreationIT.java +++ b/src/test/java/com/exasol/dbbuilder/DatabaseObjectCreationIT.java @@ -196,11 +196,13 @@ void testCreateTable() { } @Test + // [itest->dsn~creating-database-users~1] void testCreateUser() { assertObjectExistsInDatabase(this.factory.createUser("THE_USER")); } @Test + // [itest->dsn~creating-database-users~1] void testCreateLoginUser() throws SQLException { final User user = this.factory.createLoginUser("LOGIN_USER"); try (final Connection connection = container.createConnectionForUser(user.getName(), user.getPassword())) { @@ -209,6 +211,7 @@ void testCreateLoginUser() throws SQLException { } @Test + // [itest->dsn~creating-database-users~1] void testCreateLoginUserWithPassword() throws SQLException { final User user = this.factory.createLoginUser("LOGIN_USER_WITH_PASSWORD", "THE_PASSWORD"); try (final Connection connection = container.createConnectionForUser(user.getName(), user.getPassword())) { @@ -228,6 +231,7 @@ void testCreateVirtualSchema() { } @Test + // [itest->dsn~granting-system-privileges-to-database-users~1] void testGrantSystemPrivilegeToUser() { final User user = this.factory.createUser("SYSPRIVUSER").grant(CREATE_SESSION, KILL_ANY_SESSION); assertAll(() -> assertUserHasSystemPrivilege(user, CREATE_SESSION), diff --git a/src/test/java/com/exasol/dbbuilder/UserTest.java b/src/test/java/com/exasol/dbbuilder/UserTest.java index e2f5408..10e4608 100644 --- a/src/test/java/com/exasol/dbbuilder/UserTest.java +++ b/src/test/java/com/exasol/dbbuilder/UserTest.java @@ -13,6 +13,7 @@ import com.exasol.dbbuilder.objectwriter.DatabaseObjectWriter; +// [utest->dsn~creating-database-users~1] @ExtendWith(MockitoExtension.class) class UserTest { @Mock @@ -57,6 +58,7 @@ void testGetObjectPrivileges(@Mock final DatabaseObject objectMock) { } @Test + // [utest->dsn~granting-system-privileges-to-database-users~1] void testGetSystemPrivileges() { final User user = new User(this.writerMock, "SYTEMUSER") // .grant(SystemPrivilege.CREATE_SESSION);