Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

KeepPrivateModule: Special case for moving bug reports to MCL #808

Merged
merged 2 commits into from
Jul 16, 2023
Merged
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
3 changes: 3 additions & 0 deletions config/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -390,6 +390,9 @@ arisa:
keepPrivate:
tag: MEQS_KEEP_PRIVATE
message: panel-unmark-private-issue
privateLevels:
- '10318' # most projects
- '10502' # just MCL

privateDuplicate:
resolutions:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -339,6 +339,9 @@ object Arisa : ConfigSpec() {
description = "The key of the message that is posted when this module succeeds."
)
val tag by optional<String?>(null)
val privateLevels by required<Set<String>>(
description = "All levels used to denote private security level"
)
}

object PrivateDuplicate : ModuleConfigSpec() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,19 +12,20 @@ import java.time.Instant

class KeepPrivateModule(
private val keepPrivateTag: String?,
private val message: String
private val message: String,
private val privateLevels: Set<String>
) : Module {
override fun invoke(issue: Issue, lastRun: Instant): Either<ModuleError, ModuleResponse> = with(issue) {
Either.fx {
assertNotNull(keepPrivateTag).bind()
assertContainsKeepPrivateTag(comments).bind()
assertIsPublic(securityLevel, project.privateSecurity).bind()
assertIsPublic(securityLevel).bind()

setPrivate()

val markedTime = comments.first(::isKeepPrivateTag).created
val securityChange = changeLog
.lastOrNull { isSecurityChangeToPublic(it, project.privateSecurity) }
val securityChange = changeLog.lastOrNull(::isSecurityChangeToPublic)

val changedTime = securityChange?.created
if (changedTime != null && changedTime.isAfter(markedTime)) {
if (
Expand All @@ -46,16 +47,16 @@ class KeepPrivateModule(
comment.visibilityValue == "staff" &&
(comment.body?.contains(keepPrivateTag!!) ?: false)

private fun isSecurityChangeToPublic(item: ChangeLogItem, privateLevel: String) =
item.field == "security" && item.changedFromString == privateLevel
private fun isSecurityChangeToPublic(item: ChangeLogItem) =
item.field == "security" && privateLevels.contains(item.changedFromString)

private fun assertContainsKeepPrivateTag(comments: List<Comment>) = when {
comments.any(::isKeepPrivateTag) -> Unit.right()
else -> OperationNotNeededModuleResponse.left()
}

private fun assertIsPublic(securityLevel: String?, privateLevel: String) =
if (securityLevel == privateLevel) {
private fun assertIsPublic(securityLevel: String?) =
if (privateLevels.contains(securityLevel)) {
OperationNotNeededModuleResponse.left()
} else {
Unit.right()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,8 @@ class InstantModuleRegistry(config: Config) : ModuleRegistry(config) {
Arisa.Modules.KeepPrivate,
KeepPrivateModule(
config[Arisa.Modules.KeepPrivate.tag],
config[Arisa.Modules.KeepPrivate.message]
config[Arisa.Modules.KeepPrivate.message],
config[Arisa.Modules.KeepPrivate.privateLevels]
)
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ private val REMOVE_SECURITY_STAFF = mockChangeLogItem(

class KeepPrivateModuleTest : StringSpec({
"should return OperationNotNeededModuleResponse when keep private tag is null" {
val module = KeepPrivateModule(null, "message")
val module = KeepPrivateModule(null, "message", setOf(PRIVATE_SECURITY_LEVEL))
val comment = mockComment(
body = "MEQS_KEEP_PRIVATE",
visibilityType = "group",
Expand All @@ -54,7 +54,7 @@ class KeepPrivateModuleTest : StringSpec({
}

"should return OperationNotNeededModuleResponse when comments are empty" {
val module = KeepPrivateModule("MEQS_KEEP_PRIVATE", "message")
val module = KeepPrivateModule("MEQS_KEEP_PRIVATE", "message", setOf(PRIVATE_SECURITY_LEVEL))
val issue = mockIssue(
changeLog = listOf(REMOVE_SECURITY)
)
Expand All @@ -65,7 +65,7 @@ class KeepPrivateModuleTest : StringSpec({
}

"should return OperationNotNeededModuleResponse when no comment contains private tag" {
val module = KeepPrivateModule("MEQS_KEEP_PRIVATE", "message")
val module = KeepPrivateModule("MEQS_KEEP_PRIVATE", "message", setOf(PRIVATE_SECURITY_LEVEL))
val comment = mockComment(
body = "Hello world!",
visibilityType = "group",
Expand All @@ -82,7 +82,7 @@ class KeepPrivateModuleTest : StringSpec({
}

"should return OperationNotNeededModuleResponse when the comment isn't restricted to staff group" {
val module = KeepPrivateModule("MEQS_KEEP_PRIVATE", "message")
val module = KeepPrivateModule("MEQS_KEEP_PRIVATE", "message", setOf(PRIVATE_SECURITY_LEVEL))
val comment = mockComment(
body = "MEQS_KEEP_PRIVATE"
)
Expand All @@ -97,7 +97,7 @@ class KeepPrivateModuleTest : StringSpec({
}

"should return OperationNotNeededModuleResponse when security level is set to private" {
val module = KeepPrivateModule("MEQS_KEEP_PRIVATE", "message")
val module = KeepPrivateModule("MEQS_KEEP_PRIVATE", "message", setOf(PRIVATE_SECURITY_LEVEL))
val comment = mockComment(
body = "MEQS_KEEP_PRIVATE",
visibilityType = "group",
Expand All @@ -117,7 +117,7 @@ class KeepPrivateModuleTest : StringSpec({
var didSetToPrivate = false
var didComment = false

val module = KeepPrivateModule("MEQS_KEEP_PRIVATE", "message")
val module = KeepPrivateModule("MEQS_KEEP_PRIVATE", "message", setOf(PRIVATE_SECURITY_LEVEL))
val comment = mockComment(
body = "MEQS_KEEP_PRIVATE",
created = RIGHT_NOW.minusSeconds(20),
Expand All @@ -142,7 +142,7 @@ class KeepPrivateModuleTest : StringSpec({
var didSetToPrivate = false
var didComment = false

val module = KeepPrivateModule("MEQS_KEEP_PRIVATE", "message")
val module = KeepPrivateModule("MEQS_KEEP_PRIVATE", "message", setOf(PRIVATE_SECURITY_LEVEL))
val comment = mockComment(
body = "MEQS_KEEP_PRIVATE",
created = RIGHT_NOW.minusSeconds(20),
Expand All @@ -163,11 +163,33 @@ class KeepPrivateModuleTest : StringSpec({
didComment shouldBe true
}

"should not set to private if bug report is already private but with different security level" {
var didSetToPrivate = false

val module = KeepPrivateModule("MEQS_KEEP_PRIVATE", "message", setOf(PRIVATE_SECURITY_LEVEL, "special-private"))
val comment = mockComment(
body = "MEQS_KEEP_PRIVATE",
created = RIGHT_NOW.minusSeconds(20),
visibilityType = "group",
visibilityValue = "staff"
)
val issue = mockIssue(
securityLevel = "special-private",
comments = listOf(comment),
setPrivate = { didSetToPrivate = true; Unit.right() }
)

val result = module(issue, RIGHT_NOW)

result.shouldBeLeft(OperationNotNeededModuleResponse)
didSetToPrivate shouldBe false
}

"should both set to private and comment when security level is not private" {
var didSetToPrivate = false
var didComment = false

val module = KeepPrivateModule("MEQS_KEEP_PRIVATE", "message")
val module = KeepPrivateModule("MEQS_KEEP_PRIVATE", "message", setOf(PRIVATE_SECURITY_LEVEL))
val comment = mockComment(
body = "MEQS_KEEP_PRIVATE",
created = RIGHT_NOW.minusSeconds(20),
Expand All @@ -193,7 +215,7 @@ class KeepPrivateModuleTest : StringSpec({
var didSetToPrivate = false
var didComment = false

val module = KeepPrivateModule("MEQS_KEEP_PRIVATE", "message")
val module = KeepPrivateModule("MEQS_KEEP_PRIVATE", "message", setOf(PRIVATE_SECURITY_LEVEL))
val comment = mockComment(
body = "MEQS_KEEP_PRIVATE",
created = RIGHT_NOW.minusSeconds(20),
Expand Down Expand Up @@ -230,7 +252,7 @@ class KeepPrivateModuleTest : StringSpec({
var didSetToPrivate = false
var didComment = false

val module = KeepPrivateModule("MEQS_KEEP_PRIVATE", "message")
val module = KeepPrivateModule("MEQS_KEEP_PRIVATE", "message", setOf(PRIVATE_SECURITY_LEVEL))
val comment = mockComment(
body = "MEQS_KEEP_PRIVATE",
visibilityType = "group",
Expand All @@ -253,7 +275,7 @@ class KeepPrivateModuleTest : StringSpec({
var didSetToPrivate = false
var didComment = false

val module = KeepPrivateModule("MEQS_KEEP_PRIVATE", "message")
val module = KeepPrivateModule("MEQS_KEEP_PRIVATE", "message", setOf(PRIVATE_SECURITY_LEVEL))
val comment = mockComment(
body = "MEQS_KEEP_PRIVATE",
created = RIGHT_NOW.minusSeconds(2),
Expand Down