|
@@ -103,11 +103,10 @@ func validateARN(in string) bool {
|
|
|
return arn.IsARN(in)
|
|
|
}
|
|
|
|
|
|
-func parseIDs(u *url.URL, isValid IDValidator) []string {
|
|
|
+func parseIDs(v url.Values, isValid IDValidator) []string {
|
|
|
const prefix = "id-"
|
|
|
- q := u.Query()
|
|
|
var ids []string
|
|
|
- for k, vs := range q {
|
|
|
+ for k, vs := range v {
|
|
|
// Weed out bad keys, bad value lengths, and non-matching checkbox statuses.
|
|
|
if pos := strings.Index(k, prefix); pos == -1 || len(vs) != 1 || vs[0] != "on" {
|
|
|
continue
|
|
@@ -120,11 +119,11 @@ func parseIDs(u *url.URL, isValid IDValidator) []string {
|
|
|
return ids
|
|
|
}
|
|
|
|
|
|
-func parseMessages(u *url.URL, ids []string) []redriver.Message {
|
|
|
+func parseMessages(v url.Values, ids []string) []redriver.Message {
|
|
|
m := make(map[int]redriver.Message, len(ids))
|
|
|
keyRx := regexp.MustCompile("^(id|mid|rh)-(.+)")
|
|
|
mOK := make(map[int]bool, len(ids))
|
|
|
- for k, vs := range u.Query() {
|
|
|
+ for k, vs := range v {
|
|
|
ms := keyRx.FindStringSubmatch(k)
|
|
|
if len(ms) != 3 || len(vs) != 1 {
|
|
|
continue
|
|
@@ -159,25 +158,27 @@ func parseMessages(u *url.URL, ids []string) []redriver.Message {
|
|
|
|
|
|
func makeConfirmHandler() gin.HandlerFunc {
|
|
|
return func(c *gin.Context) {
|
|
|
+ qName := c.Param("name")
|
|
|
u := c.Request.URL
|
|
|
+ sess := sessions.Default(c)
|
|
|
+ flashes := sess.Flashes()
|
|
|
+ defer func() {
|
|
|
+ _ = sess.Save()
|
|
|
+ }()
|
|
|
+
|
|
|
op := getOp(u)
|
|
|
- // For real data, probably use validateUUID or validateARN.
|
|
|
- ids := parseIDs(u, validateUint)
|
|
|
+ ids := parseIDs(u.Query(), validateUint)
|
|
|
var messages []redriver.Message
|
|
|
if len(ids) == 0 {
|
|
|
op = OpInvalid
|
|
|
messages = nil
|
|
|
} else {
|
|
|
- messages = parseMessages(u, ids)
|
|
|
+ messages = parseMessages(u.Query(), ids)
|
|
|
}
|
|
|
|
|
|
- data := confirms[op] // op is guaranteed to be valid by getOp().
|
|
|
- qName := c.Param("name")
|
|
|
-
|
|
|
- sess := sessions.Default(c)
|
|
|
- flashes := sess.Flashes()
|
|
|
token := csrf.GetToken(c)
|
|
|
- _ = sess.Save()
|
|
|
+
|
|
|
+ data := confirms[op] // op is guaranteed to be valid by getOp().
|
|
|
|
|
|
h := gin.H{
|
|
|
"action": "/queue/" + qName + "/" + string(op),
|