platform 3.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (480) hide show
  1. data/.gitignore +21 -0
  2. data/.rspec +2 -0
  3. data/Gemfile +14 -0
  4. data/Gemfile.lock +191 -0
  5. data/MIT-LICENSE +20 -0
  6. data/README.rdoc +5 -0
  7. data/Rakefile +37 -0
  8. data/app/assets/images/platform/.gitkeep +0 -0
  9. data/app/assets/images/platform/accept.png +0 -0
  10. data/app/assets/images/platform/action_tab_bkgd.gif +0 -0
  11. data/app/assets/images/platform/action_tab_white_bkgd.gif +0 -0
  12. data/app/assets/images/platform/add.png +0 -0
  13. data/app/assets/images/platform/apps/app_icon.gif +0 -0
  14. data/app/assets/images/platform/apps/app_logo.gif +0 -0
  15. data/app/assets/images/platform/arrow_down.gif +0 -0
  16. data/app/assets/images/platform/arrow_down.png +0 -0
  17. data/app/assets/images/platform/arrow_down_grey.png +0 -0
  18. data/app/assets/images/platform/arrow_right.gif +0 -0
  19. data/app/assets/images/platform/arrow_up.png +0 -0
  20. data/app/assets/images/platform/arrow_up_grey.png +0 -0
  21. data/app/assets/images/platform/bullet_go.png +0 -0
  22. data/app/assets/images/platform/buttons.png +0 -0
  23. data/app/assets/images/platform/cancel.png +0 -0
  24. data/app/assets/images/platform/clipboard_icon.gif +0 -0
  25. data/app/assets/images/platform/close.gif +0 -0
  26. data/app/assets/images/platform/cross.png +0 -0
  27. data/app/assets/images/platform/default_app_icon.gif +0 -0
  28. data/app/assets/images/platform/default_app_logo.gif +0 -0
  29. data/app/assets/images/platform/delete.png +0 -0
  30. data/app/assets/images/platform/disk.png +0 -0
  31. data/app/assets/images/platform/exclamation.png +0 -0
  32. data/app/assets/images/platform/eye.png +0 -0
  33. data/app/assets/images/platform/eye_not.png +0 -0
  34. data/app/assets/images/platform/field_sprite.gif +0 -0
  35. data/app/assets/images/platform/find.png +0 -0
  36. data/app/assets/images/platform/globe.gif +0 -0
  37. data/app/assets/images/platform/help.png +0 -0
  38. data/app/assets/images/platform/help/app_reg.png +0 -0
  39. data/app/assets/images/platform/help/app_reg_ext.png +0 -0
  40. data/app/assets/images/platform/help/app_reg_web.png +0 -0
  41. data/app/assets/images/platform/help/auth_desktop.png +0 -0
  42. data/app/assets/images/platform/help/auth_iframe.png +0 -0
  43. data/app/assets/images/platform/help/auth_iphone.png +0 -0
  44. data/app/assets/images/platform/help/auth_web.png +0 -0
  45. data/app/assets/images/platform/help/authorize.png +0 -0
  46. data/app/assets/images/platform/help/ext.png +0 -0
  47. data/app/assets/images/platform/help/login.png +0 -0
  48. data/app/assets/images/platform/help/login_desktop.png +0 -0
  49. data/app/assets/images/platform/help/login_iphone.png +0 -0
  50. data/app/assets/images/platform/help/login_web.png +0 -0
  51. data/app/assets/images/platform/help2.png +0 -0
  52. data/app/assets/images/platform/information.png +0 -0
  53. data/app/assets/images/platform/keyboard.png +0 -0
  54. data/app/assets/images/platform/language_selector_arrow.gif +0 -0
  55. data/app/assets/images/platform/left_quote.png +0 -0
  56. data/app/assets/images/platform/lightning.png +0 -0
  57. data/app/assets/images/platform/loading.gif +0 -0
  58. data/app/assets/images/platform/loading2.gif +0 -0
  59. data/app/assets/images/platform/loading3.gif +0 -0
  60. data/app/assets/images/platform/loading_animation.gif +0 -0
  61. data/app/assets/images/platform/loading_large.gif +0 -0
  62. data/app/assets/images/platform/lock.png +0 -0
  63. data/app/assets/images/platform/lock_add.png +0 -0
  64. data/app/assets/images/platform/lock_delete.png +0 -0
  65. data/app/assets/images/platform/lock_open.png +0 -0
  66. data/app/assets/images/platform/medals/bronze.png +0 -0
  67. data/app/assets/images/platform/medals/gold.png +0 -0
  68. data/app/assets/images/platform/medals/runner.png +0 -0
  69. data/app/assets/images/platform/medals/silver.png +0 -0
  70. data/app/assets/images/platform/minus_node.png +0 -0
  71. data/app/assets/images/platform/oauth/perm_tile.gif +0 -0
  72. data/app/assets/images/platform/oauth/right_grey.png +0 -0
  73. data/app/assets/images/platform/pencil.png +0 -0
  74. data/app/assets/images/platform/photo_silhouette.gif +0 -0
  75. data/app/assets/images/platform/pixel.gif +0 -0
  76. data/app/assets/images/platform/platform.png +0 -0
  77. data/app/assets/images/platform/platform2.png +0 -0
  78. data/app/assets/images/platform/platform3.png +0 -0
  79. data/app/assets/images/platform/platform4.png +0 -0
  80. data/app/assets/images/platform/platform5.png +0 -0
  81. data/app/assets/images/platform/plus.png +0 -0
  82. data/app/assets/images/platform/plus_node.png +0 -0
  83. data/app/assets/images/platform/random.png +0 -0
  84. data/app/assets/images/platform/random2.png +0 -0
  85. data/app/assets/images/platform/rating_star0.png +0 -0
  86. data/app/assets/images/platform/rating_star05.png +0 -0
  87. data/app/assets/images/platform/rating_star1.png +0 -0
  88. data/app/assets/images/platform/rating_stars.gif +0 -0
  89. data/app/assets/images/platform/rating_stars.psd +0 -0
  90. data/app/assets/images/platform/reply.png +0 -0
  91. data/app/assets/images/platform/right_quote.png +0 -0
  92. data/app/assets/images/platform/rotating_world.gif +0 -0
  93. data/app/assets/images/platform/script.png +0 -0
  94. data/app/assets/images/platform/script_edit.png +0 -0
  95. data/app/assets/images/platform/script_gear.png +0 -0
  96. data/app/assets/images/platform/site_sprite.gif +0 -0
  97. data/app/assets/images/platform/spinner.gif +0 -0
  98. data/app/assets/images/platform/star.png +0 -0
  99. data/app/assets/images/platform/table_edit.png +0 -0
  100. data/app/assets/images/platform/table_gear.png +0 -0
  101. data/app/assets/images/platform/table_multiple.png +0 -0
  102. data/app/assets/images/platform/thumb_down.png +0 -0
  103. data/app/assets/images/platform/thumb_up.png +0 -0
  104. data/app/assets/images/platform/top_left_stem.png +0 -0
  105. data/app/assets/images/platform/top_right_stem.png +0 -0
  106. data/app/assets/images/platform/translate_icn.gif +0 -0
  107. data/app/assets/images/platform/treeview/diffDoc.gif +0 -0
  108. data/app/assets/images/platform/treeview/diffFolder.gif +0 -0
  109. data/app/assets/images/platform/treeview/ftv2blank.gif +0 -0
  110. data/app/assets/images/platform/treeview/ftv2doc.gif +0 -0
  111. data/app/assets/images/platform/treeview/ftv2folderclosed.gif +0 -0
  112. data/app/assets/images/platform/treeview/ftv2folderopen.gif +0 -0
  113. data/app/assets/images/platform/treeview/ftv2lastnode.gif +0 -0
  114. data/app/assets/images/platform/treeview/ftv2link.gif +0 -0
  115. data/app/assets/images/platform/treeview/ftv2mlastnode.gif +0 -0
  116. data/app/assets/images/platform/treeview/ftv2mnode.gif +0 -0
  117. data/app/assets/images/platform/treeview/ftv2node.gif +0 -0
  118. data/app/assets/images/platform/treeview/ftv2plastnode.gif +0 -0
  119. data/app/assets/images/platform/treeview/ftv2pnode.gif +0 -0
  120. data/app/assets/images/platform/treeview/ftv2vertline.gif +0 -0
  121. data/app/assets/images/platform/wizard.png +0 -0
  122. data/app/assets/images/platform/world_link.png +0 -0
  123. data/app/assets/javascripts/platform/api_explorer.js +628 -0
  124. data/app/assets/javascripts/platform/application.js +9 -0
  125. data/app/assets/javascripts/platform/ftiens4.js +1197 -0
  126. data/app/assets/javascripts/platform/jsdk.js +539 -0
  127. data/app/assets/javascripts/platform/platform.js +447 -0
  128. data/app/assets/javascripts/platform/shortcut.js +223 -0
  129. data/app/assets/javascripts/platform/ua.js +147 -0
  130. data/app/assets/stylesheets/platform/api_explorer.css.scss +140 -0
  131. data/app/assets/stylesheets/platform/application.css.scss +6 -0
  132. data/app/assets/stylesheets/platform/components.css.scss +208 -0
  133. data/app/assets/stylesheets/platform/layout.css.scss +119 -0
  134. data/app/assets/stylesheets/platform/oauth.css +51 -0
  135. data/app/assets/stylesheets/platform/platform.css.scss +311 -0
  136. data/app/controllers/platform/admin/apps_controller.rb +99 -0
  137. data/app/controllers/platform/admin/base_controller.rb +60 -0
  138. data/app/controllers/platform/admin/categories_controller.rb +132 -0
  139. data/app/controllers/platform/admin/clientsdk_controller.rb +30 -0
  140. data/app/controllers/platform/admin/developers_controller.rb +30 -0
  141. data/app/controllers/platform/admin/exceptions_controller.rb +30 -0
  142. data/app/controllers/platform/admin/forum_controller.rb +34 -0
  143. data/app/controllers/platform/admin/metrics_controller.rb +42 -0
  144. data/app/controllers/platform/api/apps_controller.rb +40 -0
  145. data/app/controllers/platform/api/base_controller.rb +541 -0
  146. data/app/controllers/platform/apps_controller.rb +142 -0
  147. data/app/controllers/platform/base_controller.rb +127 -0
  148. data/app/controllers/platform/developer/api_explorer_controller.rb +56 -0
  149. data/app/controllers/platform/developer/apps_controller.rb +161 -0
  150. data/app/controllers/platform/developer/base_controller.rb +51 -0
  151. data/app/controllers/platform/developer/blog_controller.rb +29 -0
  152. data/app/controllers/platform/developer/dashboard_controller.rb +63 -0
  153. data/app/controllers/platform/developer/forum_controller.rb +85 -0
  154. data/app/controllers/platform/developer/help_controller.rb +113 -0
  155. data/app/controllers/platform/developer/info_controller.rb +41 -0
  156. data/app/controllers/platform/developer/registration_controller.rb +39 -0
  157. data/app/controllers/platform/developer/resources_controller.rb +30 -0
  158. data/app/controllers/platform/forum_controller.rb +74 -0
  159. data/app/controllers/platform/oauth_controller.rb +421 -0
  160. data/app/controllers/platform/ratings_controller.rb +61 -0
  161. data/app/helpers/platform/admin/categories_helper.rb +54 -0
  162. data/app/helpers/platform/apps_helper.rb +26 -0
  163. data/app/helpers/platform/developer/dashboard_helper.rb +42 -0
  164. data/app/helpers/platform/developer/help_helper.rb +45 -0
  165. data/app/helpers/platform_helper.rb +26 -0
  166. data/app/models/platform/application.rb +394 -0
  167. data/app/models/platform/application_category.rb +34 -0
  168. data/app/models/platform/application_developer.rb +30 -0
  169. data/app/models/platform/application_filter.rb +30 -0
  170. data/app/models/platform/application_log.rb +32 -0
  171. data/app/models/platform/application_log_filter.rb +34 -0
  172. data/app/models/platform/application_metric.rb +58 -0
  173. data/app/models/platform/application_metric_filter.rb +34 -0
  174. data/app/models/platform/application_permission.rb +30 -0
  175. data/app/models/platform/application_permission_filter.rb +30 -0
  176. data/app/models/platform/application_usage_metric.rb +58 -0
  177. data/app/models/platform/application_usage_metric_filter.rb +34 -0
  178. data/app/models/platform/application_user.rb +45 -0
  179. data/app/models/platform/application_user_filter.rb +34 -0
  180. data/app/models/platform/base_filter.rb +46 -0
  181. data/app/models/platform/category.rb +64 -0
  182. data/app/models/platform/daily_application_metric.rb +31 -0
  183. data/app/models/platform/developer.rb +45 -0
  184. data/app/models/platform/developer_filter.rb +26 -0
  185. data/app/models/platform/forum_message.rb +35 -0
  186. data/app/models/platform/forum_message_filter.rb +26 -0
  187. data/app/models/platform/forum_topic.rb +38 -0
  188. data/app/models/platform/forum_topic_filter.rb +26 -0
  189. data/app/models/platform/logged_exception.rb +290 -0
  190. data/app/models/platform/logged_exception_filter.rb +58 -0
  191. data/app/models/platform/media/image.rb +26 -0
  192. data/app/models/platform/media/media.rb +58 -0
  193. data/app/models/platform/monthly_application_metric.rb +31 -0
  194. data/app/models/platform/oauth/access_token.rb +57 -0
  195. data/app/models/platform/oauth/client_token.rb +38 -0
  196. data/app/models/platform/oauth/oauth_model_methods.rb +41 -0
  197. data/app/models/platform/oauth/oauth_token.rb +57 -0
  198. data/app/models/platform/oauth/oauth_token_filter.rb +34 -0
  199. data/app/models/platform/oauth/refresh_token.rb +47 -0
  200. data/app/models/platform/oauth/request_token.rb +50 -0
  201. data/app/models/platform/permission.rb +27 -0
  202. data/app/models/platform/rating.rb +43 -0
  203. data/app/models/platform/rating_filter.rb +30 -0
  204. data/app/models/platform/rollup_log.rb +27 -0
  205. data/app/models/platform/rollup_log_filter.rb +30 -0
  206. data/app/models/platform/total_application_metric.rb +40 -0
  207. data/app/models/platform/weekly_application_metric.rb +31 -0
  208. data/app/views/platform/admin/apps/_categories.html.erb +17 -0
  209. data/app/views/platform/admin/apps/_categories_scripts.html.erb +17 -0
  210. data/app/views/platform/admin/apps/_tabs.html.erb +25 -0
  211. data/app/views/platform/admin/apps/index.html.erb +32 -0
  212. data/app/views/platform/admin/apps/permissions.html.erb +7 -0
  213. data/app/views/platform/admin/apps/ratings.html.erb +7 -0
  214. data/app/views/platform/admin/apps/tokens.html.erb +18 -0
  215. data/app/views/platform/admin/apps/users.html.erb +7 -0
  216. data/app/views/platform/admin/apps/view.html.erb +170 -0
  217. data/app/views/platform/admin/categories/_tabs.html.erb +22 -0
  218. data/app/views/platform/admin/categories/category_assigner.html.erb +9 -0
  219. data/app/views/platform/admin/categories/category_assigner_tree.html.erb +81 -0
  220. data/app/views/platform/admin/categories/index.html.erb +106 -0
  221. data/app/views/platform/admin/categories/items.html.erb +153 -0
  222. data/app/views/platform/admin/categories/lb_update_application_category.html.erb +54 -0
  223. data/app/views/platform/admin/categories/lb_update_category.html.erb +64 -0
  224. data/app/views/platform/admin/categories/tree.html.erb +64 -0
  225. data/app/views/platform/admin/clientsdk/index.html.erb +89 -0
  226. data/app/views/platform/admin/common/_footer.html.erb +1 -0
  227. data/app/views/platform/admin/common/_header.html.erb +32 -0
  228. data/app/views/platform/admin/common/_lightbox_buttons.html.erb +5 -0
  229. data/app/views/platform/admin/common/_paginator.html.erb +20 -0
  230. data/app/views/platform/admin/developers/_tabs.html.erb +22 -0
  231. data/app/views/platform/admin/developers/index.html.erb +7 -0
  232. data/app/views/platform/admin/exceptions/_tabs.html.erb +22 -0
  233. data/app/views/platform/admin/exceptions/index.html.erb +7 -0
  234. data/app/views/platform/admin/forum/_tabs.html.erb +22 -0
  235. data/app/views/platform/admin/forum/index.html.erb +7 -0
  236. data/app/views/platform/admin/forum/messages.html.erb +7 -0
  237. data/app/views/platform/admin/metrics/_tabs.html.erb +25 -0
  238. data/app/views/platform/admin/metrics/application_log.html.erb +7 -0
  239. data/app/views/platform/admin/metrics/index.html.erb +9 -0
  240. data/app/views/platform/admin/metrics/rollup_log.html.erb +7 -0
  241. data/app/views/platform/admin/metrics/usage.html.erb +7 -0
  242. data/app/views/platform/apps/_actions_module.html.erb +3 -0
  243. data/app/views/platform/apps/_app_footer.html.erb +8 -0
  244. data/app/views/platform/apps/_app_header.html.erb +25 -0
  245. data/app/views/platform/apps/_apps_module.html.erb +42 -0
  246. data/app/views/platform/apps/_authorize_form.html.erb +11 -0
  247. data/app/views/platform/apps/_categories_module.html.erb +11 -0
  248. data/app/views/platform/apps/_featured_apps_module.html.erb +40 -0
  249. data/app/views/platform/apps/_left.html.erb +20 -0
  250. data/app/views/platform/apps/_monthly_users_module.html.erb +8 -0
  251. data/app/views/platform/apps/_paginator.html.erb +13 -0
  252. data/app/views/platform/apps/_rank_module.html.erb +18 -0
  253. data/app/views/platform/apps/_search_apps_module.html.erb +35 -0
  254. data/app/views/platform/apps/canvas_app.html.erb +15 -0
  255. data/app/views/platform/apps/index.html.erb +86 -0
  256. data/app/views/platform/apps/view.html.erb +71 -0
  257. data/app/views/platform/apps/xd.html.erb +11 -0
  258. data/app/views/platform/common/_footer.html.erb +1 -0
  259. data/app/views/platform/common/_header.html.erb +4 -0
  260. data/app/views/platform/common/_paginator.html.erb +32 -0
  261. data/app/views/platform/common/_scripts.html.erb +7 -0
  262. data/app/views/platform/common/_user_login.html.erb +11 -0
  263. data/app/views/platform/developer/api_explorer/history.html.erb +31 -0
  264. data/app/views/platform/developer/api_explorer/index.html.erb +134 -0
  265. data/app/views/platform/developer/api_explorer/oauth_lander.html.erb +4 -0
  266. data/app/views/platform/developer/api_explorer/options.html.erb +44 -0
  267. data/app/views/platform/developer/apps/_form.html.erb +340 -0
  268. data/app/views/platform/developer/apps/create_version.html.erb +19 -0
  269. data/app/views/platform/developer/apps/edit.html.erb +21 -0
  270. data/app/views/platform/developer/apps/index.html.erb +375 -0
  271. data/app/views/platform/developer/apps/new.html.erb +20 -0
  272. data/app/views/platform/developer/blog/index.html.erb +7 -0
  273. data/app/views/platform/developer/common/_footer.html.erb +1 -0
  274. data/app/views/platform/developer/common/_header.html.erb +34 -0
  275. data/app/views/platform/developer/dashboard/_apps_info.html.erb +84 -0
  276. data/app/views/platform/developer/dashboard/_discussions.html.erb +68 -0
  277. data/app/views/platform/developer/dashboard/_header.html.erb +12 -0
  278. data/app/views/platform/developer/dashboard/_reviews.html.erb +53 -0
  279. data/app/views/platform/developer/dashboard/_statistics.html.erb +105 -0
  280. data/app/views/platform/developer/dashboard/index.html.erb +85 -0
  281. data/app/views/platform/developer/dashboard/settings.html.erb +23 -0
  282. data/app/views/platform/developer/forum/_message.html.erb +17 -0
  283. data/app/views/platform/developer/forum/_messages.html.erb +14 -0
  284. data/app/views/platform/developer/forum/_new_message.html.erb +28 -0
  285. data/app/views/platform/developer/forum/_new_topic.html.erb +39 -0
  286. data/app/views/platform/developer/forum/index.html.erb +89 -0
  287. data/app/views/platform/developer/forum/topic.html.erb +28 -0
  288. data/app/views/platform/developer/help/_footer.html.erb +4 -0
  289. data/app/views/platform/developer/help/_header.html.erb +95 -0
  290. data/app/views/platform/developer/help/_navigation.html.erb +99 -0
  291. data/app/views/platform/developer/help/api.html.erb +120 -0
  292. data/app/views/platform/developer/help/credits.html.erb +77 -0
  293. data/app/views/platform/developer/help/index.html.erb +19 -0
  294. data/app/views/platform/developer/help/license.html.erb +586 -0
  295. data/app/views/platform/developer/help/oauth_app_login.html.erb +177 -0
  296. data/app/views/platform/developer/help/oauth_client_side.html.erb +264 -0
  297. data/app/views/platform/developer/help/oauth_desktop.html.erb +191 -0
  298. data/app/views/platform/developer/help/oauth_extensions.html.erb +342 -0
  299. data/app/views/platform/developer/help/oauth_intro.html.erb +371 -0
  300. data/app/views/platform/developer/help/oauth_mobile.html.erb +292 -0
  301. data/app/views/platform/developer/help/oauth_server_side.html.erb +603 -0
  302. data/app/views/platform/developer/help/oauth_trusted_client.html.erb +202 -0
  303. data/app/views/platform/developer/help/reference.html.erb +42 -0
  304. data/app/views/platform/developer/help/sdk_ios.html.erb +31 -0
  305. data/app/views/platform/developer/help/sdk_js.html.erb +202 -0
  306. data/app/views/platform/developer/info/_basic_info.html.erb +74 -0
  307. data/app/views/platform/developer/info/_header.html.erb +12 -0
  308. data/app/views/platform/developer/info/index.html.erb +23 -0
  309. data/app/views/platform/developer/registration/index.html.erb +134 -0
  310. data/app/views/platform/developer/resources/index.html.erb +23 -0
  311. data/app/views/platform/forum/_message.html.erb +17 -0
  312. data/app/views/platform/forum/_messages.html.erb +14 -0
  313. data/app/views/platform/forum/_new_message.html.erb +26 -0
  314. data/app/views/platform/forum/_new_topic.html.erb +38 -0
  315. data/app/views/platform/forum/_topic.html.erb +18 -0
  316. data/app/views/platform/forum/_topics.html.erb +74 -0
  317. data/app/views/platform/login/index.html.erb +31 -0
  318. data/app/views/platform/login/register.html.erb +55 -0
  319. data/app/views/platform/oauth/_authorization_box.html.erb +75 -0
  320. data/app/views/platform/oauth/_authorization_popup.html.erb +38 -0
  321. data/app/views/platform/oauth/_authorize_form.html.erb +11 -0
  322. data/app/views/platform/oauth/auth_failed.html.erb +0 -0
  323. data/app/views/platform/oauth/auth_success.html.erb +0 -0
  324. data/app/views/platform/oauth/authorize_desktop.html.erb +76 -0
  325. data/app/views/platform/oauth/authorize_failure_iframe.html.erb +1 -0
  326. data/app/views/platform/oauth/authorize_failure_mobile.html.erb +24 -0
  327. data/app/views/platform/oauth/authorize_failure_popup.html.erb +24 -0
  328. data/app/views/platform/oauth/authorize_failure_web.html.erb +1 -0
  329. data/app/views/platform/oauth/authorize_iframe.html.erb +16 -0
  330. data/app/views/platform/oauth/authorize_mobile.html.erb +1 -0
  331. data/app/views/platform/oauth/authorize_popup.html.erb +1 -0
  332. data/app/views/platform/oauth/authorize_success_iframe.html.erb +1 -0
  333. data/app/views/platform/oauth/authorize_success_mobile.html.erb +24 -0
  334. data/app/views/platform/oauth/authorize_success_popup.html.erb +24 -0
  335. data/app/views/platform/oauth/authorize_success_web.html.erb +1 -0
  336. data/app/views/platform/oauth/authorize_web.html.erb +3 -0
  337. data/app/views/platform/oauth/xd.html.erb +13 -0
  338. data/app/views/platform/ratings/_list.html.erb +30 -0
  339. data/app/views/platform/ratings/_new.html.erb +70 -0
  340. data/app/views/platform/ratings/_rating.html.erb +17 -0
  341. data/config/platform/config.yml +133 -0
  342. data/config/platform/data/default_applications.yml +39 -0
  343. data/config/platform/data/default_categories.yml +56 -0
  344. data/config/platform/data/default_permissions.yml +0 -0
  345. data/config/platform/site/features.yml +66 -0
  346. data/config/routes.rb +59 -0
  347. data/db/migrate/20110602232141_create_platform_tables.rb +262 -0
  348. data/docs/Classes.graffle +7315 -0
  349. data/docs/Classes.pdf +0 -0
  350. data/lib/generators/platform/platform_generator.rb +56 -0
  351. data/lib/generators/platform/templates/db/create_platform_tables.rb +262 -0
  352. data/lib/generators/platform/templates/layouts/platform.html.erb +49 -0
  353. data/lib/generators/platform/templates/layouts/platform_admin.html.erb +60 -0
  354. data/lib/platform.rb +6 -0
  355. data/lib/platform/api/already_jsoned_string.rb +9 -0
  356. data/lib/platform/api/proxy.rb +45 -0
  357. data/lib/platform/api/proxy/base.rb +62 -0
  358. data/lib/platform/cache.rb +78 -0
  359. data/lib/platform/config.rb +666 -0
  360. data/lib/platform/engine.rb +5 -0
  361. data/lib/platform/exception.rb +27 -0
  362. data/lib/platform/extensions/action_controller_extension.rb +65 -0
  363. data/lib/platform/extensions/action_view_extension.rb +168 -0
  364. data/lib/platform/extensions/object_extension.rb +51 -0
  365. data/lib/platform/helper.rb +33 -0
  366. data/lib/platform/logger.rb +62 -0
  367. data/lib/platform/railtie.rb +52 -0
  368. data/lib/platform/random_password_generator.rb +76 -0
  369. data/lib/platform/simple_string_permissions.rb +40 -0
  370. data/lib/platform/version.rb +3 -0
  371. data/lib/tasks/platform.rake +119 -0
  372. data/platform.gemspec +45 -0
  373. data/script/rails +6 -0
  374. data/spec/config/config_spec.rb +10 -0
  375. data/spec/dummy_app.rb +52 -0
  376. data/spec/models/application_spec.rb +53 -0
  377. data/spec/models/developer_spec.rb +23 -0
  378. data/spec/spec_helper.rb +29 -0
  379. data/test/dummy/Rakefile +7 -0
  380. data/test/dummy/app/assets/javascripts/application.js +7 -0
  381. data/test/dummy/app/assets/stylesheets/admin.css +200 -0
  382. data/test/dummy/app/assets/stylesheets/application.css +47 -0
  383. data/test/dummy/app/assets/stylesheets/components.css.scss +211 -0
  384. data/test/dummy/app/assets/stylesheets/layout.css.scss +143 -0
  385. data/test/dummy/app/controllers/admin/admins_controller.rb +7 -0
  386. data/test/dummy/app/controllers/admin/base_controller.rb +12 -0
  387. data/test/dummy/app/controllers/admin/bookmarks_controller.rb +7 -0
  388. data/test/dummy/app/controllers/admin/users_controller.rb +19 -0
  389. data/test/dummy/app/controllers/api/base_controller.rb +5 -0
  390. data/test/dummy/app/controllers/api/bookmarks_controller.rb +35 -0
  391. data/test/dummy/app/controllers/api/users_controller.rb +19 -0
  392. data/test/dummy/app/controllers/application_controller.rb +31 -0
  393. data/test/dummy/app/controllers/home_controller.rb +7 -0
  394. data/test/dummy/app/controllers/login_controller.rb +65 -0
  395. data/test/dummy/app/helpers/application_helper.rb +9 -0
  396. data/test/dummy/app/helpers/home_helper.rb +2 -0
  397. data/test/dummy/app/mailers/.gitkeep +0 -0
  398. data/test/dummy/app/models/.gitkeep +0 -0
  399. data/test/dummy/app/models/admin.rb +4 -0
  400. data/test/dummy/app/models/admin_filter.rb +7 -0
  401. data/test/dummy/app/models/bookmark.rb +7 -0
  402. data/test/dummy/app/models/user.rb +34 -0
  403. data/test/dummy/app/views/admin/admins/index.html.erb +7 -0
  404. data/test/dummy/app/views/admin/bookmarks/index.html.erb +5 -0
  405. data/test/dummy/app/views/admin/users/index.html.erb +10 -0
  406. data/test/dummy/app/views/demo/index.rhtml +108 -0
  407. data/test/dummy/app/views/demo/tokens.rhtml +35 -0
  408. data/test/dummy/app/views/home/index.html.erb +43 -0
  409. data/test/dummy/app/views/layouts/_footer.html.erb +16 -0
  410. data/test/dummy/app/views/layouts/_header.html.erb +22 -0
  411. data/test/dummy/app/views/layouts/admin.html.erb +97 -0
  412. data/test/dummy/app/views/layouts/application.html.erb +25 -0
  413. data/test/dummy/app/views/layouts/minimal.html.erb +37 -0
  414. data/test/dummy/app/views/layouts/popup.html.erb +43 -0
  415. data/test/dummy/app/views/login/index.html.erb +34 -0
  416. data/test/dummy/app/views/login/register.html.erb +51 -0
  417. data/test/dummy/config.ru +4 -0
  418. data/test/dummy/config/application.rb +51 -0
  419. data/test/dummy/config/boot.rb +10 -0
  420. data/test/dummy/config/database.yml +25 -0
  421. data/test/dummy/config/environment.rb +5 -0
  422. data/test/dummy/config/environments/development.rb +30 -0
  423. data/test/dummy/config/environments/production.rb +60 -0
  424. data/test/dummy/config/environments/test.rb +42 -0
  425. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  426. data/test/dummy/config/initializers/inflections.rb +10 -0
  427. data/test/dummy/config/initializers/mime_types.rb +5 -0
  428. data/test/dummy/config/initializers/secret_token.rb +7 -0
  429. data/test/dummy/config/initializers/session_store.rb +8 -0
  430. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  431. data/test/dummy/config/locales/en.yml +5 -0
  432. data/test/dummy/config/platform/api/0/bookmark.yml +18 -0
  433. data/test/dummy/config/platform/api/0/user.yml +17 -0
  434. data/test/dummy/config/platform/api/1/bookmark.yml +58 -0
  435. data/test/dummy/config/platform/api/1/user.yml +36 -0
  436. data/test/dummy/config/platform/config.yml +135 -0
  437. data/test/dummy/config/platform/data/default_applications.yml +39 -0
  438. data/test/dummy/config/platform/data/default_categories.yml +56 -0
  439. data/test/dummy/config/platform/data/default_permissions.yml +0 -0
  440. data/test/dummy/config/platform/site/features.yml +66 -0
  441. data/test/dummy/config/platform/site/sample_apps.yml +100 -0
  442. data/test/dummy/config/routes.rb +30 -0
  443. data/test/dummy/config/tr8n/config.yml +247 -0
  444. data/test/dummy/config/tr8n/data/ip_locations.csv +93460 -0
  445. data/test/dummy/config/tr8n/rules/default_date_rules.yml +20 -0
  446. data/test/dummy/config/tr8n/rules/default_gender_list_rules.yml +82 -0
  447. data/test/dummy/config/tr8n/rules/default_gender_rules.yml +20 -0
  448. data/test/dummy/config/tr8n/rules/default_language_cases.yml +272 -0
  449. data/test/dummy/config/tr8n/rules/default_list_rules.yml +19 -0
  450. data/test/dummy/config/tr8n/rules/default_numeric_rules.yml +42 -0
  451. data/test/dummy/config/tr8n/rules/default_value_rules.yml +18 -0
  452. data/test/dummy/config/tr8n/site/default_glossary.yml +18 -0
  453. data/test/dummy/config/tr8n/site/default_languages.yml +1591 -0
  454. data/test/dummy/config/tr8n/site/features.yml +111 -0
  455. data/test/dummy/config/tr8n/site/shortcuts.yml +55 -0
  456. data/test/dummy/config/tr8n/site/sitemap.json +42 -0
  457. data/test/dummy/config/tr8n/tokens/data.yml +19 -0
  458. data/test/dummy/config/tr8n/tokens/decorations.yml +19 -0
  459. data/test/dummy/config/will_filter/config.yml +99 -0
  460. data/test/dummy/db/migrate/20101207014543_create_users.rb +23 -0
  461. data/test/dummy/db/migrate/20110113223509_create_admins.rb +15 -0
  462. data/test/dummy/db/migrate/20110930041143_create_will_filter_filters.rb +15 -0
  463. data/test/dummy/db/migrate/20110930041150_create_tr8n_tables.rb +350 -0
  464. data/test/dummy/db/migrate/20111004075531_create_platform_tables.rb +262 -0
  465. data/test/dummy/db/migrate/20111012055603_create_bookmarks.rb +10 -0
  466. data/test/dummy/db/schema.rb +683 -0
  467. data/test/dummy/lib/assets/.gitkeep +0 -0
  468. data/test/dummy/lib/platform/api/bookmark_proxy_0.rb +12 -0
  469. data/test/dummy/lib/platform/api/bookmark_proxy_1.rb +12 -0
  470. data/test/dummy/lib/platform/api/user_proxy_0.rb +12 -0
  471. data/test/dummy/lib/platform/api/user_proxy_1.rb +12 -0
  472. data/test/dummy/log/.gitkeep +0 -0
  473. data/test/dummy/public/404.html +26 -0
  474. data/test/dummy/public/422.html +26 -0
  475. data/test/dummy/public/500.html +26 -0
  476. data/test/dummy/public/favicon.ico +0 -0
  477. data/test/dummy/script/rails +6 -0
  478. data/test/dummy/test/fixtures/documents.yml +11 -0
  479. data/test/dummy/test/unit/document_test.rb +7 -0
  480. metadata +886 -0
