fork(122) download
  1. --require router and set locals for necessary request info
  2. local router = require("router").new()
  3. --lapis for config
  4. local config = require("lapis.config").get()
  5. --json
  6. local cjson = require("cjson")
  7. --other locals
  8. local resty_random = require "resty.random"
  9. local resty_str = require "resty.string"
  10. local uri_args = ngx.req.get_uri_args()
  11.  
  12. --crypto
  13. local aes = require "resty.aes"
  14. local base64 = require "base64"
  15.  
  16. --temporary dict for valid bundle identifiers and corresponding secret keys
  17. --dict: {
  18. --[
  19. --bundle_id: SECRET_KEY
  20. --]
  21. --}
  22. local valid_ids = {
  23. ['com.venuenextinc.AppLink'] = "78d2e80f4f98a8e9d50a894df8f9a90b"
  24. }
  25.  
  26. --temporary dict for generated AppLink access tokens
  27. local valid_tokens = {
  28. ['com.venuenextinc.AppLink'] = 'a5e01e3cde65d4d85340ef6e653561db'
  29. }
  30.  
  31. -- GET: APP LINK TOKEN
  32. router:get("/venuenext/austin/token/app_link_token.json.enc", function(params)
  33. ngx.header.etag = etag
  34.  
  35. local bundle_id = uri_args['bundleid']
  36.  
  37. if bundle_id == nil then
  38. local response_json = cjson.encode({
  39. error_message = 'No bundle identifier provided.'
  40. })
  41. ngx.status = 400
  42.  
  43. return ngx.print(response_json)
  44. else
  45. local check_bundle_id = valid_ids[bundle_id]
  46.  
  47. if check_bundle_id == nil then
  48. local response_json = cjson.encode({
  49. error_message = 'Bundle identifier provided is invalid.'
  50. })
  51. ngx.status = 400
  52.  
  53. return ngx.print(response_json)
  54. end
  55. end
  56.  
  57. local access_token = valid_tokens[bundle_id]
  58.  
  59. if access_token == nil then
  60. local response_json = cjson.encode({
  61. error_message = 'Cannot create access token'
  62. })
  63. ngx.status = 401
  64.  
  65. return ngx.print(response_json)
  66. end
  67.  
  68. response_json = cjson.encode({applink_token = access_token})
  69.  
  70. -- get secret key
  71. local secret_key = valid_ids[bundle_id]
  72.  
  73. -- aes128 cbc md5 encrypt no IV, no salt
  74. local aes_128_cbc_md5 = aes:new(secret_key)
  75. local encrypted = aes_128_cbc_md5:encrypt(response_json)
  76.  
  77. -- base64 encode then ship off
  78. local base64_encoded = base64.encode(encrypted)
  79.  
  80. ngx.status = 200
  81. return ngx.print(cjson.encode({base64_encoded}))
  82. end)
  83.  
  84. -- GET: VERIFY APP LINK TOKEN
  85. router:get("/venuenext/austin/token/verify", function(params)
  86. ngx.header.etag = etag
  87.  
  88. local bundle_id = uri_args['bundleid']
  89. local enc_app_token = uri_args['applinktoken']
  90.  
  91. -- Check bundle id
  92. if bundle_id == nil then
  93. local response_json = cjson.encode({
  94. error_message = 'No bundle identifier provided.',
  95. errors = cjson.encode({
  96. bundle_id = 'Bundle identifier needs to be provided to Venue Next for valid partner apps.',
  97. enc_app_token = 'AppLink token to be provided from Venue Next app Deep Link and signed with your app\'s SECRET_KEY'
  98. })
  99. })
  100. ngx.status = 400
  101. return ngx.print(response_json)
  102. end
  103.  
  104. -- Check app token
  105. if enc_app_token == nil then
  106. local response_json = cjson.encode({
  107. error_message = 'No signed AppLink token provided.',
  108. errors = cjson.encode({
  109. bundle_id = 'Bundle identifier needs to be provided to Venue Next for valid partner apps.',
  110. enc_app_token = 'AppLink token to be provided from Venue Next app Deep Link and signed with your app\'s SECRET_KEY'
  111. })
  112. })
  113. ngx.status = 400
  114. return ngx.print(response_json)
  115. end
  116.  
  117. return ngx.print(cjson.encode({enc_app_token}))
  118.  
  119. -- Check Bundle Identifier is valid and participating
  120. local check_bundle_id = valid_ids[bundle_id]
  121. local check_token = valid_tokens[bundle_id]
  122.  
  123. if check_bundle_id == nil then
  124. local response_json = cjson.encode({
  125. error_message = 'Bundle identifier provided is invalid.'
  126. })
  127. ngx.status = 400
  128. return ngx.print(response_json)
  129. else
  130. -- base64 decode token
  131. local base64_decoded = base64.decode(enc_app_token)
  132.  
  133. -- aes128 cbc md5 decrypt
  134. local aes_128_cbc_md5 = aes:new(secret_key)
  135. local decrypted = aes_128_cbc_md5:decrypt(base64_decoded)
  136.  
  137. if check_token == decrypted then
  138. ngx.status = 200
  139. return
  140. else
  141. local response_json = cjson.encode({
  142. error_message = 'Token is not valid for bundle identifier provided.',
  143. errors = cjson.encode({
  144. bundle_id = 'Bundle identifier provided is valid.',
  145. enc_app_token = 'Token is not valid for bundle identifier provided.'
  146. })
  147. })
  148.  
  149. ngx.status = 401
  150. return ngx.print(response_json)
  151. end
  152. end
  153. end)
  154.  
  155. -- sends the request parts to be routed
  156. local ok, errmsg = router:execute(ngx.var.request_method, ngx.var.uri, ngx.req.get_uri_args())
  157.  
  158. if not ok then
  159. ngx.status = 404
  160. ngx.log(ngx.STDERR, errmsg)
  161. end
  162.  
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
luac: prog.lua:120: 'end' expected (to close 'function' at line 85) near 'local'
stdout
Standard output is empty