|
|
@ -36,7 +36,7 @@ func EncodeMD5(str string) string { |
|
|
|
return hex.EncodeToString(m.Sum(nil)) |
|
|
|
return hex.EncodeToString(m.Sum(nil)) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Encode string to sha1 hex value.
|
|
|
|
// EncodeSha1 string to sha1 hex value.
|
|
|
|
func EncodeSha1(str string) string { |
|
|
|
func EncodeSha1(str string) string { |
|
|
|
h := sha1.New() |
|
|
|
h := sha1.New() |
|
|
|
h.Write([]byte(str)) |
|
|
|
h.Write([]byte(str)) |
|
|
@ -49,6 +49,7 @@ func ShortSha(sha1 string) string { |
|
|
|
return TruncateString(sha1, 10) |
|
|
|
return TruncateString(sha1, 10) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// DetectEncoding detect the encoding of content
|
|
|
|
func DetectEncoding(content []byte) (string, error) { |
|
|
|
func DetectEncoding(content []byte) (string, error) { |
|
|
|
if utf8.Valid(content) { |
|
|
|
if utf8.Valid(content) { |
|
|
|
log.Debug("Detected encoding: utf-8 (fast)") |
|
|
|
log.Debug("Detected encoding: utf-8 (fast)") |
|
|
@ -65,6 +66,7 @@ func DetectEncoding(content []byte) (string, error) { |
|
|
|
return result.Charset, err |
|
|
|
return result.Charset, err |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// BasicAuthDecode decode basic auth string
|
|
|
|
func BasicAuthDecode(encoded string) (string, string, error) { |
|
|
|
func BasicAuthDecode(encoded string) (string, string, error) { |
|
|
|
s, err := base64.StdEncoding.DecodeString(encoded) |
|
|
|
s, err := base64.StdEncoding.DecodeString(encoded) |
|
|
|
if err != nil { |
|
|
|
if err != nil { |
|
|
@ -75,6 +77,7 @@ func BasicAuthDecode(encoded string) (string, string, error) { |
|
|
|
return auth[0], auth[1], nil |
|
|
|
return auth[0], auth[1], nil |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// BasicAuthEncode encode basic auth string
|
|
|
|
func BasicAuthEncode(username, password string) string { |
|
|
|
func BasicAuthEncode(username, password string) string { |
|
|
|
return base64.StdEncoding.EncodeToString([]byte(username + ":" + password)) |
|
|
|
return base64.StdEncoding.EncodeToString([]byte(username + ":" + password)) |
|
|
|
} |
|
|
|
} |
|
|
@ -94,7 +97,7 @@ func GetRandomString(n int, alphabets ...byte) string { |
|
|
|
return string(bytes) |
|
|
|
return string(bytes) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// http://code.google.com/p/go/source/browse/pbkdf2/pbkdf2.go?repo=crypto
|
|
|
|
// PBKDF2 http://code.google.com/p/go/source/browse/pbkdf2/pbkdf2.go?repo=crypto
|
|
|
|
// FIXME: use https://godoc.org/golang.org/x/crypto/pbkdf2?
|
|
|
|
// FIXME: use https://godoc.org/golang.org/x/crypto/pbkdf2?
|
|
|
|
func PBKDF2(password, salt []byte, iter, keyLen int, h func() hash.Hash) []byte { |
|
|
|
func PBKDF2(password, salt []byte, iter, keyLen int, h func() hash.Hash) []byte { |
|
|
|
prf := hmac.New(h, password) |
|
|
|
prf := hmac.New(h, password) |
|
|
@ -133,7 +136,7 @@ func PBKDF2(password, salt []byte, iter, keyLen int, h func() hash.Hash) []byte |
|
|
|
return dk[:keyLen] |
|
|
|
return dk[:keyLen] |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// verify time limit code
|
|
|
|
// VerifyTimeLimitCode verify time limit code
|
|
|
|
func VerifyTimeLimitCode(data string, minutes int, code string) bool { |
|
|
|
func VerifyTimeLimitCode(data string, minutes int, code string) bool { |
|
|
|
if len(code) <= 18 { |
|
|
|
if len(code) <= 18 { |
|
|
|
return false |
|
|
|
return false |
|
|
@ -160,9 +163,10 @@ func VerifyTimeLimitCode(data string, minutes int, code string) bool { |
|
|
|
return false |
|
|
|
return false |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// TimeLimitCodeLength default value for time limit code
|
|
|
|
const TimeLimitCodeLength = 12 + 6 + 40 |
|
|
|
const TimeLimitCodeLength = 12 + 6 + 40 |
|
|
|
|
|
|
|
|
|
|
|
// create a time limit code
|
|
|
|
// CreateTimeLimitCode create a time limit code
|
|
|
|
// code format: 12 length date time string + 6 minutes string + 40 sha1 encoded string
|
|
|
|
// code format: 12 length date time string + 6 minutes string + 40 sha1 encoded string
|
|
|
|
func CreateTimeLimitCode(data string, minutes int, startInf interface{}) string { |
|
|
|
func CreateTimeLimitCode(data string, minutes int, startInf interface{}) string { |
|
|
|
format := "200601021504" |
|
|
|
format := "200601021504" |
|
|
@ -355,6 +359,7 @@ func timeSince(then time.Time, lang string) string { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// RawTimeSince retrieves i18n key of time since t
|
|
|
|
func RawTimeSince(t time.Time, lang string) string { |
|
|
|
func RawTimeSince(t time.Time, lang string) string { |
|
|
|
return timeSince(t, lang) |
|
|
|
return timeSince(t, lang) |
|
|
|
} |
|
|
|
} |
|
|
@ -364,6 +369,7 @@ func TimeSince(t time.Time, lang string) template.HTML { |
|
|
|
return template.HTML(fmt.Sprintf(`<span class="time-since" title="%s">%s</span>`, t.Format(setting.TimeFormat), timeSince(t, lang))) |
|
|
|
return template.HTML(fmt.Sprintf(`<span class="time-since" title="%s">%s</span>`, t.Format(setting.TimeFormat), timeSince(t, lang))) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Storage space size types
|
|
|
|
const ( |
|
|
|
const ( |
|
|
|
Byte = 1 |
|
|
|
Byte = 1 |
|
|
|
KByte = Byte * 1024 |
|
|
|
KByte = Byte * 1024 |
|
|
@ -413,7 +419,7 @@ func FileSize(s int64) string { |
|
|
|
func Subtract(left interface{}, right interface{}) interface{} { |
|
|
|
func Subtract(left interface{}, right interface{}) interface{} { |
|
|
|
var rleft, rright int64 |
|
|
|
var rleft, rright int64 |
|
|
|
var fleft, fright float64 |
|
|
|
var fleft, fright float64 |
|
|
|
var isInt bool = true |
|
|
|
var isInt = true |
|
|
|
switch left.(type) { |
|
|
|
switch left.(type) { |
|
|
|
case int: |
|
|
|
case int: |
|
|
|
rleft = int64(left.(int)) |
|
|
|
rleft = int64(left.(int)) |
|
|
@ -454,9 +460,8 @@ func Subtract(left interface{}, right interface{}) interface{} { |
|
|
|
|
|
|
|
|
|
|
|
if isInt { |
|
|
|
if isInt { |
|
|
|
return rleft - rright |
|
|
|
return rleft - rright |
|
|
|
} else { |
|
|
|
|
|
|
|
return fleft + float64(rleft) - (fright + float64(rright)) |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return fleft + float64(rleft) - (fright + float64(rright)) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// EllipsisString returns a truncated short string,
|
|
|
|
// EllipsisString returns a truncated short string,
|
|
|
@ -521,10 +526,12 @@ func IsTextFile(data []byte) bool { |
|
|
|
return strings.Index(http.DetectContentType(data), "text/") != -1 |
|
|
|
return strings.Index(http.DetectContentType(data), "text/") != -1 |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// IsImageFile detectes if data is an image format
|
|
|
|
func IsImageFile(data []byte) bool { |
|
|
|
func IsImageFile(data []byte) bool { |
|
|
|
return strings.Index(http.DetectContentType(data), "image/") != -1 |
|
|
|
return strings.Index(http.DetectContentType(data), "image/") != -1 |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// IsPDFFile detectes if data is a pdf format
|
|
|
|
func IsPDFFile(data []byte) bool { |
|
|
|
func IsPDFFile(data []byte) bool { |
|
|
|
return strings.Index(http.DetectContentType(data), "application/pdf") != -1 |
|
|
|
return strings.Index(http.DetectContentType(data), "application/pdf") != -1 |
|
|
|
} |
|
|
|
} |
|
|
|