@ -7,6 +7,7 @@ package models
import (
import (
"crypto/tls"
"crypto/tls"
"encoding/binary"
"errors"
"errors"
"fmt"
"fmt"
"net/smtp"
"net/smtp"
@ -70,11 +71,30 @@ var (
_ convert . Conversion = & SSPIConfig { }
_ convert . Conversion = & SSPIConfig { }
)
)
// jsonUnmarshalIgnoreErroneousBOM - due to a bug in xorm (see https://gitea.com/xorm/xorm/pulls/1957) - it's
// jsonUnmarshalHandleDoubleEncode - due to a bug in xorm (see https://gitea.com/xorm/xorm/pulls/1957) - it's
// possible that a Blob may gain an unwanted prefix of 0xff 0xfe.
// possible that a Blob may be double encoded or gain an unwanted prefix of 0xff 0xfe.
func jsonUnmarshalIgnoreErroneousBOM ( bs [ ] byte , v interface { } ) error {
func jsonUnmarshalHandleDoubleEncode ( bs [ ] byte , v interface { } ) error {
json := jsoniter . ConfigCompatibleWithStandardLibrary
json := jsoniter . ConfigCompatibleWithStandardLibrary
err := json . Unmarshal ( bs , v )
err := json . Unmarshal ( bs , v )
if err != nil {
ok := true
rs := [ ] byte { }
temp := make ( [ ] byte , 2 )
for _ , rn := range string ( bs ) {
if rn > 0xffff {
ok = false
break
}
binary . LittleEndian . PutUint16 ( temp , uint16 ( rn ) )
rs = append ( rs , temp ... )
}
if ok {
if rs [ 0 ] == 0xff && rs [ 1 ] == 0xfe {
rs = rs [ 2 : ]
}
err = json . Unmarshal ( rs , v )
}
}
if err != nil && len ( bs ) > 2 && bs [ 0 ] == 0xff && bs [ 1 ] == 0xfe {
if err != nil && len ( bs ) > 2 && bs [ 0 ] == 0xff && bs [ 1 ] == 0xfe {
err = json . Unmarshal ( bs [ 2 : ] , v )
err = json . Unmarshal ( bs [ 2 : ] , v )
}
}
@ -88,7 +108,7 @@ type LDAPConfig struct {
// FromDB fills up a LDAPConfig from serialized format.
// FromDB fills up a LDAPConfig from serialized format.
func ( cfg * LDAPConfig ) FromDB ( bs [ ] byte ) error {
func ( cfg * LDAPConfig ) FromDB ( bs [ ] byte ) error {
err := jsonUnmarshalIgnoreErroneousBOM ( bs , & cfg )
err := jsonUnmarshalHandleDoubleEncode ( bs , & cfg )
if err != nil {
if err != nil {
return err
return err
}
}
@ -129,7 +149,7 @@ type SMTPConfig struct {
// FromDB fills up an SMTPConfig from serialized format.
// FromDB fills up an SMTPConfig from serialized format.
func ( cfg * SMTPConfig ) FromDB ( bs [ ] byte ) error {
func ( cfg * SMTPConfig ) FromDB ( bs [ ] byte ) error {
return jsonUnmarshalIgnoreErroneousBOM ( bs , cfg )
return jsonUnmarshalHandleDoubleEncode ( bs , cfg )
}
}
// ToDB exports an SMTPConfig to a serialized format.
// ToDB exports an SMTPConfig to a serialized format.
@ -146,7 +166,7 @@ type PAMConfig struct {
// FromDB fills up a PAMConfig from serialized format.
// FromDB fills up a PAMConfig from serialized format.
func ( cfg * PAMConfig ) FromDB ( bs [ ] byte ) error {
func ( cfg * PAMConfig ) FromDB ( bs [ ] byte ) error {
return jsonUnmarshalIgnoreErroneousBOM ( bs , cfg )
return jsonUnmarshalHandleDoubleEncode ( bs , cfg )
}
}
// ToDB exports a PAMConfig to a serialized format.
// ToDB exports a PAMConfig to a serialized format.
@ -167,7 +187,7 @@ type OAuth2Config struct {
// FromDB fills up an OAuth2Config from serialized format.
// FromDB fills up an OAuth2Config from serialized format.
func ( cfg * OAuth2Config ) FromDB ( bs [ ] byte ) error {
func ( cfg * OAuth2Config ) FromDB ( bs [ ] byte ) error {
return jsonUnmarshalIgnoreErroneousBOM ( bs , cfg )
return jsonUnmarshalHandleDoubleEncode ( bs , cfg )
}
}
// ToDB exports an SMTPConfig to a serialized format.
// ToDB exports an SMTPConfig to a serialized format.
@ -187,7 +207,7 @@ type SSPIConfig struct {
// FromDB fills up an SSPIConfig from serialized format.
// FromDB fills up an SSPIConfig from serialized format.
func ( cfg * SSPIConfig ) FromDB ( bs [ ] byte ) error {
func ( cfg * SSPIConfig ) FromDB ( bs [ ] byte ) error {
return jsonUnmarshalIgnoreErroneousBOM ( bs , cfg )
return jsonUnmarshalHandleDoubleEncode ( bs , cfg )
}
}
// ToDB exports an SSPIConfig to a serialized format.
// ToDB exports an SSPIConfig to a serialized format.