discourse/plugins/chat
Alan Guo Xiang Tan 439cc5b023
SECURITY: Impose a upper bound on limit params in various controllers
What is the problem here?

In multiple controllers, we are accepting a `limit` params but do not
impose any upper bound on the values being accepted. Without an upper
bound, we may be allowing arbituary users from generating DB queries
which may end up exhausing the resources on the server.

What is the fix here?

A new `fetch_limit_from_params` helper method is introduced in
`ApplicationController` that can be used by controller actions to safely
get the limit from the params as a default limit and maximum limit has
to be set. When an invalid limit params is encountered, the server will
respond with the 400 response code.
2023-07-28 12:56:35 +01:00
..
app SECURITY: Impose a upper bound on limit params in various controllers 2023-07-28 12:56:35 +01:00
assets SECURITY: Limit chat drafts length and preloaded count 2023-01-25 13:52:49 +02:00
config Update translations (#22665) 2023-07-25 17:57:53 +02:00
db SECURITY: Limit chat drafts length and preloaded count 2023-01-25 13:52:49 +02:00
lib FIX: Use hashtags in channel archive PMs if available (#19859) 2023-01-25 13:48:49 +02:00
public DEV: Move `discourse-chat` to the core repo. (#18776) 2022-11-02 10:41:30 -03:00
spec SECURITY: Limit chat drafts length and preloaded count 2023-01-25 13:52:49 +02:00
test/javascripts DEV: Modernize chat's component tests (#19577) 2022-12-22 14:35:18 +01:00
README.md DEV: Move `discourse-chat` to the core repo. (#18776) 2022-11-02 10:41:30 -03:00
plugin.rb SECURITY: Limit chat drafts length and preloaded count 2023-01-25 13:52:49 +02:00

README.md

⚠️ This plugin is still in active development and may change frequently

Documentation

The Discourse Chat plugin adds chat functionality to your Discourse so it can natively support both long-form and short-form communication needs of your online community.

For documentation, see Discourse Chat

Plugin API

registerChatComposerButton

Usage

api.registerChatComposerButton({ id: "foo", ... });

Options

Every option accepts a value or a function, when passing a function this will be the chat-composer component instance. Example of an option using a function:

api.registerChatComposerButton({
  id: "foo",
  displayed() {
    return this.site.mobileView && this.canAttachUploads;
  },
});
Required
  • id unique, used to identify your button, eg: "gifs"
  • action callback when the button is pressed, can be an action name or an anonymous function, eg: "onFooClicked" or () => { console.log("clicked") }

A button requires at least an icon or a label:

  • icon, eg: "times"
  • label, text displayed on the button, a translatable key, eg: "foo.bar"
  • translatedLabel, text displayed on the button, a string, eg: "Add gifs"
Optional
  • position, can be "inline" or "dropdown", defaults to "inline"
  • title, title attribute of the button, a translatable key, eg: "foo.bar"
  • translatedTitle, title attribute of the button, a string, eg: "Add gifs"
  • ariaLabel, aria-label attribute of the button, a translatable key, eg: "foo.bar"
  • translatedAriaLabel, aria-label attribute of the button, a string, eg: "Add gifs"
  • classNames, additional names to add to the buttons class attribute, eg: ["foo", "bar"]
  • displayed, hide/or show the button, expects a boolean
  • disabled, sets the disabled attribute on the button, expects a boolean
  • priority, an integer defining the order of the buttons, higher comes first, eg: 700
  • dependentKeys, list of property names which should trigger a refresh of the buttons when changed, eg: ["foo.bar", "bar.baz"]