Trim flags to avoid mistakes due to empty lines or espaces...
This commit is contained in:
parent
e6d8f2db1b
commit
0cc72712a4
@ -404,6 +404,7 @@ type uploadedFlag struct {
|
||||
Placeholder string
|
||||
IgnoreCase bool
|
||||
Multiline bool
|
||||
NoTrim bool
|
||||
ValidatorRe *string `json:"validator_regexp"`
|
||||
Flag string
|
||||
Value []byte
|
||||
@ -425,7 +426,7 @@ func createExerciceFlag(exercice *fic.Exercice, body []byte) (interface{}, error
|
||||
vre = uk.ValidatorRe
|
||||
}
|
||||
|
||||
return exercice.AddRawFlagKey(uk.Label, uk.Type, uk.Placeholder, uk.IgnoreCase, uk.Multiline, vre, []byte(uk.Flag), uk.ChoicesCost)
|
||||
return exercice.AddRawFlagKey(uk.Label, uk.Type, uk.Placeholder, uk.IgnoreCase, uk.NoTrim, uk.Multiline, vre, []byte(uk.Flag), uk.ChoicesCost)
|
||||
}
|
||||
|
||||
func showExerciceFlag(flag *fic.FlagKey, _ *fic.Exercice, body []byte) (interface{}, error) {
|
||||
|
@ -38,6 +38,7 @@ type ExerciceFlag struct {
|
||||
ShowLines bool `toml:",omitempty"`
|
||||
Ordered bool `toml:",omitempty"`
|
||||
CaseSensitive bool `toml:",omitempty"`
|
||||
NoTrim bool `toml:",omitempty"`
|
||||
ValidatorRe string `toml:"validator_regexp,omitempty"`
|
||||
Placeholder string `toml:",omitempty"`
|
||||
Help string `toml:",omitempty"`
|
||||
|
@ -124,7 +124,7 @@ func buildKeyFlag(exercice *fic.Exercice, flag ExerciceFlag, flagline int, defau
|
||||
errs = append(errs, fmt.Sprintf("%q: WARNING flag #%d: non-printable characters in flag, is this really expected?", path.Base(exercice.Path), flagline))
|
||||
}
|
||||
|
||||
hashedFlag, err := fic.ComputeHashedFlag([]byte(raw), !flag.CaseSensitive, validatorRegexp(flag.ValidatorRe))
|
||||
hashedFlag, err := fic.ComputeHashedFlag([]byte(raw), !flag.CaseSensitive, flag.NoTrim, validatorRegexp(flag.ValidatorRe))
|
||||
if err != nil {
|
||||
errs = append(errs, fmt.Sprintf("%q: flag #%d: %s", path.Base(exercice.Path), flagline, err.Error()))
|
||||
return
|
||||
|
@ -188,6 +188,7 @@ CREATE TABLE IF NOT EXISTS exercice_flags(
|
||||
help VARCHAR(255) NOT NULL,
|
||||
unit VARCHAR(255) NOT NULL,
|
||||
ignorecase BOOLEAN NOT NULL DEFAULT 0,
|
||||
notrim BOOLEAN NOT NULL DEFAULT 0,
|
||||
multiline BOOLEAN NOT NULL DEFAULT 0,
|
||||
validator_regexp VARCHAR(255) NULL,
|
||||
cksum BINARY(64) NOT NULL,
|
||||
|
@ -332,7 +332,7 @@ func (f *EFile) GetDepends() ([]Flag, error) {
|
||||
if err := rows.Scan(&d); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
deps = append(deps, &FlagKey{d, f.IdExercice, 0, "", "", "", "", "", false, false, nil, []byte{}, 0})
|
||||
deps = append(deps, &FlagKey{d, f.IdExercice, 0, "", "", "", "", "", false, false, false, nil, []byte{}, 0})
|
||||
}
|
||||
if err := rows.Err(); err != nil {
|
||||
return nil, err
|
||||
|
@ -29,6 +29,8 @@ type FlagKey struct {
|
||||
Unit string `json:"unit"`
|
||||
// IgnoreCase indicates if the case is sensitive to case or not
|
||||
IgnoreCase bool `json:"ignorecase"`
|
||||
// NoTrim indicates if the flag should not be trimed to avoid mistakes
|
||||
NoTrim bool `json:"notrim,omitempty"`
|
||||
// Multiline indicates if the flag is stored on multiple lines
|
||||
Multiline bool `json:"multiline"`
|
||||
// ValidatorRegexp extracts a subset of the player's answer, that will be checked.
|
||||
@ -41,7 +43,7 @@ type FlagKey struct {
|
||||
|
||||
// GetFlagKeys returns a list of key's flags comming with the challenge.
|
||||
func (e *Exercice) GetFlagKeys() ([]*FlagKey, error) {
|
||||
if rows, err := DBQuery("SELECT id_flag, id_exercice, ordre, label, type, placeholder, help, unit, ignorecase, multiline, validator_regexp, cksum, choices_cost FROM exercice_flags WHERE id_exercice = ?", e.Id); err != nil {
|
||||
if rows, err := DBQuery("SELECT id_flag, id_exercice, ordre, label, type, placeholder, help, unit, ignorecase, notrim, multiline, validator_regexp, cksum, choices_cost FROM exercice_flags WHERE id_exercice = ?", e.Id); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
defer rows.Close()
|
||||
@ -51,7 +53,7 @@ func (e *Exercice) GetFlagKeys() ([]*FlagKey, error) {
|
||||
k := &FlagKey{}
|
||||
k.IdExercice = e.Id
|
||||
|
||||
if err := rows.Scan(&k.Id, &k.IdExercice, &k.Order, &k.Label, &k.Type, &k.Placeholder, &k.Help, &k.Unit, &k.IgnoreCase, &k.Multiline, &k.ValidatorRegexp, &k.Checksum, &k.ChoicesCost); err != nil {
|
||||
if err := rows.Scan(&k.Id, &k.IdExercice, &k.Order, &k.Label, &k.Type, &k.Placeholder, &k.Help, &k.Unit, &k.IgnoreCase, &k.NoTrim, &k.Multiline, &k.ValidatorRegexp, &k.Checksum, &k.ChoicesCost); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@ -68,23 +70,27 @@ func (e *Exercice) GetFlagKeys() ([]*FlagKey, error) {
|
||||
// GetFlagKey returns a list of flags comming with the challenge.
|
||||
func GetFlagKey(id int) (k *FlagKey, err error) {
|
||||
k = &FlagKey{}
|
||||
err = DBQueryRow("SELECT id_flag, id_exercice, ordre, label, type, placeholder, help, unit, ignorecase, multiline, validator_regexp, cksum, choices_cost FROM exercice_flags WHERE id_flag = ?", id).Scan(&k.Id, &k.IdExercice, &k.Order, &k.Label, &k.Type, &k.Placeholder, &k.Help, &k.Unit, &k.IgnoreCase, &k.Multiline, &k.ValidatorRegexp, &k.Checksum, &k.ChoicesCost)
|
||||
err = DBQueryRow("SELECT id_flag, id_exercice, ordre, label, type, placeholder, help, unit, ignorecase, notrim, multiline, validator_regexp, cksum, choices_cost FROM exercice_flags WHERE id_flag = ?", id).Scan(&k.Id, &k.IdExercice, &k.Order, &k.Label, &k.Type, &k.Placeholder, &k.Help, &k.Unit, &k.IgnoreCase, &k.Multiline, &k.NoTrim, &k.ValidatorRegexp, &k.Checksum, &k.ChoicesCost)
|
||||
return
|
||||
}
|
||||
|
||||
// GetFlagKeyByLabel returns a flag matching the given label.
|
||||
func (e *Exercice) GetFlagKeyByLabel(label string) (k *FlagKey, err error) {
|
||||
k = &FlagKey{}
|
||||
err = DBQueryRow("SELECT id_flag, id_exercice, ordre, label, type, placeholder, help, unit, ignorecase, multiline, validator_regexp, cksum, choices_cost FROM exercice_flags WHERE type LIKE ? AND id_exercice = ?", label, e.Id).Scan(&k.Id, &k.IdExercice, &k.Order, &k.Label, &k.Type, &k.Placeholder, &k.Help, &k.Unit, &k.IgnoreCase, &k.Multiline, &k.ValidatorRegexp, &k.Checksum, &k.ChoicesCost)
|
||||
err = DBQueryRow("SELECT id_flag, id_exercice, ordre, label, type, placeholder, help, unit, ignorecase, notrim, multiline, validator_regexp, cksum, choices_cost FROM exercice_flags WHERE type LIKE ? AND id_exercice = ?", label, e.Id).Scan(&k.Id, &k.IdExercice, &k.Order, &k.Label, &k.Type, &k.Placeholder, &k.Help, &k.Unit, &k.IgnoreCase, &k.NoTrim, &k.Multiline, &k.ValidatorRegexp, &k.Checksum, &k.ChoicesCost)
|
||||
return
|
||||
}
|
||||
|
||||
// ComputeHashedFlag calculates the expected checksum for the given raw_value.
|
||||
func ComputeHashedFlag(raw_value []byte, ignorecase bool, validator_regexp *string) (hash [blake2b.Size]byte, err error) {
|
||||
func ComputeHashedFlag(raw_value []byte, ignorecase bool, notrim bool, validator_regexp *string) (hash [blake2b.Size]byte, err error) {
|
||||
if ignorecase {
|
||||
raw_value = bytes.ToLower(raw_value)
|
||||
}
|
||||
|
||||
if !notrim {
|
||||
raw_value = bytes.TrimSpace(raw_value)
|
||||
}
|
||||
|
||||
// Check that raw value passes through the regexp
|
||||
if validator_regexp != nil {
|
||||
if raw_value, err = ExecValidatorRegexp(*validator_regexp, raw_value, ignorecase); err != nil {
|
||||
@ -115,8 +121,8 @@ func ExecValidatorRegexp(vre string, val []byte, ignorecase bool) ([]byte, error
|
||||
}
|
||||
|
||||
// AddRawFlagKey creates and fills a new struct FlagKey, from a non-hashed flag, and registers it into the database.
|
||||
func (e *Exercice) AddRawFlagKey(name string, t string, placeholder string, ignorecase bool, multiline bool, validator_regexp *string, raw_value []byte, choicescost int64) (*FlagKey, error) {
|
||||
hash, err := ComputeHashedFlag(raw_value, ignorecase, validator_regexp)
|
||||
func (e *Exercice) AddRawFlagKey(name string, t string, placeholder string, ignorecase bool, multiline bool, notrim bool, validator_regexp *string, raw_value []byte, choicescost int64) (*FlagKey, error) {
|
||||
hash, err := ComputeHashedFlag(raw_value, ignorecase, notrim, validator_regexp)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -126,6 +132,7 @@ func (e *Exercice) AddRawFlagKey(name string, t string, placeholder string, igno
|
||||
Label: name,
|
||||
Placeholder: placeholder,
|
||||
IgnoreCase: ignorecase,
|
||||
NoTrim: notrim,
|
||||
Multiline: multiline,
|
||||
ValidatorRegexp: validator_regexp,
|
||||
Checksum: hash[:],
|
||||
@ -159,7 +166,7 @@ func (k *FlagKey) Create(e *Exercice) (Flag, error) {
|
||||
}
|
||||
}
|
||||
|
||||
if res, err := DBExec("INSERT INTO exercice_flags (id_exercice, ordre, label, type, placeholder, help, unit, ignorecase, multiline, validator_regexp, cksum, choices_cost) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", e.Id, k.Order, k.Label, k.Type, k.Placeholder, k.Help, k.Unit, k.IgnoreCase, k.Multiline, k.ValidatorRegexp, k.Checksum, k.ChoicesCost); err != nil {
|
||||
if res, err := DBExec("INSERT INTO exercice_flags (id_exercice, ordre, label, type, placeholder, help, unit, ignorecase, notrim, multiline, validator_regexp, cksum, choices_cost) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", e.Id, k.Order, k.Label, k.Type, k.Placeholder, k.Help, k.Unit, k.IgnoreCase, k.NoTrim, k.Multiline, k.ValidatorRegexp, k.Checksum, k.ChoicesCost); err != nil {
|
||||
return k, err
|
||||
} else if kid, err := res.LastInsertId(); err != nil {
|
||||
return k, err
|
||||
@ -172,7 +179,7 @@ func (k *FlagKey) Create(e *Exercice) (Flag, error) {
|
||||
|
||||
// ComputeChecksum calculates the checksum for a given value.
|
||||
func (k *FlagKey) ComputeChecksum(val []byte) ([]byte, error) {
|
||||
cksum, err := ComputeHashedFlag(val, k.IgnoreCase, k.ValidatorRegexp)
|
||||
cksum, err := ComputeHashedFlag(val, k.IgnoreCase, k.NoTrim, k.ValidatorRegexp)
|
||||
return cksum[:], err
|
||||
}
|
||||
|
||||
@ -184,7 +191,7 @@ func (k *FlagKey) Update() (int64, error) {
|
||||
}
|
||||
}
|
||||
|
||||
if res, err := DBExec("UPDATE exercice_flags SET id_exercice = ?, ordre = ?, label = ?, type = ?, placeholder = ?, help = ?, unit = ?, ignorecase = ?, multiline = ?, validator_regexp = ?, cksum = ?, choices_cost = ? WHERE id_flag = ?", k.IdExercice, k.Order, k.Label, k.Type, k.Placeholder, k.Help, k.Unit, k.IgnoreCase, k.Multiline, k.ValidatorRegexp, k.Checksum, k.ChoicesCost, k.Id); err != nil {
|
||||
if res, err := DBExec("UPDATE exercice_flags SET id_exercice = ?, ordre = ?, label = ?, type = ?, placeholder = ?, help = ?, unit = ?, ignorecase = ?, notrim = ?, multiline = ?, validator_regexp = ?, cksum = ?, choices_cost = ? WHERE id_flag = ?", k.IdExercice, k.Order, k.Label, k.Type, k.Placeholder, k.Help, k.Unit, k.IgnoreCase, k.NoTrim, k.Multiline, k.ValidatorRegexp, k.Checksum, k.ChoicesCost, k.Id); err != nil {
|
||||
return 0, err
|
||||
} else if nb, err := res.RowsAffected(); err != nil {
|
||||
return 0, err
|
||||
|
@ -351,7 +351,7 @@ func MyJSONTeam(t *Team, started bool) (interface{}, error) {
|
||||
}
|
||||
|
||||
if t == nil {
|
||||
h, _ := ComputeHashedFlag([]byte(soluce), false, nil)
|
||||
h, _ := ComputeHashedFlag([]byte(soluce), false, false, nil)
|
||||
m.Soluce = hex.EncodeToString(h[:])
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user