@@ -0,0 +1,292 @@
1
+ <%= render :partial => "header" %>
2
+ <div class="documentation_section_title">
3
+ <%= tr("Mobile Application Authorization Flow") %>
4
+ </div>
5
+ <div class="documentation_section">
6
+ <p>
7
+ <%=tr("Mobile authentication/authorization flow is very similar to the client-side flow, but it has a slightly different mechanism for handling the response data.") %>
8
+ <%=tr("This document provides details no how to integrate Geni into an iPhone application.") %>
9
+ <%=tr("Android and other mobile devices will work in a similar fashion.") %>
10
+ </p>
11
+ <h2><%=tr("Authentication & Authorization") %></h2>
12
+ <p>
13
+ <%=tr("To enter the authentication/authorization mobile flow, launch a browser from your mobile application and pass the following parameters to the authorization url:") %>
14
+ </p>
15
+ <h3><%=tr("Oauth URL") %></h3>
16
+ <div class="code_snippet">
17
+ https://<%=Platform::Config.site_base_url %>/platform/oauth/authorize
18
+ </div>
19
+ <h3><%=tr("Parameters") %></h3>
20
+ <p>
21
+ <table class="documentation_table">
22
+ <tr>
23
+ <th style="width:150px;">
24
+ <%=tr("Name") %>
25
+ </th>
26
+ <th>
27
+ <%=tr("Description") %>
28
+ </th>
29
+ <th style="width:150px;">
30
+ <%=tr("Required") %>
31
+ </th>
32
+ </tr>
33
+ <tr>
34
+ <td>
35
+ client_id
36
+ </td>
37
+ <td>
38
+ <%=tr("Application key generated during the app registration.") %>
39
+ </td>
40
+ <td>
41
+ true
42
+ </td>
43
+ </tr>
44
+ <tr>
45
+ <td>
46
+ redirect_uri
47
+ </td>
48
+ <td>
49
+ <%=tr("URL that the user's browser will be redirected back to once app authorization is completed.")%>
50
+ <%=tr("You can specify a custom URL that will be recognized by your mobile device, which launch your application.")%>
51
+ </td>
52
+ <td>
53
+ true
54
+ </td>
55
+ </tr>
56
+ <tr>
57
+ <td>
58
+ response_type
59
+ </td>
60
+ <td>
61
+ <%=tr("For the mobile flow the response type should be set to \"token\".")%>
62
+ </td>
63
+ <td>
64
+ true
65
+ </td>
66
+ </tr>
67
+ <tr>
68
+ <td>
69
+ display
70
+ </td>
71
+ <td>
72
+ <%=tr("For the mobile flow the display parameter should be set to \"mobile\".")%>
73
+ </td>
74
+ <td>
75
+ true
76
+ </td>
77
+ </tr>
78
+ <tr>
79
+ <td>
80
+ scope
81
+ </td>
82
+ <td>
83
+ <%=tr("A comma delimited list of permissions that the application needs.") %>
84
+ <%=tr("By default the scope is set to a full data access.") %>
85
+ <%=tr("This is subject to change in the upcoming releases.") %>
86
+ </td>
87
+ <td>
88
+ false
89
+ </td>
90
+ </tr>
91
+ </table>
92
+ </p>
93
+ <h3><%=tr("Example")%></h3>
94
+ <div class="code_snippet">
95
+ https://<%=Platform::Config.site_base_url %>/platform/oauth/authorize?client_id=YOUR_APP_ID&redirect_uri=YOUR_APP_URL&response_type=token&display=mobile
96
+ </div>
97
+ <p>
98
+ <%=tr("By setting the display parameter to \"mobile\", you ensure that the login and the authorization screens will use a mobile layout.")%>
99
+ <%=tr("The client_id parameter can be either your application key or your application id.")%>
100
+ <%=tr("Application ids are shorter and can be used as registered urls of your mobile application.")%>
101
+ </p>
102
+ <h3><%=tr("Configuring iOS Callback")%></h3>
103
+ <p>
104
+ <%=tr("To register a callback to your iOS application, you must open your application's properties file and configure a custom url:")%>
105
+ </p>
106
+ <pre class="code_snippet">
107
+ &lt;?xml version="1.0" encoding="UTF-8"?>
108
+ &lt;!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
109
+ &lt;plist version="1.0">
110
+ &lt;dict>
111
+ ...
112
+ &lt;key>CFBundleURLTypes&lt;/key>
113
+ &lt;array>
114
+ &lt;dict>
115
+ &lt;key>CFBundleTypeRole&lt;/key>
116
+ &lt;string>Editor&lt;/string>
117
+ &lt;key>CFBundleURLName&lt;/key>
118
+ &lt;string>&lt;/string>
119
+ &lt;key>CFBundleURLSchemes&lt;/key>
120
+ &lt;array>
121
+ &lt;string>YOUR_APP_ID&lt;/string>
122
+ &lt;/array>
123
+ &lt;/dict>
124
+ &lt;/array>
125
+ ...
126
+ &lt;/dict>
127
+ &lt;/plist>
128
+ </pre>
129
+ <p>
130
+ <%=tr("You now can provide a redirect URL that will identify your application.") %> <%=tr("See the following example:")%>
131
+ </p>
132
+ <h3><%=tr("Example")%></h3>
133
+ <pre class="code_snippet">
134
+ NSString *geniOauthBaseURL = @"https://<%=Platform::Config.site_base_url %>/platform/oauth/authorize";
135
+
136
+ NSString *yourAppURL = [NSString stringWithFormat: @"%@/authorize", YOUR_APP_ID];
137
+
138
+ NSString *geniOauthURL = [NSString stringWithFormat:@"%@?client_id=%@&redirect_uri=%@&response_type=token&display=mobile",
139
+ geniOauthBaseURL, YOUR_APP_ID, yourAppURL];
140
+
141
+ [[UIApplication sharedApplication] openURL:[NSURL URLWithString:geniOauthURL]];
142
+ </pre>
143
+ <p>
144
+ <%=tr("If the user is already logged in, we validate the login cookie that we have stored on the user's browser and authenticate the user.") %><%=tr("If the user is not logged in, they are prompted to enter their credentials:") %>
145
+ </p>
146
+ <center>
147
+ <%=image_tag("platform/help/login_iphone.png", :style=>"width:300px;") %>
148
+ </center>
149
+ <p>
150
+ <%=tr("Once we have successfully authenticated the user, we will prompt the user to authorize your application:") %>
151
+ </p>
152
+ <center>
153
+ <%=image_tag("platform/help/auth_iphone.png", :style=>"width:300px;") %>
154
+ </center>
155
+ <h3><%=tr("Handling iOS Application Callback")%></h3>
156
+ <p>
157
+ <%=tr("To handle iOS application callback, add the following code to your iOS application delegate:")%>
158
+ </p>
159
+ <pre class="code_snippet">
160
+ - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *) url {
161
+ NSLog(@"Did come back from other application");
162
+
163
+ // If the URL's structure doesn't match the structure used for Geni authorization, abort.
164
+ if (![[url absoluteString] hasPrefix:[NSString stringWithFormat:@"%@://authorize", YOUR_APP_ID]]) {
165
+ return NO;
166
+ }
167
+
168
+ NSString *query = [url fragment];
169
+ if (!query) {
170
+ query = [url query];
171
+ }
172
+
173
+ // parse parameters
174
+ NSArray *pairs = [query componentsSeparatedByString:@"&"];
175
+ NSMutableDictionary *params = [[[NSMutableDictionary alloc] init] autorelease];
176
+ for (NSString *pair in pairs) {
177
+ NSArray *kv = [pair componentsSeparatedByString:@"="];
178
+ NSString *val = [[kv objectAtIndex:1]
179
+ stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
180
+
181
+ [params setObject:val forKey:[kv objectAtIndex:0]];
182
+ }
183
+
184
+ // get access token
185
+ NSString *accessToken = [params valueForKey:@"access_token"];
186
+
187
+ // If the URL doesn't contain the access token, an error has occurred.
188
+ if (!accessToken) { // handle error
189
+
190
+ return YES;
191
+ }
192
+
193
+ // store access token
194
+
195
+ return YES;
196
+ }
197
+ </pre>
198
+ <h3><%=tr("Returned Fields") %></h3>
199
+ <p>
200
+ <table class="documentation_table">
201
+ <tr>
202
+ <th style="width:150px;">
203
+ <%=tr("Name") %>
204
+ </th>
205
+ <th style="width:150px;">
206
+ <%=tr("Type") %>
207
+ </th>
208
+ <th>
209
+ <%=tr("Description") %>
210
+ </th>
211
+ </tr>
212
+ <tr>
213
+ <td style="widtd:150px;">
214
+ status
215
+ </td>
216
+ <td style="widtd:150px;">
217
+ String
218
+ </td>
219
+ <td>
220
+ <%=tr("If user cancels the authorization flow, the status will be set to \"unauthorized\".") %>
221
+ </td>
222
+ </tr>
223
+ <tr>
224
+ <td style="widtd:150px;">
225
+ message
226
+ </td>
227
+ <td style="widtd:150px;">
228
+ String
229
+ </td>
230
+ <td>
231
+ <%=tr("Error message") %>
232
+ </td>
233
+ </tr>
234
+ </table>
235
+ </p>
236
+ <h3><%=tr("Example")%></h3>
237
+ <div class="code_snippet">
238
+ YOUR_APP_ID://authorize?status=unauthorized&message=user+canceled
239
+ </div>
240
+ <p>
241
+ <%=tr("If the user presses Allow, your app is authorized.") %>
242
+ <%=tr("The user will be redirected (via HTTP 302) to the special URL with an authorization code:") %>
243
+ </p>
244
+ <h3><%=tr("Returned Fields") %></h3>
245
+ <p>
246
+ <table class="documentation_table">
247
+ <tr>
248
+ <th style="width:150px;">
249
+ <%=tr("Name") %>
250
+ </th>
251
+ <th style="width:150px;">
252
+ <%=tr("Type") %>
253
+ </th>
254
+ <th>
255
+ <%=tr("Description") %>
256
+ </th>
257
+ </tr>
258
+ <tr>
259
+ <td style="widtd:150px;">
260
+ access_token
261
+ </td>
262
+ <td style="widtd:150px;">
263
+ String
264
+ </td>
265
+ <td>
266
+ <%=tr("Access token to be used with every API request")%>
267
+ </td>
268
+ </tr>
269
+ <tr>
270
+ <td style="widtd:150px;">
271
+ expires_in
272
+ </td>
273
+ <td style="widtd:150px;">
274
+ Number
275
+ </td>
276
+ <td>
277
+ <%=tr("Seconds until the token will expire") %>
278
+ </td>
279
+ </tr>
280
+ </table>
281
+ </p>
282
+ <h3><%=tr("Example")%></h3>
283
+ <div class="code_snippet">
284
+ YOUR_APP_ID://authorize?access_token=ACCESS_TOKEN_GENERATED_BY_SERVER&expires_in=SECONDS_UNTIL_IT_IS_EXPIRED
285
+ </div>
286
+ <h3><%=tr("Geni iOS Client SDK")%></h3>
287
+ <p>
288
+ <%=tr("{site_title} comes with a [link: full featured iOS library] that allows you to build dynamic iOS applications using the site data.", "", :site_title => Platform::Config.site_title, :link => ["/platform/developer/help/ios_sdk"])%>
289
+ <%=tr("It supports authentication, autherization and API calls to get the site data.")%>
290
+ </p>
291
+ </div>
292
+ <%= render :partial => "footer" %>
@@ -0,0 +1,603 @@
1
+ <%= render :partial => "header" %>
2
+ <div class="documentation_section_title">
3
+ <%= tr("Server Side Authorization Flow") %>
4
+ </div>
5
+ <div class="documentation_section">
6
+ <p>
7
+ <%=tr("User authentication and application authorization are handled as a two step process by redirecting the user to the login screen, followed by the authorization screen.") %>
8
+ </p>
9
+ <h2><%=tr("Authentication & Authorization") %></h2>
10
+ <p>
11
+ <%=tr("To enter the authentication/authorization flow, you must pass the following parameters to the authorization URL:") %>
12
+ </p>
13
+ <h3><%=tr("Oauth URL") %></h3>
14
+ <div class="code_snippet">
15
+ https://<%=Platform::Config.site_base_url %>/platform/oauth/authorize
16
+ </div>
17
+ <h3><%=tr("Parameters") %></h3>
18
+ <p>
19
+ <table class="documentation_table">
20
+ <tr>
21
+ <th style="width:150px;">
22
+ <%=tr("Name") %>
23
+ </th>
24
+ <th>
25
+ <%=tr("Description") %>
26
+ </th>
27
+ <th style="width:150px;">
28
+ <%=tr("Required") %>
29
+ </th>
30
+ </tr>
31
+ <tr>
32
+ <td>
33
+ client_id
34
+ </td>
35
+ <td>
36
+ <%=tr("Application key generated during the app registration.") %>
37
+ </td>
38
+ <td>
39
+ true
40
+ </td>
41
+ </tr>
42
+ <tr>
43
+ <td>
44
+ redirect_uri
45
+ </td>
46
+ <td>
47
+ <%=tr("URL that the user's browser will be redirected back to once the application authorization is completed.") %>
48
+ <%=tr("You can specify this URL in your application settings as a Callback URL, or pass it as a request paremeter.") %>
49
+ <%=tr("The redirect_uri must be within the same domain as the Site Domain you specified in the application settings.") %>
50
+ </td>
51
+ <td>
52
+ true
53
+ </td>
54
+ </tr>
55
+ <tr>
56
+ <td>
57
+ response_type
58
+ </td>
59
+ <td>
60
+ <%=tr("For the server side flow the response type is defaulted to \"code\" and you don't need to pass it as a parameter.") %>
61
+ </td>
62
+ <td>
63
+ false
64
+ </td>
65
+ </tr>
66
+ <tr>
67
+ <td>
68
+ scope
69
+ </td>
70
+ <td>
71
+ <%=tr("A comma delimited list of permissions that the application needs.") %>
72
+ <%=tr("By default the scope is set to a full data access.") %>
73
+ </td>
74
+ <td>
75
+ false
76
+ </td>
77
+ </tr>
78
+ <tr>
79
+ <td>
80
+ display
81
+ </td>
82
+ <td>
83
+ <%=tr("For the server side flow the display parameter is defaulted to \"web\".") %>
84
+ </td>
85
+ <td>
86
+ false
87
+ </td>
88
+ </tr>
89
+ <tr>
90
+ <td>
91
+ state
92
+ </td>
93
+ <td>
94
+ <%=tr("Used for additional parameters and [link: CSRF protection].", "", :link => ["http://en.wikipedia.org/wiki/Cross-site_request_forgery"]) %>
95
+ </td>
96
+ <td>
97
+ false
98
+ </td>
99
+ </tr>
100
+ </table>
101
+ </p>
102
+ <h3><%=tr("Example") %></h3>
103
+ <div class="code_snippet">
104
+ https://<%=Platform::Config.site_base_url %>/platform/oauth/authorize?client_id=YOUR_APP_KEY&redirect_uri=YOUR_URL
105
+ </div>
106
+ <p>
107
+ <%=tr("If the user is already logged in, we validate the login cookie that we have stored on the user's browser and authenticate the user.") %>
108
+ <%=tr("If the user is not logged in, they are prompted to enter their credentials:") %>
109
+ </p>
110
+ <p style="text-align:center">
111
+ <%=image_tag("platform/help/login_web.png", :style=>"width:600px;", :class => "screenshot") %>
112
+ </p>
113
+ <p>
114
+ <%=tr("Once we have successfully authenticated the user, we will prompt the user to authorize your application:") %>
115
+ </p>
116
+ <p style="text-align:center">
117
+ <%=image_tag("platform/help/auth_web.png", :style=>"width:600px;", :class => "screenshot") %>
118
+ </p>
119
+ <p>
120
+ <%=tr("If the user presses Don't Allow, your app is not authorized.") %>
121
+ <%=tr("The user will be redirected (via HTTP 302) to the URL you passed in the redirect_uri parameter with the following error information:") %>
122
+ </p>
123
+ <h3><%=tr("Returned Fields") %></h3>
124
+ <p>
125
+ <table class="documentation_table">
126
+ <tr>
127
+ <th style="width:150px;">
128
+ <%=tr("Name") %>
129
+ </th>
130
+ <th style="width:150px;">
131
+ <%=tr("Type") %>
132
+ </th>
133
+ <th>
134
+ <%=tr("Description") %>
135
+ </th>
136
+ </tr>
137
+ <tr>
138
+ <td style="widtd:150px;">
139
+ status
140
+ </td>
141
+ <td style="widtd:150px;">
142
+ String
143
+ </td>
144
+ <td>
145
+ <%=tr("If user cancels tde autdorization flow, tde status will be set to \"unauthorized\".") %>
146
+ </td>
147
+ </tr>
148
+ <tr>
149
+ <td style="widtd:150px;">
150
+ message
151
+ </td>
152
+ <td style="widtd:150px;">
153
+ String
154
+ </td>
155
+ <td>
156
+ <%=tr("Error message") %>
157
+ </td>
158
+ </tr>
159
+ </table>
160
+ </p>
161
+ <h3><%=tr("Example") %></h3>
162
+ <div class="code_snippet">
163
+ http://YOUR_URL?status=unauthorized&message=user+canceled
164
+ </div>
165
+ <p>
166
+ <%=tr("If the user presses Allow, your app is authorized.") %>
167
+ <%=tr("The user will be redirected (via HTTP 302) to the URL you passed in the redirect_uri parameter with an authorization code:") %>
168
+ </p>
169
+ <h3><%=tr("Returned Fields") %></h3>
170
+ <p>
171
+ <table class="documentation_table">
172
+ <tr>
173
+ <th style="width:150px;">
174
+ <%=tr("Name") %>
175
+ </th>
176
+ <th style="width:150px;">
177
+ <%=tr("Type") %>
178
+ </th>
179
+ <th>
180
+ <%=tr("Description") %>
181
+ </th>
182
+ </tr>
183
+ <tr>
184
+ <td style="widtd:150px;">
185
+ code
186
+ </td>
187
+ <td style="widtd:150px;">
188
+ String
189
+ </td>
190
+ <td>
191
+ <%=tr("Authorization code") %>
192
+ </td>
193
+ </tr>
194
+ <tr>
195
+ <td style="widtd:150px;">
196
+ expires_in
197
+ </td>
198
+ <td style="widtd:150px;">
199
+ Number
200
+ </td>
201
+ <td>
202
+ <%=tr("Seconds until the code is expired") %>
203
+ </td>
204
+ </tr>
205
+ <tr>
206
+ <td style="widtd:150px;">
207
+ scope
208
+ </td>
209
+ <td style="widtd:150px;">
210
+ String
211
+ </td>
212
+ <td>
213
+ <%=tr("List of permissions that the user has agreed to accept.") %>
214
+ </td>
215
+ </tr>
216
+ <tr>
217
+ <td style="widtd:150px;">
218
+ state
219
+ </td>
220
+ <td style="widtd:150px;">
221
+ String
222
+ </td>
223
+ <td>
224
+ <%=tr("Will return whatever was passed to the Oauth URL.") %>
225
+ </td>
226
+ </tr>
227
+ </table>
228
+ </p>
229
+ <h3><%=tr("Example") %></h3>
230
+ <div class="code_snippet">
231
+ http://YOUR_URL?code=A_CODE_GENERATED_BY_SERVER&expires_in=SECONDS_UNTIL_THE_CODE_IS_EXPIRED
232
+ </div>
233
+ <p>
234
+ <%=tr("With this code in hand, you can proceed to the next step, app authentication, to gain the access token you need to make API calls.") %>
235
+ </p>
236
+ <h2><%=tr("Application Authorization") %></h2>
237
+ <p>
238
+ <%=tr("In order to authenticate your app, you must pass the following parameter to the request_token endpoint:") %>
239
+ </p>
240
+ <h3><%=tr("Oauth Endpoint") %></h3>
241
+ <div class="code_snippet">
242
+ https://<%=Platform::Config.site_base_url %>/platform/oauth/request_token
243
+ </div>
244
+ <h3><%=tr("Parameters") %></h3>
245
+ <p>
246
+ <table class="documentation_table">
247
+ <tr>
248
+ <th style="width:150px;">
249
+ <%=tr("Name") %>
250
+ </th>
251
+ <th>
252
+ <%=tr("Description") %>
253
+ </th>
254
+ <th style="width:150px;">
255
+ <%=tr("Required") %>
256
+ </th>
257
+ </tr>
258
+ <tr>
259
+ <td>
260
+ client_id
261
+ </td>
262
+ <td>
263
+ <%=tr("Application key generated during the app registration.") %>
264
+ </td>
265
+ <td>
266
+ true
267
+ </td>
268
+ </tr>
269
+ <tr>
270
+ <td>
271
+ client_secret
272
+ </td>
273
+ <td>
274
+ <%=tr("Application secret generated during the registration process and availble in the application settings.") %>
275
+ </td>
276
+ <td>
277
+ true
278
+ </td>
279
+ </tr>
280
+ <tr>
281
+ <td>
282
+ redirect_uri
283
+ </td>
284
+ <td>
285
+ <%=tr("URL that was used to get the authorization code.") %><%=tr("The redirect_uri must be within the same domain as the Site Domain you specify in the application settings.") %>
286
+ </td>
287
+ <td>
288
+ true
289
+ </td>
290
+ </tr>
291
+ <tr>
292
+ <td>
293
+ code
294
+ </td>
295
+ <td>
296
+ <%=tr("Authorization code received in the previous step.") %>
297
+ </td>
298
+ <td>
299
+ true
300
+ </td>
301
+ </tr>
302
+ <tr>
303
+ <td>
304
+ grant_type
305
+ </td>
306
+ <td>
307
+ <%=tr("For the server side flow the response type is defaulted to \"authorization_code\" and you don't need to set it.") %>
308
+ </td>
309
+ <td>
310
+ false
311
+ </td>
312
+ </tr>
313
+ </table>
314
+ </p>
315
+ <h3><%=tr("Example") %></h3>
316
+ <div class="code_snippet">
317
+ https://<%=Platform::Config.site_base_url %>/platform/oauth/request_token?client_id=YOUR_APP_ID&redirect_uri=YOUR_URL&client_secret=YOUR_APP_SECRET&code=THE_CODE_FROM_ABOVE
318
+ </div>
319
+ <p>
320
+ <%=tr("If your app is successfully authenticated and the authorization code from the user is valid, the authorization server will return the access token in a JSON format:") %>
321
+ </p>
322
+ <h3><%=tr("Returned Fields") %></h3>
323
+ <p>
324
+ <table class="documentation_table">
325
+ <tr>
326
+ <th style="width:150px;">
327
+ <%=tr("Name") %>
328
+ </th>
329
+ <th style="width:150px;">
330
+ <%=tr("Type") %>
331
+ </th>
332
+ <th>
333
+ <%=tr("Description") %>
334
+ </th>
335
+ </tr>
336
+ <tr>
337
+ <td style="widtd:150px;">
338
+ access_token
339
+ </td>
340
+ <td style="widtd:150px;">
341
+ String
342
+ </td>
343
+ <td>
344
+ <%=tr("Access token to be used with every API request")%>
345
+ </td>
346
+ </tr>
347
+ <tr>
348
+ <td style="widtd:150px;">
349
+ expires_in
350
+ </td>
351
+ <td style="widtd:150px;">
352
+ Number
353
+ </td>
354
+ <td>
355
+ <%=tr("Seconds until the token will expire") %>
356
+ </td>
357
+ </tr>
358
+ <tr>
359
+ <td style="widtd:150px;">
360
+ refresh_token
361
+ </td>
362
+ <td style="widtd:150px;">
363
+ String
364
+ </td>
365
+ <td>
366
+ <%=tr("Token that can be used to get a new access token") %>
367
+ </td>
368
+ </tr>
369
+ </table>
370
+ </p>
371
+ <h3><%=tr("Example") %></h3>
372
+ <div class="code_snippet">
373
+ {"expires_in":86400,"refresh_token":"wEq6FMb3CcfPN6CckQv7","access_token":"sye4NMd130L4wqq13zjqqLHwuHd5jnnKwdVi9S8X"}
374
+ </div>
375
+ <p>
376
+ <%=tr("If your app failed to provide appropriate parameters, you will get one of the errors below in JSON format: ") %>
377
+ </p>
378
+ <h3><%=tr("Returned Fields") %></h3>
379
+ <p>
380
+ <table class="documentation_table">
381
+ <tr>
382
+ <th style="width:150px;">
383
+ <%=tr("Name") %>
384
+ </th>
385
+ <th style="width:150px;">
386
+ <%=tr("Type") %>
387
+ </th>
388
+ <th>
389
+ <%=tr("Description") %>
390
+ </th>
391
+ </tr>
392
+ <tr>
393
+ <tr>
394
+ <td style="widtd:150px;">
395
+ error
396
+ </td>
397
+ <td style="widtd:150px;">
398
+ String
399
+ </td>
400
+ <td>
401
+ <%=tr("Error code") %>
402
+ </td>
403
+ </tr>
404
+ <tr>
405
+ <td style="widtd:150px;">
406
+ error_description
407
+ </td>
408
+ <td style="widtd:150px;">
409
+ String
410
+ </td>
411
+ <td>
412
+ <%=tr("Error description") %>
413
+ </td>
414
+ </tr>
415
+ </table>
416
+ </p>
417
+ <h3><%=tr("Examples") %></h3>
418
+ <div class="code_snippet">
419
+ {"error_description":"invalid client application id","error":"unauthorized_client"}
420
+ <br>
421
+ <br>
422
+ {"error_description":"redirection url must match the url used for the code request","error":"invalid_request"}
423
+ </div>
424
+ <h3><%=tr("Full Example in PHP") %></h3>
425
+ <p>
426
+ <%=tr("The following example demonstrates an authentication/autherization flow in a single PHP page.") %><%=tr("The example uses [link: CSRF protection] for extra security.", "", :link => ["http://en.wikipedia.org/wiki/Cross-site_request_forgery"]) %>
427
+ </p>
428
+ <pre class="code_snippet">
429
+ &lt;?php
430
+
431
+ $app_id = "YOUR_APP_KEY";
432
+ $app_secret = "YOUR_APP_SECRET";
433
+ $my_url = "YOUR_URL";
434
+
435
+ session_start();
436
+ $access_code = $_REQUEST["code"];
437
+
438
+ if (empty($access_code)) {
439
+ $_SESSION['state'] = md5(uniqid(rand(), TRUE)); // CSRF protection
440
+
441
+ $geni_oauth_url = "http://www.facebook.com/dialog/oauth?client_id=" . $app_id
442
+ . "&redirect_uri=" . urlencode($my_url) . "&state=" . $_SESSION['state'];
443
+
444
+ echo("&lt;script> top.location.href='" . $geni_oauth_url . "'&lt;/script>");
445
+ }
446
+
447
+ if ($_REQUEST['state'] == $_SESSION['state']) {
448
+ $token_url = "https://www.geni.com/oauth/request_token?client_id=" . $app_id . "&client_secret=" . $app_secret
449
+ . "&redirect_uri=" . urlencode($my_url) . "&code=" . $access_code;
450
+
451
+ $params = json_decode(file_get_contents($token_url), true);
452
+
453
+ $geni_api_url = "https://www.geni.com/api/profile?access_token=" . $params['access_token'];
454
+
455
+ $profile = json_decode(file_get_contents($geni_api_url));
456
+
457
+ echo("Hello " . $profile->name);
458
+ } else {
459
+
460
+ echo("Error: CSRF validation failed. Someone is attacking your site!");
461
+ }
462
+ ?>
463
+ </pre>
464
+ <h2><%=tr("Refreshing Access Token") %></h2>
465
+ <p>
466
+ <%=tr("If your access token has expired and you have a refresh token, you can get a new access token for the same scope by calling the oauth endpoint:") %>
467
+ </p>
468
+ <h3><%=tr("Oauth Endpoint") %></h3>
469
+ <div class="code_snippet">
470
+ https://<%=Platform::Config.site_base_url %>/platform/oauth/request_token
471
+ </div>
472
+ <h3><%=tr("Parameters") %></h3>
473
+ <p>
474
+ <table class="documentation_table">
475
+ <tr>
476
+ <th style="width:150px;">
477
+ <%=tr("Name") %>
478
+ </th>
479
+ <th>
480
+ <%=tr("Description") %>
481
+ </th>
482
+ <th style="width:150px;">
483
+ <%=tr("Required") %>
484
+ </th>
485
+ </tr>
486
+ <tr>
487
+ <td>
488
+ client_id
489
+ </td>
490
+ <td>
491
+ <%=tr("Application key generated during the app registration.") %>
492
+ </td>
493
+ <td>
494
+ true
495
+ </td>
496
+ </tr>
497
+ <tr>
498
+ <td>
499
+ client_secret
500
+ </td>
501
+ <td>
502
+ <%=tr("Application secret generated during the registration process and availble in the application settings.") %>
503
+ <%=tr("The app secret is available from the Developer App and should not be shared with anyone or embedded in any code that you will distribute (you should use the client-side flow for these scenarios).") %>
504
+ </td>
505
+ <td>
506
+ true
507
+ </td>
508
+ </tr>
509
+ <tr>
510
+ <td>
511
+ redirect_uri
512
+ </td>
513
+ <td>
514
+ <%=tr("URL that was used to get the refresh token.") %><%=tr("The redirect_uri must be within the same domain as the Site Domain you specify in the application settings.") %>
515
+ </td>
516
+ <td>
517
+ true
518
+ </td>
519
+ </tr>
520
+ <tr>
521
+ <td>
522
+ refresh_token
523
+ </td>
524
+ <td>
525
+ <%=tr("Refresh token value") %>
526
+ </td>
527
+ <td>
528
+ true
529
+ </td>
530
+ </tr>
531
+ <tr>
532
+ <td>
533
+ grant_type
534
+ </td>
535
+ <td>
536
+ <%=tr("In order to refresh a token, set this param to \"refresh_token\"") %>
537
+ </td>
538
+ <td>
539
+ true
540
+ </td>
541
+ </tr>
542
+ </table>
543
+ </p>
544
+ <h3><%=tr("Example") %></h3>
545
+ <div class="code_snippet">
546
+ https://<%=Platform::Config.site_base_url %>/platform/oauth/request_token?client_id=YOUR_APP_ID&redirect_uri=YOUR_URL&client_secret=YOUR_APP_SECRET
547
+ &grant_type=refresh_token&refresh_token=REFRESH_TOKEN
548
+ </div>
549
+ <h3><%=tr("Returned Fields") %></h3>
550
+ <p>
551
+ <table class="documentation_table">
552
+ <tr>
553
+ <th style="width:150px;">
554
+ <%=tr("Name") %>
555
+ </th>
556
+ <th style="width:150px;">
557
+ <%=tr("Type") %>
558
+ </th>
559
+ <th>
560
+ <%=tr("Description") %>
561
+ </th>
562
+ </tr>
563
+ <tr>
564
+ <td style="widtd:150px;">
565
+ access_token
566
+ </td>
567
+ <td style="widtd:150px;">
568
+ String
569
+ </td>
570
+ <td>
571
+ <%=tr("Access token to be used with every request to Geni API") %>
572
+ </td>
573
+ </tr>
574
+ <tr>
575
+ <td style="widtd:150px;">
576
+ expires_in
577
+ </td>
578
+ <td style="widtd:150px;">
579
+ Number
580
+ </td>
581
+ <td>
582
+ <%=tr("Seconds until the token will expire") %>
583
+ </td>
584
+ </tr>
585
+ <tr>
586
+ <td style="widtd:150px;">
587
+ refresh_token
588
+ </td>
589
+ <td style="widtd:150px;">
590
+ String
591
+ </td>
592
+ <td>
593
+ <%=tr("Token that can be used to get a new access token") %>
594
+ </td>
595
+ </tr>
596
+ </table>
597
+ </p>
598
+ <h3><%=tr("Example") %></h3>
599
+ <div class="code_snippet">
600
+ {"expires_in":86400,"refresh_token":"wEq6FMb3CcfPN6CckQv7","access_token":"sye4NMd130L4wqq13zjqqLHwuHd5jnnKwdVi9S8X"}
601
+ </div>
602
+ </div>
603
+ <%= render :partial => "footer" %>