You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

502 lines
15 KiB

8 years ago
7 years ago
Add Keybase integration (#10297) * create account_identity_proofs table * add endpoint for keybase to check local proofs * add async task to update validity and liveness of proofs from keybase * first pass keybase proof CRUD * second pass keybase proof creation * clean up proof list and add badges * add avatar url to keybase api * Always highlight the “Identity Proofs” navigation item when interacting with proofs. * Update translations. * Add profile URL. * Reorder proofs. * Add proofs to bio. * Update settings/identity_proofs front-end. * Use `link_to`. * Only encode query params if they exist. URLs without params had a trailing `?`. * Only show live proofs. * change valid to active in proof list and update liveness before displaying * minor fixes * add keybase config at well-known path * extremely naive feature flagging off the identity proof UI * fixes for rubocop * make identity proofs page resilient to potential keybase issues * normalize i18n * tweaks for brakeman * remove two unused translations * cleanup and add more localizations * make keybase_contacts an admin setting * fix ExternalProofService my_domain * use Addressable::URI in identity proofs * use active model serializer for keybase proof config * more cleanup of keybase proof config * rename proof is_valid and is_live to proof_valid and proof_live * cleanup * assorted tweaks for more robust communication with keybase * Clean up * Small fixes * Display verified identity identically to verified links * Clean up unused CSS * Add caching for Keybase avatar URLs * Remove keybase_contacts setting
5 years ago
Add Keybase integration (#10297) * create account_identity_proofs table * add endpoint for keybase to check local proofs * add async task to update validity and liveness of proofs from keybase * first pass keybase proof CRUD * second pass keybase proof creation * clean up proof list and add badges * add avatar url to keybase api * Always highlight the “Identity Proofs” navigation item when interacting with proofs. * Update translations. * Add profile URL. * Reorder proofs. * Add proofs to bio. * Update settings/identity_proofs front-end. * Use `link_to`. * Only encode query params if they exist. URLs without params had a trailing `?`. * Only show live proofs. * change valid to active in proof list and update liveness before displaying * minor fixes * add keybase config at well-known path * extremely naive feature flagging off the identity proof UI * fixes for rubocop * make identity proofs page resilient to potential keybase issues * normalize i18n * tweaks for brakeman * remove two unused translations * cleanup and add more localizations * make keybase_contacts an admin setting * fix ExternalProofService my_domain * use Addressable::URI in identity proofs * use active model serializer for keybase proof config * more cleanup of keybase proof config * rename proof is_valid and is_live to proof_valid and proof_live * cleanup * assorted tweaks for more robust communication with keybase * Clean up * Small fixes * Display verified identity identically to verified links * Clean up unused CSS * Add caching for Keybase avatar URLs * Remove keybase_contacts setting
5 years ago
Add Keybase integration (#10297) * create account_identity_proofs table * add endpoint for keybase to check local proofs * add async task to update validity and liveness of proofs from keybase * first pass keybase proof CRUD * second pass keybase proof creation * clean up proof list and add badges * add avatar url to keybase api * Always highlight the “Identity Proofs” navigation item when interacting with proofs. * Update translations. * Add profile URL. * Reorder proofs. * Add proofs to bio. * Update settings/identity_proofs front-end. * Use `link_to`. * Only encode query params if they exist. URLs without params had a trailing `?`. * Only show live proofs. * change valid to active in proof list and update liveness before displaying * minor fixes * add keybase config at well-known path * extremely naive feature flagging off the identity proof UI * fixes for rubocop * make identity proofs page resilient to potential keybase issues * normalize i18n * tweaks for brakeman * remove two unused translations * cleanup and add more localizations * make keybase_contacts an admin setting * fix ExternalProofService my_domain * use Addressable::URI in identity proofs * use active model serializer for keybase proof config * more cleanup of keybase proof config * rename proof is_valid and is_live to proof_valid and proof_live * cleanup * assorted tweaks for more robust communication with keybase * Clean up * Small fixes * Display verified identity identically to verified links * Clean up unused CSS * Add caching for Keybase avatar URLs * Remove keybase_contacts setting
5 years ago
Account domain blocks (#2381) * Add <ostatus:conversation /> tag to Atom input/output Only uses ref attribute (not href) because href would be the alternate link that's always included also. Creates new conversation for every non-reply status. Carries over conversation for every reply. Keeps remote URIs verbatim, generates local URIs on the fly like the rest of them. * Conversation muting - prevents notifications that reference a conversation (including replies, favourites, reblogs) from being created. API endpoints /api/v1/statuses/:id/mute and /api/v1/statuses/:id/unmute Currently no way to tell when a status/conversation is muted, so the web UI only has a "disable notifications" button, doesn't work as a toggle * Display "Dismiss notifications" on all statuses in notifications column, not just own * Add "muted" as a boolean attribute on statuses JSON For now always false on contained reblogs, since it's only relevant for statuses returned from the notifications endpoint, which are not nested Remove "Disable notifications" from detailed status view, since it's only relevant in the notifications column * Up max class length * Remove pending test for conversation mute * Add tests, clean up * Rename to "mute conversation" and "unmute conversation" * Raise validation error when trying to mute/unmute status without conversation * Adding account domain blocks that filter notifications and public timelines * Add tests for domain blocks in notifications, public timelines Filter reblogs of blocked domains from home * Add API for listing and creating account domain blocks * API for creating/deleting domain blocks, tests for Status#ancestors and Status#descendants, filter domain blocks from them * Filter domains in streaming API * Update account_domain_block_spec.rb
7 years ago
Web Push Notifications (#3243) * feat: Register push subscription * feat: Notify when mentioned * feat: Boost, favourite, reply, follow, follow request * feat: Notification interaction * feat: Handle change of public key * feat: Unsubscribe if things go wrong * feat: Do not send normal notifications if push is enabled * feat: Focus client if open * refactor: Move push logic to WebPushSubscription * feat: Better title and body * feat: Localize messages * chore: Fix lint errors * feat: Settings * refactor: Lazy load * fix: Check if push settings exist * feat: Device-based preferences * refactor: Simplify logic * refactor: Pull request feedback * refactor: Pull request feedback * refactor: Create /api/web/push_subscriptions endpoint * feat: Spec PushSubscriptionController * refactor: WebPushSubscription => Web::PushSubscription * feat: Spec Web::PushSubscription * feat: Display first media attachment * feat: Support direction * fix: Stuff broken while rebasing * refactor: Integration with session activations * refactor: Cleanup * refactor: Simplify implementation * feat: Set VAPID keys via environment * chore: Comments * fix: Crash when no alerts * fix: Set VAPID keys in testing environment * fix: Follow link * feat: Notification actions * fix: Delete previous subscription * chore: Temporary logs * refactor: Move migration to a later date * fix: Fetch the correct session activation and misc bugs * refactor: Move migration to a later date * fix: Remove follow request (no notifications) * feat: Send administrator contact to push service * feat: Set time-to-live * fix: Do not show sensitive images * fix: Reducer crash in error handling * feat: Add badge * chore: Fix lint error * fix: Checkbox label overlap * fix: Check for payload support * fix: Rename action "type" (crash in latest Chrome) * feat: Action to expand notification * fix: Lint errors * fix: Unescape notification body * fix: Do not allow boosting if the status is hidden * feat: Add VAPID keys to the production sample environment * fix: Strip HTML tags from status * refactor: Better error messages * refactor: Handle browser not implementing the VAPID protocol (Samsung Internet) * fix: Error when target_status is nil * fix: Handle lack of image * fix: Delete reference to invalid subscriptions * feat: Better error handling * fix: Unescape HTML characters after tags are striped * refactor: Simpify code * fix: Modify to work with #4091 * Sort strings alphabetically * i18n: Updated Polish translation it annoys me that it's not fully localized :P * refactor: Use current_session in PushSubscriptionController * fix: Rebase mistake * fix: Set cacheName to mastodon * refactor: Pull request feedback * refactor: Remove logging statements * chore(yarn): Fix conflicts with master * chore(yarn): Copy latest from master * chore(yarn): Readd offline-plugin * refactor: Use save! and update! * refactor: Send notifications async * fix: Allow retry when push fails * fix: Save track for failed pushes * fix: Minify sw.js * fix: Remove account_id from fabricator
6 years ago
8 years ago
  1. # frozen_string_literal: true
  2. require 'sidekiq_unique_jobs/web'
  3. require 'sidekiq-scheduler/web'
  4. Sidekiq::Web.set :session_secret, Rails.application.secrets[:secret_key_base]
  5. Rails.application.routes.draw do
  6. root 'home#index'
  7. mount LetterOpenerWeb::Engine, at: 'letter_opener' if Rails.env.development?
  8. health_check_routes
  9. authenticate :user, lambda { |u| u.admin? } do
  10. mount Sidekiq::Web, at: 'sidekiq', as: :sidekiq
  11. mount PgHero::Engine, at: 'pghero', as: :pghero
  12. end
  13. use_doorkeeper do
  14. controllers authorizations: 'oauth/authorizations',
  15. authorized_applications: 'oauth/authorized_applications',
  16. tokens: 'oauth/tokens'
  17. end
  18. get '.well-known/host-meta', to: 'well_known/host_meta#show', as: :host_meta, defaults: { format: 'xml' }
  19. get '.well-known/nodeinfo', to: 'well_known/nodeinfo#index', as: :nodeinfo, defaults: { format: 'json' }
  20. get '.well-known/webfinger', to: 'well_known/webfinger#show', as: :webfinger
  21. get '.well-known/change-password', to: redirect('/auth/edit')
  22. get '.well-known/keybase-proof-config', to: 'well_known/keybase_proof_config#show'
  23. get '/nodeinfo/2.0', to: 'well_known/nodeinfo#show', as: :nodeinfo_schema
  24. get 'manifest', to: 'manifests#show', defaults: { format: 'json' }
  25. get 'intent', to: 'intents#show'
  26. get 'custom.css', to: 'custom_css#show', as: :custom_css
  27. resource :instance_actor, path: 'actor', only: [:show] do
  28. resource :inbox, only: [:create], module: :activitypub
  29. end
  30. devise_scope :user do
  31. get '/invite/:invite_code', to: 'auth/registrations#new', as: :public_invite
  32. namespace :auth do
  33. resource :setup, only: [:show, :update], controller: :setup
  34. resource :challenge, only: [:create], controller: :challenges
  35. end
  36. end
  37. devise_for :users, path: 'auth', controllers: {
  38. omniauth_callbacks: 'auth/omniauth_callbacks',
  39. sessions: 'auth/sessions',
  40. registrations: 'auth/registrations',
  41. passwords: 'auth/passwords',
  42. confirmations: 'auth/confirmations',
  43. }
  44. get '/users/:username', to: redirect('/@%{username}'), constraints: lambda { |req| req.format.nil? || req.format.html? }
  45. get '/authorize_follow', to: redirect { |_, request| "/authorize_interaction?#{request.params.to_query}" }
  46. resources :accounts, path: 'users', only: [:show], param: :username do
  47. get :remote_follow, to: 'remote_follow#new'
  48. post :remote_follow, to: 'remote_follow#create'
  49. resources :statuses, only: [:show] do
  50. member do
  51. get :activity
  52. get :embed
  53. end
  54. resources :replies, only: [:index], module: :activitypub
  55. end
  56. resources :followers, only: [:index], controller: :follower_accounts
  57. resources :following, only: [:index], controller: :following_accounts
  58. resource :follow, only: [:create], controller: :account_follow
  59. resource :unfollow, only: [:create], controller: :account_unfollow
  60. resource :outbox, only: [:show], module: :activitypub
  61. resource :inbox, only: [:create], module: :activitypub
  62. resource :claim, only: [:create], module: :activitypub
  63. resources :collections, only: [:show], module: :activitypub
  64. end
  65. resource :inbox, only: [:create], module: :activitypub
  66. get '/@:username', to: 'accounts#show', as: :short_account
  67. get '/@:username/with_replies', to: 'accounts#show', as: :short_account_with_replies
  68. get '/@:username/media', to: 'accounts#show', as: :short_account_media
  69. get '/@:username/tagged/:tag', to: 'accounts#show', as: :short_account_tag
  70. get '/@:account_username/:id', to: 'statuses#show', as: :short_account_status
  71. get '/@:account_username/:id/embed', to: 'statuses#embed', as: :embed_short_account_status
  72. get '/interact/:id', to: 'remote_interaction#new', as: :remote_interaction
  73. post '/interact/:id', to: 'remote_interaction#create'
  74. get '/explore', to: 'directories#index', as: :explore
  75. get '/explore/:id', to: 'directories#show', as: :explore_hashtag
  76. get '/settings', to: redirect('/settings/profile')
  77. namespace :settings do
  78. resource :profile, only: [:show, :update] do
  79. resources :pictures, only: :destroy
  80. end
  81. get :preferences, to: redirect('/settings/preferences/appearance')
  82. namespace :preferences do
  83. resource :appearance, only: [:show, :update], controller: :appearance
  84. resource :notifications, only: [:show, :update]
  85. resource :other, only: [:show, :update], controller: :other
  86. end
  87. resource :import, only: [:show, :create]
  88. resource :export, only: [:show, :create]
  89. namespace :exports, constraints: { format: :csv } do
  90. resources :follows, only: :index, controller: :following_accounts
  91. resources :blocks, only: :index, controller: :blocked_accounts
  92. resources :mutes, only: :index, controller: :muted_accounts
  93. resources :lists, only: :index, controller: :lists
  94. resources :domain_blocks, only: :index, controller: :blocked_domains
  95. end
  96. resource :two_factor_authentication, only: [:show, :create, :destroy]
  97. namespace :two_factor_authentication do
  98. resources :recovery_codes, only: [:create]
  99. resource :confirmation, only: [:new, :create]
  100. end
  101. resources :identity_proofs, only: [:index, :new, :create, :destroy]
  102. resources :applications, except: [:edit] do
  103. member do
  104. post :regenerate
  105. end
  106. end
  107. resource :delete, only: [:show, :destroy]
  108. resource :migration, only: [:show, :create]
  109. namespace :migration do
  110. resource :redirect, only: [:new, :create, :destroy]
  111. end
  112. resources :aliases, only: [:index, :create, :destroy]
  113. resources :sessions, only: [:destroy]
  114. resources :featured_tags, only: [:index, :create, :destroy]
  115. end
  116. resources :media, only: [:show] do
  117. get :player
  118. end
  119. resources :tags, only: [:show]
  120. resources :emojis, only: [:show]
  121. resources :invites, only: [:index, :create, :destroy]
  122. resources :filters, except: [:show]
  123. resource :relationships, only: [:show, :update]
  124. get '/public', to: 'public_timelines#show', as: :public_timeline
  125. get '/media_proxy/:id/(*any)', to: 'media_proxy#show', as: :media_proxy
  126. resource :authorize_interaction, only: [:show, :create]
  127. resource :share, only: [:show, :create]
  128. namespace :admin do
  129. get '/dashboard', to: 'dashboard#index'
  130. resources :domain_allows, only: [:new, :create, :show, :destroy]
  131. resources :domain_blocks, only: [:new, :create, :show, :destroy, :update] do
  132. member do
  133. get :edit
  134. end
  135. end
  136. resources :email_domain_blocks, only: [:index, :new, :create, :destroy]
  137. resources :action_logs, only: [:index]
  138. resources :warning_presets, except: [:new]
  139. resources :announcements, except: [:show] do
  140. member do
  141. post :publish
  142. post :unpublish
  143. end
  144. end
  145. resource :settings, only: [:edit, :update]
  146. resources :site_uploads, only: [:destroy]
  147. resources :invites, only: [:index, :create, :destroy] do
  148. collection do
  149. post :deactivate_all
  150. end
  151. end
  152. resources :relays, only: [:index, :new, :create, :destroy] do
  153. member do
  154. post :enable
  155. post :disable
  156. end
  157. end
  158. resources :instances, only: [:index, :show], constraints: { id: /[^\/]+/ }
  159. resources :reports, only: [:index, :show] do
  160. member do
  161. post :assign_to_self
  162. post :unassign
  163. post :reopen
  164. post :resolve
  165. end
  166. resources :reported_statuses, only: [:create]
  167. end
  168. resources :report_notes, only: [:create, :destroy]
  169. resources :accounts, only: [:index, :show] do
  170. member do
  171. post :enable
  172. post :unsilence
  173. post :unsuspend
  174. post :redownload
  175. post :remove_avatar
  176. post :remove_header
  177. post :memorialize
  178. post :approve
  179. post :reject
  180. end
  181. resource :change_email, only: [:show, :update]
  182. resource :reset, only: [:create]
  183. resource :action, only: [:new, :create], controller: 'account_actions'
  184. resources :statuses, only: [:index, :show, :create, :update, :destroy]
  185. resources :relationships, only: [:index]
  186. resource :confirmation, only: [:create] do
  187. collection do
  188. post :resend
  189. end
  190. end
  191. resource :role, only: [] do
  192. member do
  193. post :promote
  194. post :demote
  195. end
  196. end
  197. end
  198. resources :pending_accounts, only: [:index] do
  199. collection do
  200. post :approve_all
  201. post :reject_all
  202. post :batch
  203. end
  204. end
  205. resources :users, only: [] do
  206. resource :two_factor_authentication, only: [:destroy]
  207. end
  208. resources :custom_emojis, only: [:index, :new, :create] do
  209. collection do
  210. post :batch
  211. end
  212. end
  213. resources :account_moderation_notes, only: [:create, :destroy]
  214. resources :tags, only: [:index, :show, :update] do
  215. collection do
  216. post :approve_all
  217. post :reject_all
  218. post :batch
  219. end
  220. end
  221. end
  222. get '/admin', to: redirect('/admin/dashboard', status: 302)
  223. namespace :api do
  224. # OEmbed
  225. get '/oembed', to: 'oembed#show', as: :oembed
  226. # Identity proofs
  227. get :proofs, to: 'proofs#index'
  228. # JSON / REST API
  229. namespace :v1 do
  230. resources :statuses, only: [:create, :show, :destroy] do
  231. scope module: :statuses do
  232. resources :reblogged_by, controller: :reblogged_by_accounts, only: :index
  233. resources :favourited_by, controller: :favourited_by_accounts, only: :index
  234. resource :reblog, only: :create
  235. post :unreblog, to: 'reblogs#destroy'
  236. resource :favourite, only: :create
  237. post :unfavourite, to: 'favourites#destroy'
  238. resource :bookmark, only: :create
  239. post :unbookmark, to: 'bookmarks#destroy'
  240. resource :mute, only: :create
  241. post :unmute, to: 'mutes#destroy'
  242. resource :pin, only: :create
  243. post :unpin, to: 'pins#destroy'
  244. end
  245. member do
  246. get :context
  247. end
  248. end
  249. namespace :timelines do
  250. resource :home, only: :show, controller: :home
  251. resource :public, only: :show, controller: :public
  252. resources :tag, only: :show
  253. resources :list, only: :show
  254. end
  255. resources :streaming, only: [:index]
  256. resources :custom_emojis, only: [:index]
  257. resources :suggestions, only: [:index, :destroy]
  258. resources :scheduled_statuses, only: [:index, :show, :update, :destroy]
  259. resources :preferences, only: [:index]
  260. resources :announcements, only: [:index] do
  261. scope module: :announcements do
  262. resources :reactions, only: [:update, :destroy]
  263. end
  264. member do
  265. post :dismiss
  266. end
  267. end
  268. # namespace :crypto do
  269. # resources :deliveries, only: :create
  270. # namespace :keys do
  271. # resource :upload, only: [:create]
  272. # resource :query, only: [:create]
  273. # resource :claim, only: [:create]
  274. # resource :count, only: [:show]
  275. # end
  276. # resources :encrypted_messages, only: [:index] do
  277. # collection do
  278. # post :clear
  279. # end
  280. # end
  281. # end
  282. resources :conversations, only: [:index, :destroy] do
  283. member do
  284. post :read
  285. end
  286. end
  287. resources :media, only: [:create, :update, :show]
  288. resources :blocks, only: [:index]
  289. resources :mutes, only: [:index]
  290. resources :favourites, only: [:index]
  291. resources :bookmarks, only: [:index]
  292. resources :reports, only: [:create]
  293. resources :trends, only: [:index]
  294. resources :filters, only: [:index, :create, :show, :update, :destroy]
  295. resources :endorsements, only: [:index]
  296. resources :markers, only: [:index, :create]
  297. namespace :apps do
  298. get :verify_credentials, to: 'credentials#show'
  299. end
  300. resources :apps, only: [:create]
  301. resource :instance, only: [:show] do
  302. resources :peers, only: [:index], controller: 'instances/peers'
  303. resource :activity, only: [:show], controller: 'instances/activity'
  304. end
  305. resource :domain_blocks, only: [:show, :create, :destroy]
  306. resource :directory, only: [:show]
  307. resources :follow_requests, only: [:index] do
  308. member do
  309. post :authorize
  310. post :reject
  311. end
  312. end
  313. resources :notifications, only: [:index, :show] do
  314. collection do
  315. post :clear
  316. end
  317. member do
  318. post :dismiss
  319. end
  320. end
  321. namespace :accounts do
  322. get :verify_credentials, to: 'credentials#show'
  323. patch :update_credentials, to: 'credentials#update'
  324. resource :search, only: :show, controller: :search
  325. resources :relationships, only: :index
  326. end
  327. resources :accounts, only: [:create, :show] do
  328. resources :statuses, only: :index, controller: 'accounts/statuses'
  329. resources :followers, only: :index, controller: 'accounts/follower_accounts'
  330. resources :following, only: :index, controller: 'accounts/following_accounts'
  331. resources :lists, only: :index, controller: 'accounts/lists'
  332. resources :identity_proofs, only: :index, controller: 'accounts/identity_proofs'
  333. member do
  334. post :follow
  335. post :unfollow
  336. post :block
  337. post :unblock
  338. post :mute
  339. post :unmute
  340. end
  341. resource :pin, only: :create, controller: 'accounts/pins'
  342. post :unpin, to: 'accounts/pins#destroy'
  343. resource :note, only: :create, controller: 'accounts/notes'
  344. end
  345. resources :lists, only: [:index, :create, :show, :update, :destroy] do
  346. resource :accounts, only: [:show, :create, :destroy], controller: 'lists/accounts'
  347. end
  348. namespace :featured_tags do
  349. get :suggestions, to: 'suggestions#index'
  350. end
  351. resources :featured_tags, only: [:index, :create, :destroy]
  352. resources :polls, only: [:create, :show] do
  353. resources :votes, only: :create, controller: 'polls/votes'
  354. end
  355. namespace :push do
  356. resource :subscription, only: [:create, :show, :update, :destroy]
  357. end
  358. namespace :admin do
  359. resources :accounts, only: [:index, :show] do
  360. member do
  361. post :enable
  362. post :unsilence
  363. post :unsuspend
  364. post :approve
  365. post :reject
  366. end
  367. resource :action, only: [:create], controller: 'account_actions'
  368. end
  369. resources :reports, only: [:index, :show] do
  370. member do
  371. post :assign_to_self
  372. post :unassign
  373. post :reopen
  374. post :resolve
  375. end
  376. end
  377. end
  378. end
  379. namespace :v2 do
  380. resources :media, only: [:create]
  381. get '/search', to: 'search#index', as: :search
  382. end
  383. namespace :web do
  384. resource :settings, only: [:update]
  385. resource :embed, only: [:create]
  386. resources :push_subscriptions, only: [:create] do
  387. member do
  388. put :update
  389. end
  390. end
  391. end
  392. end
  393. get '/web/(*any)', to: 'home#index', as: :web
  394. get '/about', to: 'about#show'
  395. get '/about/more', to: 'about#more'
  396. get '/terms', to: 'about#terms'
  397. match '/', via: [:post, :put, :patch, :delete], to: 'application#raise_not_found', format: false
  398. match '*unmatched_route', via: :all, to: 'application#raise_not_found', format: false
  399. end