2020-08-22 23:27:37 +03:00
|
|
|
package pastes
|
|
|
|
|
2020-08-23 00:24:38 +03:00
|
|
|
import (
|
|
|
|
"github.com/alexedwards/argon2id"
|
|
|
|
"github.com/bwmarrin/snowflake"
|
|
|
|
)
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
snowflakeNode, _ = snowflake.NewNode(1)
|
|
|
|
}
|
|
|
|
|
|
|
|
// snowflakeNode holds the current snowflake node
|
|
|
|
var snowflakeNode *snowflake.Node
|
2020-08-22 23:27:37 +03:00
|
|
|
|
|
|
|
// Paste represents a saved paste
|
|
|
|
type Paste struct {
|
|
|
|
ID snowflake.ID `json:"id" bson:"_id"`
|
|
|
|
Content string `json:"content" bson:"content"`
|
|
|
|
SuggestedSyntaxType string `json:"suggestedSyntaxType" bson:"suggestedSyntaxType"`
|
|
|
|
DeletionToken string `json:"deletionToken" bson:"deletionToken"`
|
|
|
|
}
|
2020-08-23 00:24:38 +03:00
|
|
|
|
|
|
|
// Create creates a new paste object using the given content
|
|
|
|
func Create(content string) (*Paste, error) {
|
|
|
|
// TODO: Generate the suggested syntax type
|
|
|
|
suggestedSyntaxType := ""
|
|
|
|
|
|
|
|
// Generate the deletion token
|
|
|
|
deletionToken, err := generateDeletionToken()
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
// Return the paste object
|
|
|
|
return &Paste{
|
|
|
|
ID: snowflakeNode.Generate(),
|
|
|
|
Content: content,
|
|
|
|
SuggestedSyntaxType: suggestedSyntaxType,
|
|
|
|
DeletionToken: deletionToken,
|
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// HashDeletionToken hashes the current deletion token of a paste
|
|
|
|
func (paste *Paste) HashDeletionToken() error {
|
|
|
|
hash, err := argon2id.CreateHash(paste.DeletionToken, argon2id.DefaultParams)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
paste.DeletionToken = hash
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// CheckDeletionToken checks whether or not the given deletion token is correct
|
|
|
|
func (paste *Paste) CheckDeletionToken(deletionToken string) bool {
|
|
|
|
match, err := argon2id.ComparePasswordAndHash(deletionToken, paste.DeletionToken)
|
|
|
|
return err != nil && match
|
|
|
|
}
|