overleaf/services/web/app/coffee/Features/Project/ProjectTokenGenerator.coffee

31 lines
1.2 KiB
CoffeeScript
Raw Normal View History

2017-10-12 06:36:45 -04:00
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 = ''
2017-10-12 06:36:45 -04:00
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}"