discourse_api 0.11.0 → 0.12.0

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 (102) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +21 -21
  3. data/.travis.yml +5 -5
  4. data/CHANGELOG.md +105 -99
  5. data/Gemfile +4 -4
  6. data/Guardfile +5 -5
  7. data/LICENSE.txt +22 -22
  8. data/README.md +73 -73
  9. data/Rakefile +7 -7
  10. data/discourse_api.gemspec +35 -35
  11. data/examples/backups.rb +18 -18
  12. data/examples/category.rb +21 -21
  13. data/examples/change_topic_status.rb +33 -33
  14. data/examples/create_topic.rb +23 -23
  15. data/examples/create_user.rb +14 -14
  16. data/examples/dashboard.rb +13 -13
  17. data/examples/disposable_invite_tokens.rb +18 -18
  18. data/examples/example.rb +9 -9
  19. data/examples/groups.rb +25 -25
  20. data/examples/invite_users.rb +15 -15
  21. data/examples/post_action.rb +25 -25
  22. data/examples/search.rb +9 -9
  23. data/examples/sso.rb +14 -14
  24. data/examples/topic_lists.rb +15 -15
  25. data/examples/update_user.rb +22 -22
  26. data/lib/discourse_api.rb +5 -5
  27. data/lib/discourse_api/api/api_key.rb +31 -31
  28. data/lib/discourse_api/api/backups.rb +24 -24
  29. data/lib/discourse_api/api/badges.rb +28 -28
  30. data/lib/discourse_api/api/categories.rb +57 -57
  31. data/lib/discourse_api/api/dashboard.rb +24 -24
  32. data/lib/discourse_api/api/email.rb +15 -15
  33. data/lib/discourse_api/api/groups.rb +52 -52
  34. data/lib/discourse_api/api/invite.rb +17 -17
  35. data/lib/discourse_api/api/notifications.rb +9 -9
  36. data/lib/discourse_api/api/params.rb +55 -55
  37. data/lib/discourse_api/api/posts.rb +41 -41
  38. data/lib/discourse_api/api/private_messages.rb +10 -10
  39. data/lib/discourse_api/api/search.rb +19 -19
  40. data/lib/discourse_api/api/sso.rb +22 -22
  41. data/lib/discourse_api/api/tags.rb +10 -10
  42. data/lib/discourse_api/api/topics.rb +78 -78
  43. data/lib/discourse_api/api/users.rb +93 -85
  44. data/lib/discourse_api/client.rb +133 -133
  45. data/lib/discourse_api/error.rb +17 -17
  46. data/lib/discourse_api/single_sign_on.rb +110 -110
  47. data/lib/discourse_api/version.rb +3 -3
  48. data/routes.txt +203 -203
  49. data/spec/discourse_api/api/api_key_spec.rb +121 -121
  50. data/spec/discourse_api/api/backups_spec.rb +23 -23
  51. data/spec/discourse_api/api/badges_spec.rb +40 -40
  52. data/spec/discourse_api/api/categories_spec.rb +87 -87
  53. data/spec/discourse_api/api/email_spec.rb +39 -39
  54. data/spec/discourse_api/api/groups_spec.rb +94 -94
  55. data/spec/discourse_api/api/notifications_spec.rb +24 -24
  56. data/spec/discourse_api/api/params_spec.rb +32 -32
  57. data/spec/discourse_api/api/posts_spec.rb +41 -41
  58. data/spec/discourse_api/api/private_messages_spec.rb +22 -22
  59. data/spec/discourse_api/api/search_spec.rb +30 -30
  60. data/spec/discourse_api/api/sso_spec.rb +16 -16
  61. data/spec/discourse_api/api/topics_spec.rb +113 -113
  62. data/spec/discourse_api/api/users_spec.rb +255 -227
  63. data/spec/discourse_api/client_spec.rb +115 -115
  64. data/spec/fixtures/api.json +12 -12
  65. data/spec/fixtures/backups.json +12 -12
  66. data/spec/fixtures/badges.json +569 -569
  67. data/spec/fixtures/categories.json +72 -72
  68. data/spec/fixtures/category_latest_topics.json +92 -92
  69. data/spec/fixtures/category_topics.json +91 -91
  70. data/spec/fixtures/email_list_all.json +749 -749
  71. data/spec/fixtures/email_settings.json +13 -13
  72. data/spec/fixtures/generate_api_key.json +12 -12
  73. data/spec/fixtures/generate_master_key.json +7 -7
  74. data/spec/fixtures/groups.json +18 -18
  75. data/spec/fixtures/hot.json +113 -113
  76. data/spec/fixtures/latest.json +115 -115
  77. data/spec/fixtures/members_0.json +403 -403
  78. data/spec/fixtures/members_1.json +363 -363
  79. data/spec/fixtures/new.json +113 -113
  80. data/spec/fixtures/notifications.json +16 -16
  81. data/spec/fixtures/post.json +94 -94
  82. data/spec/fixtures/post_action_users.json +18 -18
  83. data/spec/fixtures/private_messages.json +69 -69
  84. data/spec/fixtures/regenerate_api_key.json +7 -7
  85. data/spec/fixtures/search.json +24 -24
  86. data/spec/fixtures/topic.json +739 -739
  87. data/spec/fixtures/topic_invite_user.json +3 -3
  88. data/spec/fixtures/topics_created_by.json +49 -49
  89. data/spec/fixtures/update_trust_level.json +37 -37
  90. data/spec/fixtures/upload_avatar.json +13 -13
  91. data/spec/fixtures/user.json +65 -65
  92. data/spec/fixtures/user_activate_success.json +3 -3
  93. data/spec/fixtures/user_badges.json +170 -170
  94. data/spec/fixtures/user_create_success.json +5 -5
  95. data/spec/fixtures/user_grant_admin.json +37 -37
  96. data/spec/fixtures/user_list.json +583 -583
  97. data/spec/fixtures/user_log_out_success.json +3 -3
  98. data/spec/fixtures/user_update_avatar_success.json +3 -3
  99. data/spec/fixtures/user_update_user.json +3 -3
  100. data/spec/fixtures/user_update_username.json +4 -4
  101. data/spec/spec_helper.rb +61 -61
  102. metadata +2 -2
@@ -1,17 +1,17 @@
1
- module DiscourseApi
2
- class Error < StandardError
3
- attr_reader :wrapped_exception
4
-
5
- # Initializes a new Error object
6
- #
7
- # @param exception [Exception, String]
8
- # @return [DiscourseApi::Error]
9
- def initialize(exception=$!)
10
- @wrapped_exception = exception
11
- exception.respond_to?(:message) ? super(exception.message) : super(exception.to_s)
12
- end
13
- end
14
-
15
- class UnauthenticatedError < StandardError
16
- end
17
- end
1
+ module DiscourseApi
2
+ class Error < StandardError
3
+ attr_reader :wrapped_exception
4
+
5
+ # Initializes a new Error object
6
+ #
7
+ # @param exception [Exception, String]
8
+ # @return [DiscourseApi::Error]
9
+ def initialize(exception=$!)
10
+ @wrapped_exception = exception
11
+ exception.respond_to?(:message) ? super(exception.message) : super(exception.to_s)
12
+ end
13
+ end
14
+
15
+ class UnauthenticatedError < StandardError
16
+ end
17
+ end
@@ -1,110 +1,110 @@
1
- require 'base64'
2
- require 'rack'
3
- require 'openssl'
4
-
5
- module DiscourseApi
6
- class SingleSignOn
7
- ACCESSORS = [:nonce, :name, :username, :email, :avatar_url, :avatar_force_update,
8
- :about_me, :external_id, :return_sso_url, :admin, :moderator, :suppress_welcome_message]
9
- FIXNUMS = []
10
- BOOLS = [:avatar_force_update, :admin, :moderator, :suppress_welcome_message]
11
- #NONCE_EXPIRY_TIME = 10.minutes # minutes is a rails method and is causing an error. Is this needed in the api?
12
-
13
- attr_accessor(*ACCESSORS)
14
- attr_accessor :sso_secret, :sso_url
15
-
16
- def self.sso_secret
17
- raise RuntimeError, "sso_secret not implemented on class, be sure to set it on instance"
18
- end
19
-
20
- def self.sso_url
21
- raise RuntimeError, "sso_url not implemented on class, be sure to set it on instance"
22
- end
23
-
24
- def self.parse(payload, sso_secret = nil)
25
- sso = new
26
- sso.sso_secret = sso_secret if sso_secret
27
-
28
- parsed = Rack::Utils.parse_query(payload)
29
- if sso.sign(parsed["sso"]) != parsed["sig"]
30
- diags = "\n\nsso: #{parsed["sso"]}\n\nsig: #{parsed["sig"]}\n\nexpected sig: #{sso.sign(parsed["sso"])}"
31
- if parsed["sso"] =~ /[^a-zA-Z0-9=\r\n\/+]/m
32
- raise RuntimeError, "The SSO field should be Base64 encoded, using only A-Z, a-z, 0-9, +, /, and = characters. Your input contains characters we don't understand as Base64, see http://en.wikipedia.org/wiki/Base64 #{diags}"
33
- else
34
- raise RuntimeError, "Bad signature for payload #{diags}"
35
- end
36
- end
37
-
38
- decoded = Base64.decode64(parsed["sso"])
39
- decoded_hash = Rack::Utils.parse_query(decoded)
40
-
41
- ACCESSORS.each do |k|
42
- val = decoded_hash[k.to_s]
43
- val = val.to_i if FIXNUMS.include? k
44
- if BOOLS.include? k
45
- val = ["true", "false"].include?(val) ? val == "true" : nil
46
- end
47
- sso.send("#{k}=", val)
48
- end
49
-
50
- decoded_hash.each do |k,v|
51
- # 1234567
52
- # custom.
53
- #
54
- if k[0..6] == "custom."
55
- field = k[7..-1]
56
- sso.custom_fields[field] = v
57
- end
58
- end
59
-
60
- sso
61
- end
62
-
63
- def sso_secret
64
- @sso_secret || self.class.sso_secret
65
- end
66
-
67
- def sso_url
68
- @sso_url || self.class.sso_url
69
- end
70
-
71
- def custom_fields
72
- @custom_fields ||= {}
73
- end
74
-
75
-
76
- def sign(payload)
77
- OpenSSL::HMAC.hexdigest("sha256", sso_secret, payload)
78
- end
79
-
80
-
81
- def to_url(base_url=nil)
82
- base = "#{base_url || sso_url}"
83
- "#{base}#{base.include?('?') ? '&' : '?'}#{payload}"
84
- end
85
-
86
- def payload
87
- payload = Base64.encode64(unsigned_payload)
88
- "sso=#{CGI::escape(payload)}&sig=#{sign(payload)}"
89
- end
90
-
91
- def unsigned_payload
92
- payload = {}
93
- ACCESSORS.each do |k|
94
- next if (val = send k) == nil
95
-
96
- payload[k] = val
97
- end
98
-
99
- if @custom_fields
100
- @custom_fields.each do |k,v|
101
- payload["custom.#{k}"] = v.to_s
102
- end
103
- end
104
-
105
- Rack::Utils.build_query(payload)
106
- end
107
-
108
- end
109
-
110
- end
1
+ require 'base64'
2
+ require 'rack'
3
+ require 'openssl'
4
+
5
+ module DiscourseApi
6
+ class SingleSignOn
7
+ ACCESSORS = [:nonce, :name, :username, :email, :avatar_url, :avatar_force_update,
8
+ :about_me, :external_id, :return_sso_url, :admin, :moderator, :suppress_welcome_message]
9
+ FIXNUMS = []
10
+ BOOLS = [:avatar_force_update, :admin, :moderator, :suppress_welcome_message]
11
+ #NONCE_EXPIRY_TIME = 10.minutes # minutes is a rails method and is causing an error. Is this needed in the api?
12
+
13
+ attr_accessor(*ACCESSORS)
14
+ attr_accessor :sso_secret, :sso_url
15
+
16
+ def self.sso_secret
17
+ raise RuntimeError, "sso_secret not implemented on class, be sure to set it on instance"
18
+ end
19
+
20
+ def self.sso_url
21
+ raise RuntimeError, "sso_url not implemented on class, be sure to set it on instance"
22
+ end
23
+
24
+ def self.parse(payload, sso_secret = nil)
25
+ sso = new
26
+ sso.sso_secret = sso_secret if sso_secret
27
+
28
+ parsed = Rack::Utils.parse_query(payload)
29
+ if sso.sign(parsed["sso"]) != parsed["sig"]
30
+ diags = "\n\nsso: #{parsed["sso"]}\n\nsig: #{parsed["sig"]}\n\nexpected sig: #{sso.sign(parsed["sso"])}"
31
+ if parsed["sso"] =~ /[^a-zA-Z0-9=\r\n\/+]/m
32
+ raise RuntimeError, "The SSO field should be Base64 encoded, using only A-Z, a-z, 0-9, +, /, and = characters. Your input contains characters we don't understand as Base64, see http://en.wikipedia.org/wiki/Base64 #{diags}"
33
+ else
34
+ raise RuntimeError, "Bad signature for payload #{diags}"
35
+ end
36
+ end
37
+
38
+ decoded = Base64.decode64(parsed["sso"])
39
+ decoded_hash = Rack::Utils.parse_query(decoded)
40
+
41
+ ACCESSORS.each do |k|
42
+ val = decoded_hash[k.to_s]
43
+ val = val.to_i if FIXNUMS.include? k
44
+ if BOOLS.include? k
45
+ val = ["true", "false"].include?(val) ? val == "true" : nil
46
+ end
47
+ sso.send("#{k}=", val)
48
+ end
49
+
50
+ decoded_hash.each do |k,v|
51
+ # 1234567
52
+ # custom.
53
+ #
54
+ if k[0..6] == "custom."
55
+ field = k[7..-1]
56
+ sso.custom_fields[field] = v
57
+ end
58
+ end
59
+
60
+ sso
61
+ end
62
+
63
+ def sso_secret
64
+ @sso_secret || self.class.sso_secret
65
+ end
66
+
67
+ def sso_url
68
+ @sso_url || self.class.sso_url
69
+ end
70
+
71
+ def custom_fields
72
+ @custom_fields ||= {}
73
+ end
74
+
75
+
76
+ def sign(payload)
77
+ OpenSSL::HMAC.hexdigest("sha256", sso_secret, payload)
78
+ end
79
+
80
+
81
+ def to_url(base_url=nil)
82
+ base = "#{base_url || sso_url}"
83
+ "#{base}#{base.include?('?') ? '&' : '?'}#{payload}"
84
+ end
85
+
86
+ def payload
87
+ payload = Base64.encode64(unsigned_payload)
88
+ "sso=#{CGI::escape(payload)}&sig=#{sign(payload)}"
89
+ end
90
+
91
+ def unsigned_payload
92
+ payload = {}
93
+ ACCESSORS.each do |k|
94
+ next if (val = send k) == nil
95
+
96
+ payload[k] = val
97
+ end
98
+
99
+ if @custom_fields
100
+ @custom_fields.each do |k,v|
101
+ payload["custom.#{k}"] = v.to_s
102
+ end
103
+ end
104
+
105
+ Rack::Utils.build_query(payload)
106
+ end
107
+
108
+ end
109
+
110
+ end
@@ -1,3 +1,3 @@
1
- module DiscourseApi
2
- VERSION = "0.11.0"
3
- end
1
+ module DiscourseApi
2
+ VERSION = "0.12.0"
3
+ end
data/routes.txt CHANGED
@@ -1,203 +1,203 @@
1
- forums GET /forums(.:format) forums#index
2
- POST /forums(.:format) forums#create
3
- new_forum GET /forums/new(.:format) forums#new
4
- edit_forum GET /forums/:id/edit(.:format) forums#edit
5
- forum GET /forums/:id(.:format) forums#show
6
- PUT /forums/:id(.:format) forums#update
7
- DELETE /forums/:id(.:format) forums#destroy
8
- srv_status GET /srv/status(.:format) forums#status
9
- admin_users_sync_sso POST /admin/users/sync_sso(.:format) admin/users#sync_sso
10
- generate_key_admin_api_index POST /admin/api/generate_key(.:format) admin/api#generate_key
11
- admin_api_index GET /admin/api(.:format) admin/api#index
12
- email_preferences_redirect GET /email_preferences(.:format) email#preferences_redirect
13
- email_unsubscribe GET /email/unsubscribe/:key(.:format) email#unsubscribe
14
- email_resubscribe POST /email/resubscribe/:key(.:format) email#resubscribe
15
- forgot_password_session_index POST /session/forgot_password(.:format) session#forgot_password {:id=>/[A-Za-z0-9\_]+/}
16
- session_index POST /session(.:format) session#create {:id=>/[A-Za-z0-9\_]+/}
17
- session DELETE /session/:id(.:format) session#destroy {:id=>/[A-Za-z0-9\_]+/}
18
- session_csrf GET /session/csrf(.:format) session#csrf
19
- GET /composer-messages(.:format) composer_messages#index
20
- check_username_users GET /users/check_username(.:format) users#check_username
21
- is_local_username_users GET /users/is_local_username(.:format) users#is_local_username
22
- users GET /users(.:format) users#index
23
- POST /users(.:format) users#create
24
- new_user GET /users/new(.:format) users#new
25
- edit_user GET /users/:id/edit(.:format) users#edit
26
- user DELETE /users/:id(.:format) users#destroy
27
- static_index GET /static(.:format) static#index
28
- POST /static(.:format) static#create
29
- new_static GET /static/new(.:format) static#new
30
- edit_static GET /static/:id/edit(.:format) static#edit
31
- static GET /static/:id(.:format) static#show
32
- PUT /static/:id(.:format) static#update
33
- DELETE /static/:id(.:format) static#destroy
34
- login POST /login(.:format) static#enter
35
- GET /login(.:format) static#show {:id=>"login"}
36
- faq GET /faq(.:format) static#show {:id=>"faq"}
37
- tos GET /tos(.:format) static#show {:id=>"tos"}
38
- privacy GET /privacy(.:format) static#show {:id=>"privacy"}
39
- users_search_users GET /users/search/users(.:format) users#search_users
40
- GET /users/password-reset/:token(.:format) users#password_reset
41
- PUT /users/password-reset/:token(.:format) users#password_reset
42
- GET /users/activate-account/:token(.:format) users#activate_account
43
- GET /users/authorize-email/:token(.:format) users#authorize_email
44
- users_hp GET /users/hp(.:format) users#get_honeypot_value
45
- user_preferences GET /user_preferences(.:format) users#user_preferences_redirect
46
- GET /users/:username/private-messages(.:format) user_actions#private_messages {:username=>/[A-Za-z0-9\_]+/}
47
- GET /users/:username/private-messages/:filter(.:format) user_actions#private_messages {:username=>/[A-Za-z0-9\_]+/}
48
- GET /users/:username(.:format) users#show {:username=>/[A-Za-z0-9\_]+/}
49
- PUT /users/:username(.:format) users#update {:username=>/[A-Za-z0-9\_]+/}
50
- email_preferences GET /users/:username/preferences(.:format) users#preferences {:username=>/[A-Za-z0-9\_]+/}
51
- GET /users/:username/preferences/email(.:format) users#preferences {:username=>/[A-Za-z0-9\_]+/}
52
- PUT /users/:username/preferences/email(.:format) users#change_email {:username=>/[A-Za-z0-9\_]+/}
53
- GET /users/:username/preferences/about-me(.:format) users#preferences {:username=>/[A-Za-z0-9\_]+/}
54
- GET /users/:username/preferences/username(.:format) users#preferences {:username=>/[A-Za-z0-9\_]+/}
55
- PUT /users/:username/preferences/username(.:format) users#username {:username=>/[A-Za-z0-9\_]+/}
56
- GET /users/:username/avatar(/:size)(.:format) users#avatar {:username=>/[A-Za-z0-9\_]+/}
57
- POST /users/:username/preferences/avatar(.:format) users#upload_avatar {:username=>/[A-Za-z0-9\_]+/}
58
- PUT /users/:username/preferences/avatar/toggle(.:format) users#toggle_avatar {:username=>/[A-Za-z0-9\_]+/}
59
- GET /users/:username/invited(.:format) users#invited {:username=>/[A-Za-z0-9\_]+/}
60
- POST /users/:username/send_activation_email(.:format) users#send_activation_email {:username=>/[A-Za-z0-9\_]+/}
61
- GET /users/:username/activity(.:format) users#show {:username=>/[A-Za-z0-9\_]+/}
62
- GET /users/:username/activity/:filter(.:format) users#show {:username=>/[A-Za-z0-9\_]+/}
63
- GET /uploads/:site/:id/:sha.:extension(.:format) uploads#show {:site=>/\w+/, :id=>/\d+/, :sha=>/[a-z0-9]{15,16}/i, :extension=>/\w{2,}/}
64
- uploads POST /uploads(.:format) uploads#create
65
- GET /posts/by_number/:topic_id/:post_number(.:format) posts#by_number
66
- GET /posts/:id/reply-history(.:format) posts#reply_history
67
- post_versions GET /posts/:post_id/versions(.:format) posts#versions
68
- post_bookmark PUT /posts/:post_id/bookmark(.:format) posts#bookmark
69
- post_replies GET /posts/:post_id/replies(.:format) posts#replies
70
- post_recover PUT /posts/:post_id/recover(.:format) posts#recover
71
- destroy_many_posts DELETE /posts/destroy_many(.:format) posts#destroy_many
72
- posts GET /posts(.:format) posts#index
73
- POST /posts(.:format) posts#create
74
- new_post GET /posts/new(.:format) posts#new
75
- edit_post GET /posts/:id/edit(.:format) posts#edit
76
- post GET /posts/:id(.:format) posts#show
77
- PUT /posts/:id(.:format) posts#update
78
- DELETE /posts/:id(.:format) posts#destroy
79
- GET /p/:post_id/:user_id(.:format) posts#short_link
80
- notifications GET /notifications(.:format) notifications#index
81
- POST /notifications(.:format) notifications#create
82
- new_notification GET /notifications/new(.:format) notifications#new
83
- edit_notification GET /notifications/:id/edit(.:format) notifications#edit
84
- notification GET /notifications/:id(.:format) notifications#show
85
- PUT /notifications/:id(.:format) notifications#update
86
- DELETE /notifications/:id(.:format) notifications#destroy
87
- GET|POST /auth/:provider/callback(.:format) users/omniauth_callbacks#complete
88
- auth_failure GET|POST /auth/failure(.:format) users/omniauth_callbacks#failure
89
- track_clicks GET /clicks/track(.:format) clicks#track
90
- clicks GET /clicks(.:format) clicks#index
91
- POST /clicks(.:format) clicks#create
92
- new_click GET /clicks/new(.:format) clicks#new
93
- edit_click GET /clicks/:id/edit(.:format) clicks#edit
94
- click GET /clicks/:id(.:format) clicks#show
95
- PUT /clicks/:id(.:format) clicks#update
96
- DELETE /clicks/:id(.:format) clicks#destroy
97
- excerpt GET /excerpt(.:format) excerpt#show
98
- users_post_actions GET /post_actions/users(.:format) post_actions#users
99
- clear_flags_post_actions POST /post_actions/clear_flags(.:format) post_actions#clear_flags
100
- post_actions GET /post_actions(.:format) post_actions#index
101
- POST /post_actions(.:format) post_actions#create
102
- new_post_action GET /post_actions/new(.:format) post_actions#new
103
- edit_post_action GET /post_actions/:id/edit(.:format) post_actions#edit
104
- post_action GET /post_actions/:id(.:format) post_actions#show
105
- PUT /post_actions/:id(.:format) post_actions#update
106
- DELETE /post_actions/:id(.:format) post_actions#destroy
107
- user_actions GET /user_actions(.:format) user_actions#index
108
- POST /user_actions(.:format) user_actions#create
109
- new_user_action GET /user_actions/new(.:format) user_actions#new
110
- edit_user_action GET /user_actions/:id/edit(.:format) user_actions#edit
111
- user_action GET /user_actions/:id(.:format) user_actions#show
112
- PUT /user_actions/:id(.:format) user_actions#update
113
- DELETE /user_actions/:id(.:format) user_actions#destroy
114
- categories GET /categories(.:format) categories#index
115
- POST /categories(.:format) categories#create
116
- new_category GET /categories/new(.:format) categories#new
117
- edit_category GET /categories/:id/edit(.:format) categories#edit
118
- category PUT /categories/:id(.:format) categories#update
119
- DELETE /categories/:id(.:format) categories#destroy
120
- GET /category/:id/show(.:format) categories#show
121
- category_feed GET /category/:category.rss(.:format) list#category_feed {:format=>:rss}
122
- category_list GET /category/:category(.:format) list#category
123
- category_list_more GET /category/:category/more(.:format) list#category
124
- popular GET /popular(.:format) list#popular_redirect
125
- popular_more GET /popular/more(.:format) list#popular_redirect
126
- latest_feed GET /latest.rss(.:format) list#latest_feed {:format=>:rss, :filter=>:latest}
127
- hot_feed GET /hot.rss(.:format) list#hot_feed {:format=>:rss, :filter=>:hot}
128
- latest GET /latest(.:format) list#latest
129
- latest_more GET /latest/more(.:format) list#latest
130
- hot GET /hot(.:format) list#hot
131
- hot_more GET /hot/more(.:format) list#hot
132
- favorited GET /favorited(.:format) list#favorited
133
- favorited_more GET /favorited/more(.:format) list#favorited
134
- read GET /read(.:format) list#read
135
- read_more GET /read/more(.:format) list#read
136
- posted GET /posted(.:format) list#posted
137
- posted_more GET /posted/more(.:format) list#posted
138
- unread GET /unread(.:format) list#unread
139
- unread_more GET /unread/more(.:format) list#unread
140
- new GET /new(.:format) list#new
141
- new_more GET /new/more(.:format) list#new
142
- search GET /search(.:format) search#query
143
- GET /t/:id(.:format) topics#show
144
- DELETE /t/:id(.:format) topics#destroy
145
- PUT /t/:id(.:format) topics#update
146
- t POST /t(.:format) topics#create
147
- topics_timings POST /topics/timings(.:format) topics#timings
148
- topics_similar_to GET /topics/similar_to(.:format) topics#similar_to
149
- topics_by GET /topics/created-by/:username(.:format) list#topics_by {:username=>/[A-Za-z0-9\_]+/}
150
- topics_private_messages GET /topics/private-messages/:username(.:format) list#private_messages {:username=>/[A-Za-z0-9\_]+/}
151
- topics_private_messages_sent GET /topics/private-messages-sent/:username(.:format) list#private_messages_sent {:username=>/[A-Za-z0-9\_]+/}
152
- topics_private_messages_unread GET /topics/private-messages-unread/:username(.:format) list#private_messages_unread {:username=>/[A-Za-z0-9\_]+/}
153
- GET /t/:slug/:topic_id/wordpress(.:format) topics#wordpress {:topic_id=>/\d+/}
154
- GET /t/:slug/:topic_id/moderator-liked(.:format) topics#moderator_liked {:topic_id=>/\d+/}
155
- GET /t/:topic_id/wordpress(.:format) topics#wordpress {:topic_id=>/\d+/}
156
- GET /t/:slug/:topic_id/best_of(.:format) topics#show {:topic_id=>/\d+/, :post_number=>/\d+/, :best_of=>true}
157
- GET /t/:topic_id/best_of(.:format) topics#show {:topic_id=>/\d+/, :post_number=>/\d+/}
158
- PUT /t/:slug/:topic_id(.:format) topics#update {:topic_id=>/\d+/}
159
- PUT /t/:slug/:topic_id/star(.:format) topics#star {:topic_id=>/\d+/}
160
- PUT /t/:topic_id/star(.:format) topics#star {:topic_id=>/\d+/}
161
- PUT /t/:slug/:topic_id/status(.:format) topics#status {:topic_id=>/\d+/}
162
- PUT /t/:topic_id/status(.:format) topics#status {:topic_id=>/\d+/}
163
- PUT /t/:topic_id/clear-pin(.:format) topics#clear_pin {:topic_id=>/\d+/}
164
- PUT /t/:topic_id/mute(.:format) topics#mute {:topic_id=>/\d+/}
165
- PUT /t/:topic_id/unmute(.:format) topics#unmute {:topic_id=>/\d+/}
166
- PUT /t/:topic_id/autoclose(.:format) topics#autoclose {:topic_id=>/\d+/}
167
- PUT /t/:topic_id/remove-allowed-user(.:format) topics#remove_allowed_user {:topic_id=>/\d+/}
168
- PUT /t/:topic_id/recover(.:format) topics#recover {:topic_id=>/\d+/}
169
- GET /t/:topic_id/:post_number(.:format) topics#show {:topic_id=>/\d+/, :post_number=>/\d+/}
170
- GET /t/:slug/:topic_id.rss(.:format) topics#feed {:topic_id=>/\d+/, :format=>:rss}
171
- GET /t/:slug/:topic_id(.:format) topics#show {:topic_id=>/\d+/}
172
- GET /t/:slug/:topic_id/:post_number(.:format) topics#show {:topic_id=>/\d+/, :post_number=>/\d+/}
173
- GET /t/:topic_id/posts(.:format) topics#posts {:topic_id=>/\d+/}
174
- POST /t/:topic_id/timings(.:format) topics#timings {:topic_id=>/\d+/}
175
- POST /t/:topic_id/invite(.:format) topics#invite {:topic_id=>/\d+/}
176
- POST /t/:topic_id/move-posts(.:format) topics#move_posts {:topic_id=>/\d+/}
177
- POST /t/:topic_id/merge-topic(.:format) topics#merge_topic {:topic_id=>/\d+/}
178
- DELETE /t/:topic_id/timings(.:format) topics#destroy_timings {:topic_id=>/\d+/}
179
- POST /t/:topic_id/notifications(.:format) topics#set_notifications {:topic_id=>/\d+/}
180
- GET /raw/:topic_id(/:post_number)(.:format) posts#markdown
181
- invites GET /invites(.:format) invites#index
182
- POST /invites(.:format) invites#create
183
- new_invite GET /invites/new(.:format) invites#new
184
- edit_invite GET /invites/:id/edit(.:format) invites#edit
185
- invite GET /invites/:id(.:format) invites#show
186
- PUT /invites/:id(.:format) invites#update
187
- DELETE /invites/:id(.:format) invites#destroy
188
- DELETE /invites(.:format) invites#destroy
189
- onebox GET /onebox(.:format) onebox#show
190
- error GET /error(.:format) forums#error
191
- GET /message-bus/poll(.:format) message_bus#poll
192
- draft GET /draft(.:format) draft#show
193
- POST /draft(.:format) draft#update
194
- DELETE /draft(.:format) draft#destroy
195
- GET /robots.txt(.:format) robots_txt#index
196
- list_latest / list#latest
197
- list_hot / list#hot
198
- list_unread / list#unread
199
- list_new / list#new
200
- list_favorited / list#favorited
201
- list_read / list#read
202
- list_posted / list#posted
203
- categories_index / categories#index
1
+ forums GET /forums(.:format) forums#index
2
+ POST /forums(.:format) forums#create
3
+ new_forum GET /forums/new(.:format) forums#new
4
+ edit_forum GET /forums/:id/edit(.:format) forums#edit
5
+ forum GET /forums/:id(.:format) forums#show
6
+ PUT /forums/:id(.:format) forums#update
7
+ DELETE /forums/:id(.:format) forums#destroy
8
+ srv_status GET /srv/status(.:format) forums#status
9
+ admin_users_sync_sso POST /admin/users/sync_sso(.:format) admin/users#sync_sso
10
+ generate_key_admin_api_index POST /admin/api/generate_key(.:format) admin/api#generate_key
11
+ admin_api_index GET /admin/api(.:format) admin/api#index
12
+ email_preferences_redirect GET /email_preferences(.:format) email#preferences_redirect
13
+ email_unsubscribe GET /email/unsubscribe/:key(.:format) email#unsubscribe
14
+ email_resubscribe POST /email/resubscribe/:key(.:format) email#resubscribe
15
+ forgot_password_session_index POST /session/forgot_password(.:format) session#forgot_password {:id=>/[A-Za-z0-9\_]+/}
16
+ session_index POST /session(.:format) session#create {:id=>/[A-Za-z0-9\_]+/}
17
+ session DELETE /session/:id(.:format) session#destroy {:id=>/[A-Za-z0-9\_]+/}
18
+ session_csrf GET /session/csrf(.:format) session#csrf
19
+ GET /composer-messages(.:format) composer_messages#index
20
+ check_username_users GET /users/check_username(.:format) users#check_username
21
+ is_local_username_users GET /users/is_local_username(.:format) users#is_local_username
22
+ users GET /users(.:format) users#index
23
+ POST /users(.:format) users#create
24
+ new_user GET /users/new(.:format) users#new
25
+ edit_user GET /users/:id/edit(.:format) users#edit
26
+ user DELETE /users/:id(.:format) users#destroy
27
+ static_index GET /static(.:format) static#index
28
+ POST /static(.:format) static#create
29
+ new_static GET /static/new(.:format) static#new
30
+ edit_static GET /static/:id/edit(.:format) static#edit
31
+ static GET /static/:id(.:format) static#show
32
+ PUT /static/:id(.:format) static#update
33
+ DELETE /static/:id(.:format) static#destroy
34
+ login POST /login(.:format) static#enter
35
+ GET /login(.:format) static#show {:id=>"login"}
36
+ faq GET /faq(.:format) static#show {:id=>"faq"}
37
+ tos GET /tos(.:format) static#show {:id=>"tos"}
38
+ privacy GET /privacy(.:format) static#show {:id=>"privacy"}
39
+ users_search_users GET /users/search/users(.:format) users#search_users
40
+ GET /users/password-reset/:token(.:format) users#password_reset
41
+ PUT /users/password-reset/:token(.:format) users#password_reset
42
+ GET /users/activate-account/:token(.:format) users#activate_account
43
+ GET /users/authorize-email/:token(.:format) users#authorize_email
44
+ users_hp GET /users/hp(.:format) users#get_honeypot_value
45
+ user_preferences GET /user_preferences(.:format) users#user_preferences_redirect
46
+ GET /users/:username/private-messages(.:format) user_actions#private_messages {:username=>/[A-Za-z0-9\_]+/}
47
+ GET /users/:username/private-messages/:filter(.:format) user_actions#private_messages {:username=>/[A-Za-z0-9\_]+/}
48
+ GET /users/:username(.:format) users#show {:username=>/[A-Za-z0-9\_]+/}
49
+ PUT /users/:username(.:format) users#update {:username=>/[A-Za-z0-9\_]+/}
50
+ email_preferences GET /users/:username/preferences(.:format) users#preferences {:username=>/[A-Za-z0-9\_]+/}
51
+ GET /users/:username/preferences/email(.:format) users#preferences {:username=>/[A-Za-z0-9\_]+/}
52
+ PUT /users/:username/preferences/email(.:format) users#change_email {:username=>/[A-Za-z0-9\_]+/}
53
+ GET /users/:username/preferences/about-me(.:format) users#preferences {:username=>/[A-Za-z0-9\_]+/}
54
+ GET /users/:username/preferences/username(.:format) users#preferences {:username=>/[A-Za-z0-9\_]+/}
55
+ PUT /users/:username/preferences/username(.:format) users#username {:username=>/[A-Za-z0-9\_]+/}
56
+ GET /users/:username/avatar(/:size)(.:format) users#avatar {:username=>/[A-Za-z0-9\_]+/}
57
+ POST /users/:username/preferences/avatar(.:format) users#upload_avatar {:username=>/[A-Za-z0-9\_]+/}
58
+ PUT /users/:username/preferences/avatar/toggle(.:format) users#toggle_avatar {:username=>/[A-Za-z0-9\_]+/}
59
+ GET /users/:username/invited(.:format) users#invited {:username=>/[A-Za-z0-9\_]+/}
60
+ POST /users/:username/send_activation_email(.:format) users#send_activation_email {:username=>/[A-Za-z0-9\_]+/}
61
+ GET /users/:username/activity(.:format) users#show {:username=>/[A-Za-z0-9\_]+/}
62
+ GET /users/:username/activity/:filter(.:format) users#show {:username=>/[A-Za-z0-9\_]+/}
63
+ GET /uploads/:site/:id/:sha.:extension(.:format) uploads#show {:site=>/\w+/, :id=>/\d+/, :sha=>/[a-z0-9]{15,16}/i, :extension=>/\w{2,}/}
64
+ uploads POST /uploads(.:format) uploads#create
65
+ GET /posts/by_number/:topic_id/:post_number(.:format) posts#by_number
66
+ GET /posts/:id/reply-history(.:format) posts#reply_history
67
+ post_versions GET /posts/:post_id/versions(.:format) posts#versions
68
+ post_bookmark PUT /posts/:post_id/bookmark(.:format) posts#bookmark
69
+ post_replies GET /posts/:post_id/replies(.:format) posts#replies
70
+ post_recover PUT /posts/:post_id/recover(.:format) posts#recover
71
+ destroy_many_posts DELETE /posts/destroy_many(.:format) posts#destroy_many
72
+ posts GET /posts(.:format) posts#index
73
+ POST /posts(.:format) posts#create
74
+ new_post GET /posts/new(.:format) posts#new
75
+ edit_post GET /posts/:id/edit(.:format) posts#edit
76
+ post GET /posts/:id(.:format) posts#show
77
+ PUT /posts/:id(.:format) posts#update
78
+ DELETE /posts/:id(.:format) posts#destroy
79
+ GET /p/:post_id/:user_id(.:format) posts#short_link
80
+ notifications GET /notifications(.:format) notifications#index
81
+ POST /notifications(.:format) notifications#create
82
+ new_notification GET /notifications/new(.:format) notifications#new
83
+ edit_notification GET /notifications/:id/edit(.:format) notifications#edit
84
+ notification GET /notifications/:id(.:format) notifications#show
85
+ PUT /notifications/:id(.:format) notifications#update
86
+ DELETE /notifications/:id(.:format) notifications#destroy
87
+ GET|POST /auth/:provider/callback(.:format) users/omniauth_callbacks#complete
88
+ auth_failure GET|POST /auth/failure(.:format) users/omniauth_callbacks#failure
89
+ track_clicks GET /clicks/track(.:format) clicks#track
90
+ clicks GET /clicks(.:format) clicks#index
91
+ POST /clicks(.:format) clicks#create
92
+ new_click GET /clicks/new(.:format) clicks#new
93
+ edit_click GET /clicks/:id/edit(.:format) clicks#edit
94
+ click GET /clicks/:id(.:format) clicks#show
95
+ PUT /clicks/:id(.:format) clicks#update
96
+ DELETE /clicks/:id(.:format) clicks#destroy
97
+ excerpt GET /excerpt(.:format) excerpt#show
98
+ users_post_actions GET /post_actions/users(.:format) post_actions#users
99
+ clear_flags_post_actions POST /post_actions/clear_flags(.:format) post_actions#clear_flags
100
+ post_actions GET /post_actions(.:format) post_actions#index
101
+ POST /post_actions(.:format) post_actions#create
102
+ new_post_action GET /post_actions/new(.:format) post_actions#new
103
+ edit_post_action GET /post_actions/:id/edit(.:format) post_actions#edit
104
+ post_action GET /post_actions/:id(.:format) post_actions#show
105
+ PUT /post_actions/:id(.:format) post_actions#update
106
+ DELETE /post_actions/:id(.:format) post_actions#destroy
107
+ user_actions GET /user_actions(.:format) user_actions#index
108
+ POST /user_actions(.:format) user_actions#create
109
+ new_user_action GET /user_actions/new(.:format) user_actions#new
110
+ edit_user_action GET /user_actions/:id/edit(.:format) user_actions#edit
111
+ user_action GET /user_actions/:id(.:format) user_actions#show
112
+ PUT /user_actions/:id(.:format) user_actions#update
113
+ DELETE /user_actions/:id(.:format) user_actions#destroy
114
+ categories GET /categories(.:format) categories#index
115
+ POST /categories(.:format) categories#create
116
+ new_category GET /categories/new(.:format) categories#new
117
+ edit_category GET /categories/:id/edit(.:format) categories#edit
118
+ category PUT /categories/:id(.:format) categories#update
119
+ DELETE /categories/:id(.:format) categories#destroy
120
+ GET /category/:id/show(.:format) categories#show
121
+ category_feed GET /category/:category.rss(.:format) list#category_feed {:format=>:rss}
122
+ category_list GET /category/:category(.:format) list#category
123
+ category_list_more GET /category/:category/more(.:format) list#category
124
+ popular GET /popular(.:format) list#popular_redirect
125
+ popular_more GET /popular/more(.:format) list#popular_redirect
126
+ latest_feed GET /latest.rss(.:format) list#latest_feed {:format=>:rss, :filter=>:latest}
127
+ hot_feed GET /hot.rss(.:format) list#hot_feed {:format=>:rss, :filter=>:hot}
128
+ latest GET /latest(.:format) list#latest
129
+ latest_more GET /latest/more(.:format) list#latest
130
+ hot GET /hot(.:format) list#hot
131
+ hot_more GET /hot/more(.:format) list#hot
132
+ favorited GET /favorited(.:format) list#favorited
133
+ favorited_more GET /favorited/more(.:format) list#favorited
134
+ read GET /read(.:format) list#read
135
+ read_more GET /read/more(.:format) list#read
136
+ posted GET /posted(.:format) list#posted
137
+ posted_more GET /posted/more(.:format) list#posted
138
+ unread GET /unread(.:format) list#unread
139
+ unread_more GET /unread/more(.:format) list#unread
140
+ new GET /new(.:format) list#new
141
+ new_more GET /new/more(.:format) list#new
142
+ search GET /search(.:format) search#query
143
+ GET /t/:id(.:format) topics#show
144
+ DELETE /t/:id(.:format) topics#destroy
145
+ PUT /t/:id(.:format) topics#update
146
+ t POST /t(.:format) topics#create
147
+ topics_timings POST /topics/timings(.:format) topics#timings
148
+ topics_similar_to GET /topics/similar_to(.:format) topics#similar_to
149
+ topics_by GET /topics/created-by/:username(.:format) list#topics_by {:username=>/[A-Za-z0-9\_]+/}
150
+ topics_private_messages GET /topics/private-messages/:username(.:format) list#private_messages {:username=>/[A-Za-z0-9\_]+/}
151
+ topics_private_messages_sent GET /topics/private-messages-sent/:username(.:format) list#private_messages_sent {:username=>/[A-Za-z0-9\_]+/}
152
+ topics_private_messages_unread GET /topics/private-messages-unread/:username(.:format) list#private_messages_unread {:username=>/[A-Za-z0-9\_]+/}
153
+ GET /t/:slug/:topic_id/wordpress(.:format) topics#wordpress {:topic_id=>/\d+/}
154
+ GET /t/:slug/:topic_id/moderator-liked(.:format) topics#moderator_liked {:topic_id=>/\d+/}
155
+ GET /t/:topic_id/wordpress(.:format) topics#wordpress {:topic_id=>/\d+/}
156
+ GET /t/:slug/:topic_id/best_of(.:format) topics#show {:topic_id=>/\d+/, :post_number=>/\d+/, :best_of=>true}
157
+ GET /t/:topic_id/best_of(.:format) topics#show {:topic_id=>/\d+/, :post_number=>/\d+/}
158
+ PUT /t/:slug/:topic_id(.:format) topics#update {:topic_id=>/\d+/}
159
+ PUT /t/:slug/:topic_id/star(.:format) topics#star {:topic_id=>/\d+/}
160
+ PUT /t/:topic_id/star(.:format) topics#star {:topic_id=>/\d+/}
161
+ PUT /t/:slug/:topic_id/status(.:format) topics#status {:topic_id=>/\d+/}
162
+ PUT /t/:topic_id/status(.:format) topics#status {:topic_id=>/\d+/}
163
+ PUT /t/:topic_id/clear-pin(.:format) topics#clear_pin {:topic_id=>/\d+/}
164
+ PUT /t/:topic_id/mute(.:format) topics#mute {:topic_id=>/\d+/}
165
+ PUT /t/:topic_id/unmute(.:format) topics#unmute {:topic_id=>/\d+/}
166
+ PUT /t/:topic_id/autoclose(.:format) topics#autoclose {:topic_id=>/\d+/}
167
+ PUT /t/:topic_id/remove-allowed-user(.:format) topics#remove_allowed_user {:topic_id=>/\d+/}
168
+ PUT /t/:topic_id/recover(.:format) topics#recover {:topic_id=>/\d+/}
169
+ GET /t/:topic_id/:post_number(.:format) topics#show {:topic_id=>/\d+/, :post_number=>/\d+/}
170
+ GET /t/:slug/:topic_id.rss(.:format) topics#feed {:topic_id=>/\d+/, :format=>:rss}
171
+ GET /t/:slug/:topic_id(.:format) topics#show {:topic_id=>/\d+/}
172
+ GET /t/:slug/:topic_id/:post_number(.:format) topics#show {:topic_id=>/\d+/, :post_number=>/\d+/}
173
+ GET /t/:topic_id/posts(.:format) topics#posts {:topic_id=>/\d+/}
174
+ POST /t/:topic_id/timings(.:format) topics#timings {:topic_id=>/\d+/}
175
+ POST /t/:topic_id/invite(.:format) topics#invite {:topic_id=>/\d+/}
176
+ POST /t/:topic_id/move-posts(.:format) topics#move_posts {:topic_id=>/\d+/}
177
+ POST /t/:topic_id/merge-topic(.:format) topics#merge_topic {:topic_id=>/\d+/}
178
+ DELETE /t/:topic_id/timings(.:format) topics#destroy_timings {:topic_id=>/\d+/}
179
+ POST /t/:topic_id/notifications(.:format) topics#set_notifications {:topic_id=>/\d+/}
180
+ GET /raw/:topic_id(/:post_number)(.:format) posts#markdown
181
+ invites GET /invites(.:format) invites#index
182
+ POST /invites(.:format) invites#create
183
+ new_invite GET /invites/new(.:format) invites#new
184
+ edit_invite GET /invites/:id/edit(.:format) invites#edit
185
+ invite GET /invites/:id(.:format) invites#show
186
+ PUT /invites/:id(.:format) invites#update
187
+ DELETE /invites/:id(.:format) invites#destroy
188
+ DELETE /invites(.:format) invites#destroy
189
+ onebox GET /onebox(.:format) onebox#show
190
+ error GET /error(.:format) forums#error
191
+ GET /message-bus/poll(.:format) message_bus#poll
192
+ draft GET /draft(.:format) draft#show
193
+ POST /draft(.:format) draft#update
194
+ DELETE /draft(.:format) draft#destroy
195
+ GET /robots.txt(.:format) robots_txt#index
196
+ list_latest / list#latest
197
+ list_hot / list#hot
198
+ list_unread / list#unread
199
+ list_new / list#new
200
+ list_favorited / list#favorited
201
+ list_read / list#read
202
+ list_posted / list#posted
203
+ categories_index / categories#index