Skip to content
Snippets Groups Projects
Commit a08978a9 authored by Dean's avatar Dean
Browse files

version 1.6.6: fix slashes in keys in database

parent 5b1f7cdf
No related branches found
No related tags found
No related merge requests found
...@@ -26,10 +26,9 @@ func SelectUserByToken(token string) (User, error) { ...@@ -26,10 +26,9 @@ func SelectUserByToken(token string) (User, error) {
// ObjectKeyExists returns a boolean specifying if the given key is already in // ObjectKeyExists returns a boolean specifying if the given key is already in
// use by another object. // use by another object.
func ObjectKeyExists(key string) (bool, error) { func ObjectKeyExists(bucket, key string) (bool, error) {
var count int var count int
err := DB.QueryRow(countOfObjectByBucketAndRandomKey, "public", key). err := DB.QueryRow(countOfObjectByBucketAndRandomKey, bucket, key).Scan(&count)
Scan(&count)
if err != nil { if err != nil {
return false, err return false, err
} }
...@@ -38,7 +37,16 @@ func ObjectKeyExists(key string) (bool, error) { ...@@ -38,7 +37,16 @@ func ObjectKeyExists(key string) (bool, error) {
// InsertShortURL inserts a short URL object into the database. // InsertShortURL inserts a short URL object into the database.
func InsertShortURL(bucket, key, destURL string, associatedUser *string) error { func InsertShortURL(bucket, key, destURL string, associatedUser *string) error {
result, err := DB.Exec(insertShortURL, fmt.Sprintf("%s/%s", bucket, key), key, destURL, associatedUser) if !strings.HasPrefix(key, "/") {
key = "/" + key
}
result, err := DB.Exec(insertShortURL,
bucket+key,
bucket,
key,
key[1:],
destURL,
associatedUser)
if err != nil { if err != nil {
return err return err
} }
...@@ -54,10 +62,14 @@ func InsertShortURL(bucket, key, destURL string, associatedUser *string) error { ...@@ -54,10 +62,14 @@ func InsertShortURL(bucket, key, destURL string, associatedUser *string) error {
// InsertFile inserts a file object into the database. // InsertFile inserts a file object into the database.
func InsertFile(bucket, key, ext, contentType string, contentLength int64, md5Hash string, associatedUser *string) error { func InsertFile(bucket, key, ext, contentType string, contentLength int64, md5Hash string, associatedUser *string) error {
if !strings.HasPrefix(key, "/") {
key = "/" + key
}
result, err := DB.Exec(insertFile, result, err := DB.Exec(insertFile,
fmt.Sprintf("%s/%s", bucket, key+ext), bucket+key,
bucket,
key+ext, key+ext,
key, key[1:],
contentType, contentType,
contentLength, contentLength,
md5Hash, md5Hash,
......
...@@ -31,14 +31,14 @@ var insertShortURL = ` ...@@ -31,14 +31,14 @@ var insertShortURL = `
INSERT INTO INSERT INTO
objects (bucket_key, bucket, key, random_key, dir, type, dest_url, content_type, associated_user) objects (bucket_key, bucket, key, random_key, dir, type, dest_url, content_type, associated_user)
VALUES VALUES
($1, 'public', $2, $2, '/', 1, $3, NULL, $4) ($1, $2, $3, $4, '/', 1, $5, NULL, $6)
` `
var insertFile = ` var insertFile = `
INSERT INTO INSERT INTO
objects (bucket_key, bucket, key, random_key, dir, content_type, content_length, md5_hash, associated_user) objects (bucket_key, bucket, key, random_key, dir, content_type, content_length, md5_hash, associated_user)
VALUES VALUES
($1, 'public', $2, $3, '/', $4, $5, $6, $7) ($1, $2, $3, $4, '/', $5, $6, $7, $8)
` `
var selectUserByUsernameOrEmail = ` var selectUserByUsernameOrEmail = `
......
...@@ -86,7 +86,8 @@ func ShortenPolr(associateObjectsWithUser bool) func(http.ResponseWriter, *http. ...@@ -86,7 +86,8 @@ func ShortenPolr(associateObjectsWithUser bool) func(http.ResponseWriter, *http.
} }
// Generate available random key // Generate available random key
key, err := util.GenerateAvailableKey(5) // maximum of 5 attempts to generate a key bucket := viper.GetString("database.objectBucket")
key, err := util.GenerateAvailableKey(bucket, 5)
if err != nil { if err != nil {
log.Error().Err(err).Msg("failed to generate short URL key") log.Error().Err(err).Msg("failed to generate short URL key")
panic(apierrors.InternalServerErrorPolr) panic(apierrors.InternalServerErrorPolr)
...@@ -97,7 +98,6 @@ func ShortenPolr(associateObjectsWithUser bool) func(http.ResponseWriter, *http. ...@@ -97,7 +98,6 @@ func ShortenPolr(associateObjectsWithUser bool) func(http.ResponseWriter, *http.
if associateObjectsWithUser { if associateObjectsWithUser {
associatedUser = &user.ID associatedUser = &user.ID
} }
bucket := viper.GetString("database.objectBucket")
err = db.InsertShortURL(bucket, key, urlString, associatedUser) err = db.InsertShortURL(bucket, key, urlString, associatedUser)
if err != nil { if err != nil {
log.Error().Err(err).Msg("failed to insert short URL object") log.Error().Err(err).Msg("failed to insert short URL object")
......
...@@ -127,7 +127,8 @@ func UploadPomf(associateObjectsWithUser bool) func(http.ResponseWriter, *http.R ...@@ -127,7 +127,8 @@ func UploadPomf(associateObjectsWithUser bool) func(http.ResponseWriter, *http.R
} }
// Generate a file key // Generate a file key
key, err := util.GenerateAvailableKey(5) bucket := viper.GetString("database.objectBucket")
key, err := util.GenerateAvailableKey(bucket, 5)
if err != nil { if err != nil {
log.Error().Err(err).Msg("failed to generate available key within 5 attempts for file object") log.Error().Err(err).Msg("failed to generate available key within 5 attempts for file object")
if len(files) == 1 { if len(files) == 1 {
...@@ -225,7 +226,6 @@ func UploadPomf(associateObjectsWithUser bool) func(http.ResponseWriter, *http.R ...@@ -225,7 +226,6 @@ func UploadPomf(associateObjectsWithUser bool) func(http.ResponseWriter, *http.R
if associateObjectsWithUser { if associateObjectsWithUser {
associatedUser = &user.ID associatedUser = &user.ID
} }
bucket := viper.GetString("database.objectBucket")
err = db.InsertFile(bucket, key, ext, contentType, file.Size, md5Hash, associatedUser) err = db.InsertFile(bucket, key, ext, contentType, file.Size, md5Hash, associatedUser)
if err != nil { if err != nil {
log.Error().Err(err).Msg("failed to create DB object for file upload") log.Error().Err(err).Msg("failed to create DB object for file upload")
......
...@@ -25,15 +25,15 @@ func GenerateRandomKey() (string, error) { ...@@ -25,15 +25,15 @@ func GenerateRandomKey() (string, error) {
} }
// GenerateAvailableKey runs GenerateRandomKey and verifies that the generated // GenerateAvailableKey runs GenerateRandomKey and verifies that the generated
// key isn't already being used. // key isn't already being used in the given bucket.
func GenerateAvailableKey(maxAttempts int) (string, error) { func GenerateAvailableKey(bucket string, maxAttempts int) (string, error) {
for n := 0; n < maxAttempts; n++ { for n := 0; n < maxAttempts; n++ {
key, err := GenerateRandomKey() key, err := GenerateRandomKey()
if err != nil { if err != nil {
return "", errors.Wrap(err, "failed to generate random key") return "", errors.Wrap(err, "failed to generate random key")
} }
exists, err := db.ObjectKeyExists(key) exists, err := db.ObjectKeyExists(bucket, key)
if err != nil { if err != nil {
return "", errors.Wrapf(err, `failed to check if object exists with key "%s"`, key) return "", errors.Wrapf(err, `failed to check if object exists with key "%s"`, key)
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment