diff --git a/briar-headless/README.md b/briar-headless/README.md index a27d9dc3d39fefb792dbb229e00abc407550fe94..d35bcc98eebb208d05d55b647aa02454f941d56d 100644 --- a/briar-headless/README.md +++ b/briar-headless/README.md @@ -72,9 +72,16 @@ Returns a JSON array of contacts: The only workaround is to add a contact to the Briar app running on a rooted Android phone and then move its database (and key files) to the headless peer. +### Removing a contact + +`DELETE /v1/contacts/{contactId}` + +The `{contactId}` is the `contactId` of the contact (`1` in the example above). +It returns with a status code `200`, if removal was successful. + ### Listing all private messages -`GET /messages/{contactId}` +`GET /v1/messages/{contactId}` The `{contactId}` is the `contactId` of the contact (`1` in the example above). It returns a JSON array of private messages: @@ -100,7 +107,7 @@ Attention: There can messages of other `type`s where the message `text` is `null ### Writing a private message -`POST /messages/{contactId}` +`POST /v1/messages/{contactId}` The text of the message should be posted as JSON: diff --git a/briar-headless/build.gradle b/briar-headless/build.gradle index eae48965ff60fa61b0e31a172cf0ec67ecb065d6..332f3026daf42e80f3ba513de5bcd9a373a76d69 100644 --- a/briar-headless/build.gradle +++ b/briar-headless/build.gradle @@ -1,8 +1,8 @@ plugins { id 'java' id 'idea' - id 'org.jetbrains.kotlin.jvm' version '1.2.70' - id 'org.jetbrains.kotlin.kapt' version '1.2.70' + id 'org.jetbrains.kotlin.jvm' version '1.2.71' + id 'org.jetbrains.kotlin.kapt' version '1.2.71' id 'witness' } apply from: 'witness.gradle' @@ -14,9 +14,9 @@ dependencies { implementation project(path: ':briar-core', configuration: 'default') implementation project(path: ':bramble-java', configuration: 'default') - implementation 'io.javalin:javalin:2.2.0' + implementation 'io.javalin:javalin:2.3.0' implementation 'org.slf4j:slf4j-simple:1.7.25' - implementation 'com.fasterxml.jackson.core:jackson-databind:2.9.6' + implementation 'com.fasterxml.jackson.core:jackson-databind:2.9.7' implementation 'com.github.ajalt:clikt:1.5.0' kapt 'com.google.dagger:dagger-compiler:2.0.2' @@ -24,11 +24,11 @@ dependencies { testImplementation project(path: ':bramble-api', configuration: 'testOutput') testImplementation project(path: ':bramble-core', configuration: 'testOutput') - def junitVersion = '5.2.0' + def junitVersion = '5.3.1' testImplementation "org.junit.jupiter:junit-jupiter-api:$junitVersion" testImplementation "org.junit.jupiter:junit-jupiter-params:$junitVersion" testRuntime "org.junit.jupiter:junit-jupiter-engine:$junitVersion" - testImplementation "io.mockk:mockk:1.8.6" + testImplementation "io.mockk:mockk:1.8.9" testImplementation "org.skyscreamer:jsonassert:1.5.0" } diff --git a/briar-headless/src/main/java/org/briarproject/briar/headless/Router.kt b/briar-headless/src/main/java/org/briarproject/briar/headless/Router.kt index 7e8000ce481f195362b05f96577393385b7e1a80..c155fcfd9a6bb88076ee51256ce38433b6ba2e07 100644 --- a/briar-headless/src/main/java/org/briarproject/briar/headless/Router.kt +++ b/briar-headless/src/main/java/org/briarproject/briar/headless/Router.kt @@ -7,9 +7,11 @@ import io.javalin.Context import io.javalin.Javalin import io.javalin.JavalinEvent.SERVER_START_FAILED import io.javalin.JavalinEvent.SERVER_STOPPED +import io.javalin.NotFoundResponse import io.javalin.apibuilder.ApiBuilder.* import io.javalin.core.util.ContextUtil import io.javalin.core.util.Header.AUTHORIZATION +import org.briarproject.bramble.api.contact.ContactId import org.briarproject.briar.headless.blogs.BlogController import org.briarproject.briar.headless.contact.ContactController import org.briarproject.briar.headless.event.WebSocketController @@ -63,6 +65,9 @@ constructor( path("/v1") { path("/contacts") { get { ctx -> contactController.list(ctx) } + path("/:contactId") { + delete { ctx -> contactController.delete(ctx) } + } } path("/messages/:contactId") { get { ctx -> messagingController.list(ctx) } @@ -112,6 +117,21 @@ constructor( } +/** + * Returns a [ContactId] from the "contactId" path parameter. + * + * @throws NotFoundResponse when contactId is not a number. + */ +fun Context.getContactIdFromPathParam(): ContactId { + val contactString = pathParam("contactId") + val contactInt = try { + Integer.parseInt(contactString) + } catch (e: NumberFormatException) { + throw NotFoundResponse() + } + return ContactId(contactInt) +} + /** * Returns a String from the JSON field or throws [BadRequestResponse] if null or empty. */ diff --git a/briar-headless/src/main/java/org/briarproject/briar/headless/contact/ContactController.kt b/briar-headless/src/main/java/org/briarproject/briar/headless/contact/ContactController.kt index 9eb21a12047c1cb4bef4a8f5f92c3ad881c33448..d7a0bfbc4c62e5009f664a384ed55d59917bd1af 100644 --- a/briar-headless/src/main/java/org/briarproject/briar/headless/contact/ContactController.kt +++ b/briar-headless/src/main/java/org/briarproject/briar/headless/contact/ContactController.kt @@ -5,5 +5,6 @@ import io.javalin.Context interface ContactController { fun list(ctx: Context): Context + fun delete(ctx: Context): Context } diff --git a/briar-headless/src/main/java/org/briarproject/briar/headless/contact/ContactControllerImpl.kt b/briar-headless/src/main/java/org/briarproject/briar/headless/contact/ContactControllerImpl.kt index bf94c70a562b3a8a75176ef8660006643fb75cb3..89f4c07893cf0e6acdafe10863152910ff7324b5 100644 --- a/briar-headless/src/main/java/org/briarproject/briar/headless/contact/ContactControllerImpl.kt +++ b/briar-headless/src/main/java/org/briarproject/briar/headless/contact/ContactControllerImpl.kt @@ -1,7 +1,10 @@ package org.briarproject.briar.headless.contact import io.javalin.Context +import io.javalin.NotFoundResponse import org.briarproject.bramble.api.contact.ContactManager +import org.briarproject.bramble.api.db.NoSuchContactException +import org.briarproject.briar.headless.getContactIdFromPathParam import javax.annotation.concurrent.Immutable import javax.inject.Inject import javax.inject.Singleton @@ -19,4 +22,14 @@ constructor(private val contactManager: ContactManager) : ContactController { return ctx.json(contacts) } + override fun delete(ctx: Context): Context { + val contactId = ctx.getContactIdFromPathParam() + try { + contactManager.removeContact(contactId) + } catch (e: NoSuchContactException) { + throw NotFoundResponse() + } + return ctx + } + } diff --git a/briar-headless/src/main/java/org/briarproject/briar/headless/messaging/MessagingControllerImpl.kt b/briar-headless/src/main/java/org/briarproject/briar/headless/messaging/MessagingControllerImpl.kt index 66d951aa8cb8a68dfe9c7d523adac9e85534828d..0521666f97981df63a92174e3aa3f77977ab7498 100644 --- a/briar-headless/src/main/java/org/briarproject/briar/headless/messaging/MessagingControllerImpl.kt +++ b/briar-headless/src/main/java/org/briarproject/briar/headless/messaging/MessagingControllerImpl.kt @@ -26,6 +26,7 @@ import org.briarproject.briar.api.privategroup.invitation.GroupInvitationRequest import org.briarproject.briar.api.privategroup.invitation.GroupInvitationResponse import org.briarproject.briar.headless.event.WebSocketController import org.briarproject.briar.headless.event.output +import org.briarproject.briar.headless.getContactIdFromPathParam import org.briarproject.briar.headless.getFromJson import org.briarproject.briar.headless.json.JsonDict import java.util.concurrent.Executor @@ -84,13 +85,7 @@ constructor( } private fun getContact(ctx: Context): Contact { - val contactString = ctx.pathParam("contactId") - val contactInt = try { - Integer.parseInt(contactString) - } catch (e: NumberFormatException) { - throw NotFoundResponse() - } - val contactId = ContactId(contactInt) + val contactId = ctx.getContactIdFromPathParam() return try { contactManager.getContact(contactId) } catch (e: NoSuchContactException) { diff --git a/briar-headless/src/test/java/org/briarproject/briar/headless/contact/ContactControllerTest.kt b/briar-headless/src/test/java/org/briarproject/briar/headless/contact/ContactControllerTest.kt index 7566c98421274b61a670faf0385cf9f40385c6d5..428b9aaa22f07094911e98f88862dec2aa539872 100644 --- a/briar-headless/src/test/java/org/briarproject/briar/headless/contact/ContactControllerTest.kt +++ b/briar-headless/src/test/java/org/briarproject/briar/headless/contact/ContactControllerTest.kt @@ -1,10 +1,16 @@ package org.briarproject.briar.headless.contact +import io.javalin.NotFoundResponse import io.javalin.json.JavalinJson.toJson +import io.mockk.Runs import io.mockk.every +import io.mockk.just import org.briarproject.bramble.api.contact.Contact +import org.briarproject.bramble.api.contact.ContactId +import org.briarproject.bramble.api.db.NoSuchContactException import org.briarproject.bramble.identity.output import org.briarproject.briar.headless.ControllerTest +import org.junit.jupiter.api.Assertions.assertThrows import org.junit.jupiter.api.Test internal class ContactControllerTest : ControllerTest() { @@ -25,6 +31,30 @@ internal class ContactControllerTest : ControllerTest() { controller.list(ctx) } + @Test + fun testDelete() { + every { ctx.pathParam("contactId") } returns "1" + every { contactManager.removeContact(ContactId(1)) } just Runs + controller.delete(ctx) + } + + @Test + fun testDeleteInvalidContactId() { + every { ctx.pathParam("contactId") } returns "foo" + assertThrows(NotFoundResponse::class.java) { + controller.delete(ctx) + } + } + + @Test + fun testDeleteNonexistentContactId() { + every { ctx.pathParam("contactId") } returns "1" + every { contactManager.removeContact(ContactId(1)) } throws NoSuchContactException() + assertThrows(NotFoundResponse::class.java) { + controller.delete(ctx) + } + } + @Test fun testOutputContact() { val json = """ diff --git a/briar-headless/witness.gradle b/briar-headless/witness.gradle index 4524a116c5974b512ee0fcac3863e9b37230f553..177a5a0c275694ef56821e03fbafd04f9fed49ab 100644 --- a/briar-headless/witness.gradle +++ b/briar-headless/witness.gradle @@ -1,26 +1,26 @@ dependencyVerification { verify = [ 'com.fasterxml.jackson.core:jackson-annotations:2.9.0:jackson-annotations-2.9.0.jar:45d32ac61ef8a744b464c54c2b3414be571016dd46bfc2bec226761cf7ae457a', - 'com.fasterxml.jackson.core:jackson-core:2.9.6:jackson-core-2.9.6.jar:fab8746aedd6427788ee390ea04d438ec141bff7eb3476f8bdd5d9110fb2718a', - 'com.fasterxml.jackson.core:jackson-databind:2.9.6:jackson-databind-2.9.6.jar:657e3e979446d61f88432b9c50f0ccd9c1fe4f1c822d533f5572e4c0d172a125', + 'com.fasterxml.jackson.core:jackson-core:2.9.7:jackson-core-2.9.7.jar:9e5bc0efabd9f0cac5c1fdd9ae35b16332ed22a0ee19a356de370a18a8cb6c84', + 'com.fasterxml.jackson.core:jackson-databind:2.9.7:jackson-databind-2.9.7.jar:675376decfc070b039d2be773a97002f1ee1e1346d95bd99feee0d56683a92bf', 'com.github.ajalt:clikt:1.5.0:clikt-1.5.0.jar:f13ab614cb0372229f6bb1e19aa98ee6f4ac96f253d0e72d482ee4f5fd2a13a9', 'com.google.dagger:dagger-compiler:2.0.2:dagger-compiler-2.0.2.jar:b74bc9de063dd4c6400b232231f2ef5056145b8fbecbf5382012007dd1c071b3', 'com.google.dagger:dagger-producers:2.0-beta:dagger-producers-2.0-beta.jar:99ec15e8a0507ba569e7655bc1165ee5e5ca5aa914b3c8f7e2c2458f724edd6b', 'com.google.dagger:dagger:2.0.2:dagger-2.0.2.jar:84c0282ed8be73a29e0475d639da030b55dee72369e58dd35ae7d4fe6243dcf9', 'com.google.guava:guava:18.0:guava-18.0.jar:d664fbfc03d2e5ce9cab2a44fb01f1d0bf9dfebeccc1a473b1f9ea31f79f6f99', 'com.vaadin.external.google:android-json:0.0.20131108.vaadin1:android-json-0.0.20131108.vaadin1.jar:dfb7bae2f404cfe0b72b4d23944698cb716b7665171812a0a4d0f5926c0fac79', - 'io.javalin:javalin:2.2.0:javalin-2.2.0.jar:f7298fa281400559e92f000477a631c75aca9e01776962fd4b392fdb3b714190', - 'io.mockk:mockk-agent-api:1.8.6:mockk-agent-api-1.8.6.jar:613512c66538e6349e03df641a868f4ee324f13e2e1dbd67a0ed388aa664a444', - 'io.mockk:mockk-agent-common:1.8.6:mockk-agent-common-1.8.6.jar:cb7cb26fae5bfd3c89090858548990f311b27f673b9efa9d0c94f97c463b2863', - 'io.mockk:mockk-agent-jvm:1.8.6:mockk-agent-jvm-1.8.6.jar:3f30b98d23ada8b5a44d75b43cd58fc03252fcb96939ff31e7ad659818af1e5d', - 'io.mockk:mockk-common:1.8.6:mockk-common-1.8.6.jar:a04b0e2fc7d583807cf89f3bbf5c7501808725e49e385d95486e1008d8ab2ba8', - 'io.mockk:mockk-dsl-jvm:1.8.6:mockk-dsl-jvm-1.8.6.jar:c2c5df747ff04d1a3e02212b7b43f9ba4233597ae278928598275d7a7bb26d73', - 'io.mockk:mockk-dsl:1.8.6:mockk-dsl-1.8.6.jar:f6014265fe88ef1290c936741bdd0a7c3d9ceba9ee3bd2a153d65b05e1fc7946', - 'io.mockk:mockk:1.8.6:mockk-1.8.6.jar:0a200d71bab11facfe50637b1980f53c07a21bfa4dd9eb021ac8e8cc693924b2', + 'io.javalin:javalin:2.3.0:javalin-2.3.0.jar:3571e83863e1f163854f1b2ee3cbfc1336fcbdfa595ec9c2ed8ab8bfa792e5f4', + 'io.mockk:mockk-agent-api:1.8.9:mockk-agent-api-1.8.9.jar:8cbc0adc0f349f891d44ffdaba55c68271790ce9c33cc437d2be86a5af572d6c', + 'io.mockk:mockk-agent-common:1.8.9:mockk-agent-common-1.8.9.jar:a67b8bb696f91023e4446e2c8594c652924a350422047c96f31031be2a8de54a', + 'io.mockk:mockk-agent-jvm:1.8.9:mockk-agent-jvm-1.8.9.jar:4a8b83501e0fda6f79601e073c9e419dc649eeb8d18645ae0d60c64f1e671076', + 'io.mockk:mockk-common:1.8.9:mockk-common-1.8.9.jar:a3fb4d3fa776dde4eab2cc49e5df68fa394064df47431e2add9fc2100f3a145f', + 'io.mockk:mockk-dsl-jvm:1.8.9:mockk-dsl-jvm-1.8.9.jar:d6cfda3ba94b3fba2826c4554a33866a5559df9326fb28b559078fcb4508e60d', + 'io.mockk:mockk-dsl:1.8.9:mockk-dsl-1.8.9.jar:e24f0de13e12227544a68dae13f4fae4dd376f5d1eac796d3f4594989c0f2e68', + 'io.mockk:mockk:1.8.9:mockk-1.8.9.jar:9ead145f12b086af1d15eb4bf0fa5ccee02781b69937be6f77f47ac03100f526', 'javax.inject:javax.inject:1:javax.inject-1.jar:91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff', 'javax.servlet:javax.servlet-api:3.1.0:javax.servlet-api-3.1.0.jar:af456b2dd41c4e82cf54f3e743bc678973d9fe35bd4d3071fa05c7e5333b8482', - 'net.bytebuddy:byte-buddy-agent:1.8.8:byte-buddy-agent-1.8.8.jar:dc1a2dcefe72731fa89ae84e32231c74d545ccf8216c79865096e546f20c57e8', - 'net.bytebuddy:byte-buddy:1.8.8:byte-buddy-1.8.8.jar:30aed1ae2ee5261b1d2f0e98ec3fcb40755c3f61b378089fb65d56098df1f16b', + 'net.bytebuddy:byte-buddy-agent:1.8.22:byte-buddy-agent-1.8.22.jar:ebc20e83fbb13e7911e4c704c9548a4166d7e83922f80de700ae5c5c983943d5', + 'net.bytebuddy:byte-buddy:1.8.22:byte-buddy-1.8.22.jar:d330d2ef290a2852bbaf06eab03bc93d24501599c8a836da9d946f82c48e276c', 'org.apiguardian:apiguardian-api:1.0.0:apiguardian-api-1.0.0.jar:1f58b77470d8d147a0538d515347dd322f49a83b9e884b8970051160464b65b3', 'org.eclipse.jetty.websocket:websocket-api:9.4.12.v20180830:websocket-api-9.4.12.v20180830.jar:6f7ecb42601058ffe4a6c19c5340cac3ebf0f83e2e252b457558f104238278e3', 'org.eclipse.jetty.websocket:websocket-client:9.4.12.v20180830:websocket-client-9.4.12.v20180830.jar:97c6882c858a75776773eaccc01739757c4e9f60a51613878c1f2b2ba03d91af', @@ -36,31 +36,30 @@ dependencyVerification { 'org.eclipse.jetty:jetty-util:9.4.12.v20180830:jetty-util-9.4.12.v20180830.jar:60ad53e118a3e7d10418b155b9944d90b2e4e4c732e53ef4f419473288d3f48c', 'org.eclipse.jetty:jetty-webapp:9.4.12.v20180830:jetty-webapp-9.4.12.v20180830.jar:5301e412a32bf7dddcfad458d952179597c61f8fd531c265873562725c3d4646', 'org.eclipse.jetty:jetty-xml:9.4.12.v20180830:jetty-xml-9.4.12.v20180830.jar:5b8298ab3d43ddaf0941d41f51b82c8ae23a247da055fa161b752ab9495155ed', - 'org.jetbrains.kotlin:kotlin-android-extensions:1.2.70:kotlin-android-extensions-1.2.70.jar:534601f4b10bd175268a611ea370051f75db3377da11e9400430f01db7c70bd0', - 'org.jetbrains.kotlin:kotlin-annotation-processing-gradle:1.2.70:kotlin-annotation-processing-gradle-1.2.70.jar:820da7e3637066c14eb3d54dc29cd6d4dc4a041ff603d0b15844403de47b7d12', - 'org.jetbrains.kotlin:kotlin-build-common:1.2.70:kotlin-build-common-1.2.70.jar:6756d98108512b8a42013e453912e868777a20f05cac3f40af891e4058e94da6', - 'org.jetbrains.kotlin:kotlin-compiler-embeddable:1.2.70:kotlin-compiler-embeddable-1.2.70.jar:8958d6f6ce4e49a6cecaaa9a1711a6b03df793fe066a74d88cf4958f20b0f10d', - 'org.jetbrains.kotlin:kotlin-compiler-runner:1.2.70:kotlin-compiler-runner-1.2.70.jar:44654c5f86e2b36222cb8b09e5eeb0b252db1e83d258b27fb31c670c339e65e1', - 'org.jetbrains.kotlin:kotlin-daemon-client:1.2.70:kotlin-daemon-client-1.2.70.jar:92b73c45670324ae6b81ccaa123a38eddd53adfe3a2b58938421d4d17a53f9e3', - 'org.jetbrains.kotlin:kotlin-gradle-plugin-api:1.2.70:kotlin-gradle-plugin-api-1.2.70.jar:a60b71d564795461e023956d8b3dd03d606d51ad1eb79e7c002dbce62a24378c', - 'org.jetbrains.kotlin:kotlin-gradle-plugin-model:1.2.70:kotlin-gradle-plugin-model-1.2.70.jar:a7fdb4b35e7537ad417e6b19595a1df7d676e8e9fa5a8a96dbcf1a40b577493b', - 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.70:kotlin-gradle-plugin-1.2.70.jar:b9a96b3d39215b7fdcc8013476e70f86b8010277dd3639e58b42e6ffde1f3cab', - 'org.jetbrains.kotlin:kotlin-reflect:1.2.41:kotlin-reflect-1.2.41.jar:1bab75771dfa2bb5949cd383ceaedf6f8d354fa0d677804fc5a39e320bab70d3', - 'org.jetbrains.kotlin:kotlin-reflect:1.2.70:kotlin-reflect-1.2.70.jar:89ef46a458c5ee58b8460d0d22b0bb484eea0589ccffd59d650ef38bcb60e806', - 'org.jetbrains.kotlin:kotlin-script-runtime:1.2.70:kotlin-script-runtime-1.2.70.jar:0124dfcf890e39250c3a4481cdd27f038d8321e93ce983730c4cbc10143eadc2', - 'org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.2.70:kotlin-scripting-compiler-embeddable-1.2.70.jar:cbd88e1cae3f8f2baeb7021d3b76323b30e82663e7b4222a214f33ee314b3653', - 'org.jetbrains.kotlin:kotlin-stdlib-common:1.2.70:kotlin-stdlib-common-1.2.70.jar:bb6898bef18e1de5d416d5135ca70dcac6645718c7d84bbddcfeb76ed1c199a1', - 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.2.70:kotlin-stdlib-jdk7-1.2.70.jar:b4ace315288134b52fddb58b4a92636faafb2ab5eb46bad97d3bce7623a8e213', - 'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.2.70:kotlin-stdlib-jdk8-1.2.70.jar:88d0c29f4065b6ad34261fb4a04d39f9813051c6942428d718b649378d057ad1', - 'org.jetbrains.kotlin:kotlin-stdlib:1.2.70:kotlin-stdlib-1.2.70.jar:7d20d0a56dd0ea6176137759a6aad331bbfae67436b45e5f0a4d8dafb6985c81', + 'org.jetbrains.kotlin:kotlin-android-extensions:1.2.71:kotlin-android-extensions-1.2.71.jar:6c3f52bbb7c25ddb102cfbe1e91e3f1ee45805f842310fb92496668dbf1366de', + 'org.jetbrains.kotlin:kotlin-annotation-processing-gradle:1.2.71:kotlin-annotation-processing-gradle-1.2.71.jar:107070d5bc10530a6823907487609899ac4d8753f730b8abf1f158971d93802e', + 'org.jetbrains.kotlin:kotlin-build-common:1.2.71:kotlin-build-common-1.2.71.jar:f3c6874442409c5fac7142dc5a4f7a0148147896a6d7f9e0c3cb140690090cb1', + 'org.jetbrains.kotlin:kotlin-compiler-embeddable:1.2.71:kotlin-compiler-embeddable-1.2.71.jar:623e546310d3da89ed2bc0cf9f7fedd78fadd9cd65d2ff798fa894c14e527665', + 'org.jetbrains.kotlin:kotlin-compiler-runner:1.2.71:kotlin-compiler-runner-1.2.71.jar:7259a24562ba880f821bc7c9ae51f724d66e8ea00f6e3143d4427a161ae6e998', + 'org.jetbrains.kotlin:kotlin-daemon-client:1.2.71:kotlin-daemon-client-1.2.71.jar:2ad669e3c2cedd3a2406f3c2c4739dba537acf373d605c207ed5058630e66462', + 'org.jetbrains.kotlin:kotlin-gradle-plugin-api:1.2.71:kotlin-gradle-plugin-api-1.2.71.jar:a141e6b9740ebf88ce53d258e40cb59f54ee8e2fafdff4c4c10b0abdceb57cba', + 'org.jetbrains.kotlin:kotlin-gradle-plugin-model:1.2.71:kotlin-gradle-plugin-model-1.2.71.jar:7082e9858b3ead143bcb48383007751a776fd46e8ce4cec1a1d4a873db5e7ec1', + 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.71:kotlin-gradle-plugin-1.2.71.jar:ab88dab9bd2a3c31c4e6aaa0eb4168d13f126e9076561bb42f5f3fe80c902a78', + 'org.jetbrains.kotlin:kotlin-reflect:1.2.71:kotlin-reflect-1.2.71.jar:1f3e10abd68d0b0816bddab7314f61269e01d8aa2ca1cbd120c12d3b4dc94b0f', + 'org.jetbrains.kotlin:kotlin-script-runtime:1.2.71:kotlin-script-runtime-1.2.71.jar:307d0a56734458a5e57e3ea788c15b22591912ba39f81b2cc8b0a090944012bb', + 'org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.2.71:kotlin-scripting-compiler-embeddable-1.2.71.jar:97a5d94241d13719ea756a908262a10c638db7a8caaa23b28537b1687f894f0c', + 'org.jetbrains.kotlin:kotlin-stdlib-common:1.2.71:kotlin-stdlib-common-1.2.71.jar:63999687ff2fce8a592dd180ffbbf8f1d21c26b4044c55cdc74ff3cf3b3cf328', + 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.2.71:kotlin-stdlib-jdk7-1.2.71.jar:b136bd61b240e07d4d92ce00d3bd1dbf584400a7bf5f220c2f3cd22446858082', + 'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.2.71:kotlin-stdlib-jdk8-1.2.71.jar:ac3c8abf47790b64b4f7e2509a53f0c145e061ac1612a597520535d199946ea9', + 'org.jetbrains.kotlin:kotlin-stdlib:1.2.71:kotlin-stdlib-1.2.71.jar:4c895c270b87f5fec2a2796e1d89c15407ee821de961527c28588bb46afbc68b', 'org.jetbrains:annotations:13.0:annotations-13.0.jar:ace2a10dc8e2d5fd34925ecac03e4988b2c0f851650c94b8cef49ba1bd111478', - 'org.junit.jupiter:junit-jupiter-api:5.2.0:junit-jupiter-api-5.2.0.jar:47f7d71b35dc331210b9ab219bbb00d54332981aa12eb5effe817de17e1ae7b3', - 'org.junit.jupiter:junit-jupiter-engine:5.2.0:junit-jupiter-engine-5.2.0.jar:8f994f4094790e246dc84de86a1ff4194ca85e8b13bedaca0207f727ebfbc813', - 'org.junit.jupiter:junit-jupiter-params:5.2.0:junit-jupiter-params-5.2.0.jar:34ce02519044ef68217002f640a83e267c4001ce53b68270218d49d00449a836', - 'org.junit.platform:junit-platform-commons:1.2.0:junit-platform-commons-1.2.0.jar:7771af2f797d1d0ccce9920eb3cd826fb8fd7659ccb4d8877e76d9412be72cc2', - 'org.junit.platform:junit-platform-engine:1.2.0:junit-platform-engine-1.2.0.jar:60b102e94ea01556fdc8c041950a05450edc188e3708f032a6bfb1a50ba0bc22', + 'org.junit.jupiter:junit-jupiter-api:5.3.1:junit-jupiter-api-5.3.1.jar:7923e21f030a9964d70a0e48007ca873280c66ddf0f0620b2d969852c23d5653', + 'org.junit.jupiter:junit-jupiter-engine:5.3.1:junit-jupiter-engine-5.3.1.jar:04f4354548a30827e126bdf6fcbe3640789ad8335a6f3f0762bf7f9f74e51fbf', + 'org.junit.jupiter:junit-jupiter-params:5.3.1:junit-jupiter-params-5.3.1.jar:72fe344712d4cd88dd0cb4bfa304322d512d2cb27173ed64cb5036a573d29f4c', + 'org.junit.platform:junit-platform-commons:1.3.1:junit-platform-commons-1.3.1.jar:457d8e1c0c80d1e320a792ec35e7c180694ba05182d7ecf7dabdb4e5a8a12fe2', + 'org.junit.platform:junit-platform-engine:1.3.1:junit-platform-engine-1.3.1.jar:303d0546c3e950cc3beaca00dfcbf2632d4eca530e4e446391bf193cbc2a71a3', 'org.objenesis:objenesis:2.6:objenesis-2.6.jar:5e168368fbc250af3c79aa5fef0c3467a2d64e5a7bd74005f25d8399aeb0708d', - 'org.opentest4j:opentest4j:1.1.0:opentest4j-1.1.0.jar:65a5fd7380f53aac708bcee3091dbe2dba73a9a2e7645b66e70e0804fc36ee3b', + 'org.opentest4j:opentest4j:1.1.1:opentest4j-1.1.1.jar:f106351abd941110226745ed103c85863b3f04e9fa82ddea1084639ae0c5336c', 'org.skyscreamer:jsonassert:1.5.0:jsonassert-1.5.0.jar:a310bc79c3f4744e2b2e993702fcebaf3696fec0063643ffdc6b49a8fb03ef39', 'org.slf4j:slf4j-api:1.7.25:slf4j-api-1.7.25.jar:18c4a0095d5c1da6b817592e767bb23d29dd2f560ad74df75ff3961dbde25b79', 'org.slf4j:slf4j-simple:1.7.25:slf4j-simple-1.7.25.jar:0966e86fffa5be52d3d9e7b89dd674d98a03eed0a454fbaf7c1bd9493bd9d874',