Skip to content

aafanasev/sekret

Folders and files

NameName
Last commit message
Last commit date

Latest commit

5edc729 · Mar 11, 2025
Apr 23, 2021
Jan 13, 2025
Jan 13, 2025
Mar 11, 2025
Jan 11, 2025
Mar 7, 2025
Mar 7, 2025
Jul 20, 2022
Jan 11, 2025
Oct 18, 2021
Mar 15, 2020
Mar 7, 2025
Mar 11, 2025
Jan 18, 2023
Jan 18, 2023
Jul 19, 2022

Repository files navigation

Sekret

maven

Kotlin compiler plugin that hides data class properties in generated toString() method

Motivation

In 2019 Facebook and Google admitted a leaking of millions of user passwords. It doesn't mean that they save our passwords as plain text, no - the passwords were found in log files. When a user enters a password it goes through hundreds of different services and each of has its logging system. It's very easy to make a mistake and save sensitive data, especially when you have no control on autogenerated code. That's why this plugin was created to help you to exclude some properties from autogenerated toString() method. If you do not want to use a compiler plugin please have a look to other ways.

Usage

Code:

data class Credentials(
    val login: String, 
    @Secret val password: String
)

println(Credentials("User", "12345")) 

Output:

Credentials(login=User, password=■■■)

Installation

Gradle

Apply plugin:

plugins {
    id 'net.afanasev.sekret' version '<version>'
}

Configure:

// Download @Secret annotation
dependencies {
    compile 'net.afanasev:sekret-annotation:<version>'
}

// OR use your own
sekret {
    // "■■■" by default
    mask = "***"    
    
    // true by default
    enabled = true

    // "net.afanasev.sekret.Secret" by default
     annotations = ["com.sample.YourAnnotation"] 
}

Custom annotations:

PayAttention that your custom annotation should have proper retention:

@Target(AnnotationTarget.FIELD)
@Retention(AnnotationRetention.SOURCE)
annotation class CustomAnnotation()

Also, there is possibility to customize replacement via regular expression replacement

To use it

  • you should crate annotation with exactly two fields search and replacement
@Target(AnnotationTarget.FIELD)
@Retention(AnnotationRetention.SOURCE)
annotation class AnnotationWithReplacement(val search: String, val replacement: String)
  • Annotate field
data class Phone(
    @AnnotationWithReplacement("([0-9]{3})(.*)([0-9]{2})","$1****$3")
    val number:String
)

Behaviour:

  • if fieldValue matches the search regular expression
    • then fieldValue will be replaced by replacement expression
  • else
    • fieldValue will be replaced by default mask

Kotlin CLI

kotlinc \
    -Xplugin=kotlin-plugin.jar \
    -P plugin:sekret:annotations=com.sample.YourAnnotation \
    ...

Mentions

Code of Conduct

Please refer to Code of Conduct document.