-
Notifications
You must be signed in to change notification settings - Fork 0
/
search.go
117 lines (105 loc) · 3.19 KB
/
search.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
//go:build !exclude_pages_formats && !exclude_pages_format_njn
// Copyright (c) 2022 The Go-Enjin Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package index
import (
"fmt"
"html"
"net/url"
"github.com/go-corelibs/slices"
"github.com/go-corelibs/x-text/message"
"github.com/go-enjin/be/pkg/forms"
"github.com/go-enjin/be/pkg/log"
"github.com/go-enjin/be/pkg/request/argv"
)
func (f *CBlock) handleSearchRedirect(blockTag, nonceKey string, viewKeys []string, reqArgv *argv.Argv) (redirect string, err error) {
langMode := f.Enjin.SiteLanguageMode()
defTag := f.Enjin.SiteDefaultLanguage()
// tag := lang.GetTag(r)
printer := message.GetPrinter(reqArgv.Request)
var query string
var foundNonce, foundQuery bool
for k, v := range reqArgv.Request.URL.Query() {
switch k {
case "nonce":
var value string
if vv, e := url.QueryUnescape(v[0]); e != nil {
log.ErrorF("error un-escaping url path: %v", e)
} else {
value = forms.StrictSanitize(vv)
}
if f.Enjin.VerifyNonce(nonceKey, value) {
foundNonce = true
} else {
err = fmt.Errorf(printer.Sprintf("search form expired"))
break
}
case "query":
if vv, e := url.QueryUnescape(v[0]); e != nil {
log.ErrorF("error un-escaping url path: %v", e)
} else {
query = html.UnescapeString(vv)
query = forms.StrictSanitize(query)
}
foundQuery = true
}
if foundQuery && foundNonce || err != nil {
break
}
}
if err != nil {
log.ErrorF("index block search redirect error: %v", err)
err = nil
target := blockTag
var argvs [][]string
for _, argvArgs := range reqArgv.Argv {
var args []string
for _, arg := range argvArgs {
if target == blockTag && slices.Within(arg, viewKeys) {
target += "-" + arg
}
if skip := arg != "" && arg[0] == '(' && arg[len(arg)-1] == ')'; !skip {
args = append(args, arg)
}
}
argvs = append(argvs, args)
}
reqArgv.Argv = argvs
redirect = langMode.ToUrl(defTag, reqArgv.Language, reqArgv.String()) + "#" + target
return
}
if foundQuery && foundNonce {
for idx, argvArgs := range reqArgv.Argv {
if len(argvArgs) > 0 && argvArgs[0] == blockTag {
target := blockTag
for jdx, arg := range argvArgs {
if target == blockTag && slices.Within(arg, viewKeys) {
target += "-" + arg
}
if arg != "" && arg[0] == '(' && arg[len(arg)-1] == ')' {
if arg[1:len(arg)-1] != "" {
reqArgv.Argv[idx] = append(reqArgv.Argv[idx][:jdx], reqArgv.Argv[idx][jdx+1:]...)
}
}
}
if query != "" {
reqArgv.Argv[idx] = append(reqArgv.Argv[idx], "("+query+")")
}
redirect = langMode.ToUrl(defTag, reqArgv.Language, reqArgv.String()) + "#" + target
return
}
}
}
return
}