| 123456789101112131415161718192021222324252627282930 |
- crypto = require 'crypto'
- # This module mirrors the token generation in Overleaf (`random_token.rb`),
- # for the purposes of implementing token-based project access, like the
- # 'unlisted-projects' feature in Overleaf
- module.exports = ProjectTokenGenerator =
- # (From Overleaf `random_token.rb`)
- # Letters (not numbers! see generate_token) used in tokens. They're all
- # consonants, to avoid embarassing words (I can't think of any that use only
- # a y), and lower case "l" is omitted, because in many fonts it is
- # indistinguishable from an upper case "I" (and sometimes even the number 1).
- TOKEN_ALPHA: 'bcdfghjkmnpqrstvwxyz'
- # Generate a 12-char token with only characters from TOKEN_ALPHA,
- # suitable for use as a read-only token for a project
- readOnlyToken: () ->
- length = 12
- tokenAlpha = ProjectTokenGenerator.TOKEN_ALPHA
- result = ''
- crypto.randomBytes(length).map( (a) -> result += tokenAlpha[a % tokenAlpha.length] )
- return result
- # Generate a longer token, with a numeric prefix,
- # suitable for use as a read-and-write token for a project
- readAndWriteToken: () ->
- numerics = Math.random().toString().slice(2, 12)
- token = ProjectTokenGenerator.readOnlyToken()
- return "#{numerics}#{token}"
|