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

Add hints for failing conditions #172

Merged
merged 7 commits into from
Aug 22, 2023
Merged

Add hints for failing conditions #172

merged 7 commits into from
Aug 22, 2023

Conversation

sourque
Copy link
Collaborator

@sourque sourque commented Aug 12, 2023

Add hints, like:

image

Example pseudo config:

52│[[check]]                                                                       
53│message = "Removed john the ripper"                                                    
54│points = 10                                                                     
55│                                                                                
56│    [[check.pass]]                                                              
57│    hint = "Are there any 'hacking' tools on this system?"                      
58│    type = "ProgramInstalledNot"                                                
59│    name = "john"                                                                 
60│                                                                                
61│    [[check.pass]]                                                              
62│    hint = "Removing just the binary is insufficient; use a package manager to remove all of a tool's files"
63│    type = "PathExistsNot"                                                      
64│    path = "/usr/local/share/john"

@safinsingh
Copy link
Member

Would it be possible to implement check-wide hints for checks with multiple conditions? This would be useful in the case that you don't want per-condition hints but one for an entire check. Do you think people would run into this/find that feature useful?

@@ -91,7 +91,7 @@ func debug(p ...interface{}) {
} else {
printStr = printer(color.FgMagenta, "DBUG", toPrint)
}
fmt.Printf(printStr)
fmt.Print(printStr)
Copy link
Collaborator

Choose a reason for hiding this comment

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

As it was Printf() before, this is just a sanity check, but it is intentional that it is Print() and not Println() yeah?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Yeah sorry had this change lying around for a while, it is supposed to be Print. Printf was kind of like a format string vulnerability lol, not that those exist in go. The newline is added in toPrint via Sprintln.

score.go Outdated
@@ -252,27 +274,24 @@ func scoreCheck(check check) {
}
}

func checkFails(check *check) bool {
func checkOr(check *check, hint *hintItem) bool {
Copy link
Collaborator

Choose a reason for hiding this comment

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

Can we have a line or two to explain what checkOr and checkAnd are designed to do? it is a slightly less direct name than previously

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

I saw that the functions were identical for checkFails/PassOverride because they were both OR/|| behavior, in that on the first true, return. Whereas pass is AND/&& because everything needs to be true otherwise return false. Sure I'll add a comment

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Actually good catch I messed that up and forgot to change it to take a list of conds rather than a check

checks.go Show resolved Hide resolved
Cmd: "dpkg -s " + c.Name,
}.Command()
Cmd: "dpkg -s " + c.Name,
Value: " install",
Copy link
Collaborator

Choose a reason for hiding this comment

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

what does this change do?

Copy link
Collaborator

Choose a reason for hiding this comment

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

this question also applies to line 215

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Yea lol I think that check was broken. After removing something with apt, dpkg just shows the status as deinstall. Does not return nonzero value for -s

docs/hints.md Outdated
# This hint will NOT print unless the condition above succeeds.
# Pass conditions are logically AND-- they all need to succeed.
# If one fails, there's no reason to execute the other ones.
hint = "Removing just the binary is insufficient; use a package manager to remove all of a tool's files."
Copy link
Collaborator

Choose a reason for hiding this comment

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

at least by my logic, if a Program is NOT installed (so its no longer in the package manager DB saying it is or is not installed), then "using a package manager to remove the tool's files" would be useless since the package manager has no idea it exists -- if my understanding is right, shouldn't the hint be more like "The binary and its files need removed!"

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

The example here is a "common" issue where people remove a package but don't purge or autoremove, so there's a hint for that (eg remove john, john-data still exists). I suppose the hint could be "Ensure that you use a package manager to remove ALL of a tool's files"

type = "PathExistsNot"
path = "/usr/share/john"
```

Copy link
Collaborator

Choose a reason for hiding this comment

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

so you would end up with two hints to the same check? Which can be confusing when its based on points so
(Points: 5) (hint)
(Points: 5) (another hint on the same thing, but it could be interpreted as solving both hints give you 10 points)

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

When points are for the same item they're grouped in a list so I don't think that would be confusing. Maybe vice versa if there are two hints for 5 points someone could think they're the same underlying check but I think that's unlikely

Copy link
Collaborator

@Mobmaker55 Mobmaker55 left a comment

Choose a reason for hiding this comment

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

Looks good on paper, if you want me to give it a spin before we push I can do that today.
I should probably also update the docs for my (now 2 weeks old) PR and we push both of these at the same time with a version change?

@Mobmaker55 Mobmaker55 merged commit 352572a into master Aug 22, 2023
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants