Fix attachment parsing.
Shorten some things to reduce boilerplate. Save some allocations.
This commit is contained in:
parent
4d9dc76392
commit
02cb64d3d9
|
@ -29,9 +29,10 @@ var regLogStmts RegLogStmts
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
DbInits.Add(func(acc *qgen.Accumulator) error {
|
DbInits.Add(func(acc *qgen.Accumulator) error {
|
||||||
|
rl := "registration_logs"
|
||||||
regLogStmts = RegLogStmts{
|
regLogStmts = RegLogStmts{
|
||||||
update: acc.Update("registration_logs").Set("username = ?, email = ?, failureReason = ?, success = ?").Where("rlid = ?").Prepare(),
|
update: acc.Update(rl).Set("username = ?, email = ?, failureReason = ?, success = ?").Where("rlid = ?").Prepare(),
|
||||||
create: acc.Insert("registration_logs").Columns("username, email, failureReason, success, ipaddress, doneAt").Fields("?,?,?,?,?,UTC_TIMESTAMP()").Prepare(),
|
create: acc.Insert(rl).Columns("username, email, failureReason, success, ipaddress, doneAt").Fields("?,?,?,?,?,UTC_TIMESTAMP()").Prepare(),
|
||||||
}
|
}
|
||||||
return acc.FirstError()
|
return acc.FirstError()
|
||||||
})
|
})
|
||||||
|
@ -65,9 +66,10 @@ type SQLRegLogStore struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewRegLogStore(acc *qgen.Accumulator) (*SQLRegLogStore, error) {
|
func NewRegLogStore(acc *qgen.Accumulator) (*SQLRegLogStore, error) {
|
||||||
|
rl := "registration_logs"
|
||||||
return &SQLRegLogStore{
|
return &SQLRegLogStore{
|
||||||
count: acc.Count("registration_logs").Prepare(),
|
count: acc.Count(rl).Prepare(),
|
||||||
getOffset: acc.Select("registration_logs").Columns("rlid, username, email, failureReason, success, ipaddress, doneAt").Orderby("doneAt DESC").Limit("?,?").Prepare(),
|
getOffset: acc.Select(rl).Columns("rlid, username, email, failureReason, success, ipaddress, doneAt").Orderby("doneAt DESC").Limit("?,?").Prepare(),
|
||||||
}, acc.FirstError()
|
}, acc.FirstError()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -116,9 +118,10 @@ var loginLogStmts LoginLogStmts
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
DbInits.Add(func(acc *qgen.Accumulator) error {
|
DbInits.Add(func(acc *qgen.Accumulator) error {
|
||||||
|
ll := "login_logs"
|
||||||
loginLogStmts = LoginLogStmts{
|
loginLogStmts = LoginLogStmts{
|
||||||
update: acc.Update("login_logs").Set("uid = ?, success = ?").Where("lid = ?").Prepare(),
|
update: acc.Update(ll).Set("uid = ?, success = ?").Where("lid = ?").Prepare(),
|
||||||
create: acc.Insert("login_logs").Columns("uid, success, ipaddress, doneAt").Fields("?,?,?,UTC_TIMESTAMP()").Prepare(),
|
create: acc.Insert(ll).Columns("uid, success, ipaddress, doneAt").Fields("?,?,?,UTC_TIMESTAMP()").Prepare(),
|
||||||
}
|
}
|
||||||
return acc.FirstError()
|
return acc.FirstError()
|
||||||
})
|
})
|
||||||
|
@ -154,10 +157,11 @@ type SQLLoginLogStore struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewLoginLogStore(acc *qgen.Accumulator) (*SQLLoginLogStore, error) {
|
func NewLoginLogStore(acc *qgen.Accumulator) (*SQLLoginLogStore, error) {
|
||||||
|
ll := "login_logs"
|
||||||
return &SQLLoginLogStore{
|
return &SQLLoginLogStore{
|
||||||
count: acc.Count("login_logs").Prepare(),
|
count: acc.Count(ll).Prepare(),
|
||||||
countForUser: acc.Count("login_logs").Where("uid = ?").Prepare(),
|
countForUser: acc.Count(ll).Where("uid = ?").Prepare(),
|
||||||
getOffsetByUser: acc.Select("login_logs").Columns("lid, success, ipaddress, doneAt").Where("uid = ?").Orderby("doneAt DESC").Limit("?,?").Prepare(),
|
getOffsetByUser: acc.Select(ll).Columns("lid, success, ipaddress, doneAt").Where("uid = ?").Orderby("doneAt DESC").Limit("?,?").Prepare(),
|
||||||
}, acc.FirstError()
|
}, acc.FirstError()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -701,8 +701,8 @@ func validateURLString(data string) bool {
|
||||||
|
|
||||||
// ? - There should only be one : and that's only if the URL is on a non-standard port. Same for ?s.
|
// ? - There should only be one : and that's only if the URL is on a non-standard port. Same for ?s.
|
||||||
for ; len(data) > i; i++ {
|
for ; len(data) > i; i++ {
|
||||||
char := data[i]
|
ch := data[i] // char
|
||||||
if char != '\\' && char != '_' && char != ':' && char != '?' && char != '&' && char != '=' && char != ';' && char != '@' && char != '#' && char != ']' && !(char > 44 && char < 58) && !(char > 64 && char < 92) && !(char > 96 && char < 123) { // 90 is Z, 91 is [
|
if ch != '\\' && ch != '_' && ch != ':' && ch != '?' && ch != '&' && ch != '=' && ch != ';' && ch != '@' && ch != '#' && ch != ']' && !(ch > 44 && ch < 58) && !(ch > 64 && ch < 92) && !(ch > 96 && ch < 123) { // 90 is Z, 91 is [
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -727,8 +727,8 @@ func validatedURLBytes(data []byte) (url []byte) {
|
||||||
|
|
||||||
// ? - There should only be one : and that's only if the URL is on a non-standard port. Same for ?s.
|
// ? - There should only be one : and that's only if the URL is on a non-standard port. Same for ?s.
|
||||||
for ; datalen > i; i++ {
|
for ; datalen > i; i++ {
|
||||||
char := data[i]
|
ch := data[i] //char
|
||||||
if char != '\\' && char != '_' && char != ':' && char != '?' && char != '&' && char != '=' && char != ';' && char != '@' && char != '#' && char != ']' && !(char > 44 && char < 58) && !(char > 64 && char < 92) && !(char > 96 && char < 123) { // 90 is Z, 91 is [
|
if ch != '\\' && ch != '_' && ch != ':' && ch != '?' && ch != '&' && ch != '=' && ch != ';' && ch != '@' && ch != '#' && ch != ']' && !(ch > 44 && ch < 58) && !(ch > 64 && ch < 92) && !(ch > 96 && ch < 123) { // 90 is Z, 91 is [
|
||||||
return InvalidURL
|
return InvalidURL
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -755,8 +755,8 @@ func PartialURLString(data string) (url []byte) {
|
||||||
|
|
||||||
// ? - There should only be one : and that's only if the URL is on a non-standard port. Same for ?s.
|
// ? - There should only be one : and that's only if the URL is on a non-standard port. Same for ?s.
|
||||||
for ; end >= i; i++ {
|
for ; end >= i; i++ {
|
||||||
char := data[i]
|
ch := data[i] // char
|
||||||
if char != '\\' && char != '_' && char != ':' && char != '?' && char != '&' && char != '=' && char != ';' && char != '@' && char != '#' && char != ']' && !(char > 44 && char < 58) && !(char > 64 && char < 92) && !(char > 96 && char < 123) { // 90 is Z, 91 is [
|
if ch != '\\' && ch != '_' && ch != ':' && ch != '?' && ch != '&' && ch != '=' && ch != ';' && ch != '@' && ch != '#' && ch != ']' && !(ch > 44 && ch < 58) && !(ch > 64 && ch < 92) && !(ch > 96 && ch < 123) { // 90 is Z, 91 is [
|
||||||
end = i
|
end = i
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -791,12 +791,12 @@ func PartialURLStringLen(data string) (int, bool) {
|
||||||
f := i
|
f := i
|
||||||
//fmt.Println("f:",f)
|
//fmt.Println("f:",f)
|
||||||
for ; len(data) > i; i++ {
|
for ; len(data) > i; i++ {
|
||||||
char := data[i]
|
ch := data[i] //char
|
||||||
if char < 33 { // space and invisibles
|
if ch < 33 { // space and invisibles
|
||||||
//fmt.Println("e2:",i)
|
//fmt.Println("e2:",i)
|
||||||
return i, i != f
|
return i, i != f
|
||||||
} else if char != '\\' && char != '_' && char != ':' && char != '?' && char != '&' && char != '=' && char != ';' && char != '@' && char != '#' && char != ']' && !(char > 44 && char < 58) && !(char > 64 && char < 92) && !(char > 96 && char < 123) { // 90 is Z, 91 is [
|
} else if ch != '\\' && ch != '_' && ch != ':' && ch != '?' && ch != '&' && ch != '=' && ch != ';' && ch != '@' && ch != '#' && ch != ']' && !(ch > 44 && ch < 58) && !(ch > 64 && ch < 92) && !(ch > 96 && ch < 123) { // 90 is Z, 91 is [
|
||||||
//log.Print("Bad Character: ", char)
|
//log.Print("Bad Character: ", ch)
|
||||||
//fmt.Println("e3")
|
//fmt.Println("e3")
|
||||||
return i, false
|
return i, false
|
||||||
}
|
}
|
||||||
|
@ -829,9 +829,9 @@ func PartialURLStringLen2(data string) int {
|
||||||
|
|
||||||
// ? - There should only be one : and that's only if the URL is on a non-standard port. Same for ?s.
|
// ? - There should only be one : and that's only if the URL is on a non-standard port. Same for ?s.
|
||||||
for ; len(data) > i; i++ {
|
for ; len(data) > i; i++ {
|
||||||
char := data[i]
|
ch := data[i] //char
|
||||||
if char != '\\' && char != '_' && char != ':' && char != '?' && char != '&' && char != '=' && char != ';' && char != '@' && char != '#' && !(char > 44 && char < 58) && !(char > 64 && char < 91) && !(char > 96 && char < 123) { // 90 is Z, 91 is [
|
if ch != '\\' && ch != '_' && ch != ':' && ch != '?' && ch != '&' && ch != '=' && ch != ';' && ch != '@' && ch != '#' && !(ch > 44 && ch < 58) && !(ch > 64 && ch < 91) && !(ch > 96 && ch < 123) { // 90 is Z, 91 is [
|
||||||
//log.Print("Bad Character: ", char)
|
//log.Print("Bad Character: ", ch)
|
||||||
return i
|
return i
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -857,20 +857,19 @@ func parseMediaString(data string) (media MediaEmbed, ok bool) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return media, false
|
return media, false
|
||||||
}
|
}
|
||||||
|
host := uurl.Hostname()
|
||||||
hostname := uurl.Hostname()
|
|
||||||
scheme := uurl.Scheme
|
scheme := uurl.Scheme
|
||||||
port := uurl.Port()
|
port := uurl.Port()
|
||||||
query, err := url.ParseQuery(uurl.RawQuery)
|
query, err := url.ParseQuery(uurl.RawQuery)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return media, false
|
return media, false
|
||||||
}
|
}
|
||||||
//log.Print("hostname:",hostname)
|
//fmt.Println("host:", host)
|
||||||
//log.Print("Site.URL:",Site.URL)
|
//log.Print("Site.URL:",Site.URL)
|
||||||
|
|
||||||
samesite := hostname == "localhost" || hostname == "127.0.0.1" || hostname == "::1" || hostname == Site.URL
|
samesite := host == "localhost" || host == "127.0.0.1" || host == "::1" || host == Site.URL
|
||||||
if samesite {
|
if samesite {
|
||||||
hostname = strings.Split(Site.URL, ":")[0]
|
host = strings.Split(Site.URL, ":")[0]
|
||||||
// ?- Test this as I'm not sure it'll do what it should. If someone's running SSL on port 80 or non-SSL on port 443 then... Well... They're in far worse trouble than this...
|
// ?- Test this as I'm not sure it'll do what it should. If someone's running SSL on port 80 or non-SSL on port 443 then... Well... They're in far worse trouble than this...
|
||||||
port = Site.Port
|
port = Site.Port
|
||||||
if Site.EnableSsl {
|
if Site.EnableSsl {
|
||||||
|
@ -885,13 +884,13 @@ func parseMediaString(data string) (media MediaEmbed, ok bool) {
|
||||||
path := uurl.EscapedPath()
|
path := uurl.EscapedPath()
|
||||||
pathFrags := strings.Split(path, "/")
|
pathFrags := strings.Split(path, "/")
|
||||||
if len(pathFrags) >= 2 {
|
if len(pathFrags) >= 2 {
|
||||||
if samesite && pathFrags[1] == "attachs" && (scheme == "http" || scheme == "https") {
|
if samesite && pathFrags[1] == "attachs" && (scheme == "http:" || scheme == "https:") {
|
||||||
var sport string
|
var sport string
|
||||||
// ? - Assumes the sysadmin hasn't mixed up the two standard ports
|
// ? - Assumes the sysadmin hasn't mixed up the two standard ports
|
||||||
if port != "443" && port != "80" && port != "" {
|
if port != "443" && port != "80" && port != "" {
|
||||||
sport = ":" + port
|
sport = ":" + port
|
||||||
}
|
}
|
||||||
media.URL = scheme + "//" + hostname + sport + path
|
media.URL = scheme + "//" + host + sport + path
|
||||||
extarr := strings.Split(path, ".")
|
extarr := strings.Split(path, ".")
|
||||||
if len(extarr) == 0 {
|
if len(extarr) == 0 {
|
||||||
// TODO: Write a unit test for this
|
// TODO: Write a unit test for this
|
||||||
|
@ -909,7 +908,7 @@ func parseMediaString(data string) (media MediaEmbed, ok bool) {
|
||||||
|
|
||||||
// ? - I don't think this hostname will hit every YT domain
|
// ? - I don't think this hostname will hit every YT domain
|
||||||
// TODO: Make this a more customisable handler rather than hard-coding it in here
|
// TODO: Make this a more customisable handler rather than hard-coding it in here
|
||||||
if strings.HasSuffix(hostname, ".youtube.com") && path == "/watch" {
|
if strings.HasSuffix(host, ".youtube.com") && path == "/watch" {
|
||||||
video, ok := query["v"]
|
video, ok := query["v"]
|
||||||
if ok && len(video) >= 1 && video[0] != "" {
|
if ok && len(video) >= 1 && video[0] != "" {
|
||||||
media.Type = "raw"
|
media.Type = "raw"
|
||||||
|
@ -929,7 +928,7 @@ func parseMediaString(data string) (media MediaEmbed, ok bool) {
|
||||||
if port != "443" && port != "80" && port != "" {
|
if port != "443" && port != "80" && port != "" {
|
||||||
sport = ":" + port
|
sport = ":" + port
|
||||||
}
|
}
|
||||||
media.URL = scheme + "//" + hostname + sport + path
|
media.URL = scheme + "//" + host + sport + path
|
||||||
return media, true
|
return media, true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -947,8 +946,8 @@ func parseMediaString(data string) (media MediaEmbed, ok bool) {
|
||||||
if len(uurl.Fragment) > 0 {
|
if len(uurl.Fragment) > 0 {
|
||||||
frag = "#" + uurl.Fragment
|
frag = "#" + uurl.Fragment
|
||||||
}
|
}
|
||||||
media.URL = scheme + "//" + hostname + sport + path + q + frag
|
media.URL = scheme + "//" + host + sport + path + q + frag
|
||||||
media.FURL = hostname + sport + path + q + frag
|
media.FURL = host + sport + path + q + frag
|
||||||
|
|
||||||
return media, true
|
return media, true
|
||||||
}
|
}
|
||||||
|
|
|
@ -179,7 +179,7 @@ func RebuildGroupPermissions(group *Group) error {
|
||||||
log.Print("Reloading a group")
|
log.Print("Reloading a group")
|
||||||
|
|
||||||
// TODO: Avoid re-initting this all the time
|
// TODO: Avoid re-initting this all the time
|
||||||
getGroupPerms, err := qgen.Builder.SimpleSelect("users_groups", "permissions", "gid = ?", "", "")
|
getGroupPerms, err := qgen.Builder.SimpleSelect("users_groups", "permissions", "gid=?", "", "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -66,14 +66,18 @@ func InitPluginLangs() error {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
e := func(field string, name string) error {
|
||||||
|
return errors.New("The "+field+" field must not be blank on plugin '" + name + "'")
|
||||||
|
}
|
||||||
|
|
||||||
if plugin.UName == "" {
|
if plugin.UName == "" {
|
||||||
return errors.New("The UName field must not be blank on plugin '" + pluginItem + "'")
|
return e("UName",pluginItem)
|
||||||
}
|
}
|
||||||
if plugin.Name == "" {
|
if plugin.Name == "" {
|
||||||
return errors.New("The Name field must not be blank on plugin '" + pluginItem + "'")
|
return e("Name",pluginItem)
|
||||||
}
|
}
|
||||||
if plugin.Author == "" {
|
if plugin.Author == "" {
|
||||||
return errors.New("The Author field must not be blank on plugin '" + pluginItem + "'")
|
return e("Author",pluginItem)
|
||||||
}
|
}
|
||||||
if plugin.Main == "" {
|
if plugin.Main == "" {
|
||||||
return errors.New("Couldn't find a main file for plugin '" + pluginItem + "'")
|
return errors.New("Couldn't find a main file for plugin '" + pluginItem + "'")
|
||||||
|
|
Loading…
Reference in New Issue