Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
[versions]
assertj = "3.27.3"
bcrypt = "0.10.2"
changelog = "2.2.1"
commons-codec = "1.18.0"
commons-compress = "1.27.1"
Expand Down Expand Up @@ -31,6 +32,7 @@ zxing = "3.5.3"

[libraries]
assertj-core = { module = "org.assertj:assertj-core", version.ref = "assertj" }
bcrypt = { module = "at.favre.lib:bcrypt", version.ref = "bcrypt" }
commons-codec = { module = "commons-codec:commons-codec", version.ref = "commons-codec" }
commons-compress = { module = "org.apache.commons:commons-compress", version.ref = "commons-compress" }
commons-csv = { module = "org.apache.commons:commons-csv", version.ref = "commons-csv" }
Expand Down
1 change: 1 addition & 0 deletions modules/tools/ui/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ dependencies {
implementation(libs.jnanoid)
implementation(libs.uuid.generator)
implementation(libs.cronutils)
implementation(libs.bcrypt)

testImplementation(libs.assertj.core)
testImplementation(libs.bundles.junit.implementation)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package dev.turingcomplete.intellijdevelopertoolsplugin.tool.ui.transformer

import at.favre.lib.crypto.bcrypt.BCrypt
import com.intellij.openapi.Disposable
import com.intellij.openapi.project.Project
import com.intellij.ui.dsl.builder.Panel
import com.intellij.ui.dsl.builder.bindItem
import dev.turingcomplete.intellijdevelopertoolsplugin.settings.DeveloperToolConfiguration
import dev.turingcomplete.intellijdevelopertoolsplugin.tool.ui.base.DeveloperUiToolContext
import dev.turingcomplete.intellijdevelopertoolsplugin.tool.ui.base.DeveloperUiToolFactory
import dev.turingcomplete.intellijdevelopertoolsplugin.tool.ui.base.DeveloperUiToolPresentation
import dev.turingcomplete.intellijdevelopertoolsplugin.tool.ui.converter.base.UndirectionalConverter

class BCryptTransformer(
context: DeveloperUiToolContext,
configuration: DeveloperToolConfiguration,
parentDisposable: Disposable,
project: Project?,
) :
UndirectionalConverter(
context = context,
configuration = configuration,
parentDisposable = parentDisposable,
project = project,
title = "BCrypt",
sourceTitle = "Password",
targetTitle = "Hash",
toTargetTitle = "Generate",
) {
// -- Properties ---------------------------------------------------------- //

private val selectedCost = configuration.register("cost", DEFAULT_COST)

// -- Initialization ------------------------------------------------------ //
// -- Exposed Methods ----------------------------------------------------- //

override fun requestLiveConversion() {}
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Live conversion still triggers when the user types in the input. The intent of this no-op override was to prevent re-hashing endlessly when the user clicks the output area when live conversion check is true. Suggestions on the correct hook to disable source-side live conversion are welcome


override fun doConvertToTarget(source: ByteArray): ByteArray {
val password = String(source, Charsets.UTF_8).toCharArray()
return BCrypt.withDefaults()
.hashToString(selectedCost.get(), password)
.toByteArray(Charsets.UTF_8)
}

override fun Panel.buildSourceTopConfigurationUi() {
row { comboBox(COST_RANGE.toList()).label("Cost:").bindItem(selectedCost) }
}

// -- Private Methods ----------------------------------------------------- //
// -- Inner Type ---------------------------------------------------------- //

class Factory : DeveloperUiToolFactory<BCryptTransformer> {

override fun getDeveloperUiToolPresentation() =
DeveloperUiToolPresentation(menuTitle = "BCrypt", contentTitle = "BCrypt Transformer")

override fun getDeveloperUiToolCreator(
project: Project?,
parentDisposable: Disposable,
context: DeveloperUiToolContext,
): ((DeveloperToolConfiguration) -> BCryptTransformer) = { configuration ->
BCryptTransformer(context, configuration, parentDisposable, project)
}
}

// -- Companion Object ---------------------------------------------------- //

companion object {
private const val DEFAULT_COST = 12
private val COST_RANGE = 4..20
}
}
4 changes: 4 additions & 0 deletions src/main/resources/META-INF/plugin.xml
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,10 @@
id="hmac-transformer"
groupId="cryptography"
implementationClass="dev.turingcomplete.intellijdevelopertoolsplugin.tool.ui.transformer.HmacTransformer$Factory"/>
<developerUiTool
id="bcrypt-transformer"
groupId="cryptography"
implementationClass="dev.turingcomplete.intellijdevelopertoolsplugin.tool.ui.transformer.BCryptTransformer$Factory"/>
<developerUiTool
id="password-generator"
groupId="cryptography"
Expand Down