Show the local couterpart of emoji when it exists in /admin/custom_emojis (#5467)
* Show the local couterpart of emoji when it exists in admin/custom_emojis * Fix indentation * Fix error * Add class table-action-link to Overwrite link * Make it enable to overwrite emojis * Make Code Climate happy
This commit is contained in:
		@@ -5,7 +5,7 @@ module Admin
 | 
				
			|||||||
    before_action :set_custom_emoji, except: [:index, :new, :create]
 | 
					    before_action :set_custom_emoji, except: [:index, :new, :create]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def index
 | 
					    def index
 | 
				
			||||||
      @custom_emojis = filtered_custom_emojis.page(params[:page])
 | 
					      @custom_emojis = filtered_custom_emojis.eager_load(:local_counterpart).page(params[:page])
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def new
 | 
					    def new
 | 
				
			||||||
@@ -36,9 +36,9 @@ module Admin
 | 
				
			|||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def copy
 | 
					    def copy
 | 
				
			||||||
      emoji = CustomEmoji.new(domain: nil, shortcode: @custom_emoji.shortcode, image: @custom_emoji.image)
 | 
					      emoji = CustomEmoji.find_or_create_by(domain: nil, shortcode: @custom_emoji.shortcode)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      if emoji.save
 | 
					      if emoji.update(image: @custom_emoji.image)
 | 
				
			||||||
        flash[:notice] = I18n.t('admin.custom_emojis.copied_msg')
 | 
					        flash[:notice] = I18n.t('admin.custom_emojis.copied_msg')
 | 
				
			||||||
      else
 | 
					      else
 | 
				
			||||||
        flash[:alert] = I18n.t('admin.custom_emojis.copy_failed_msg')
 | 
					        flash[:alert] = I18n.t('admin.custom_emojis.copy_failed_msg')
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -43,6 +43,10 @@ module ApplicationHelper
 | 
				
			|||||||
    content_tag(:i, nil, attributes.merge(class: class_names.join(' ')))
 | 
					    content_tag(:i, nil, attributes.merge(class: class_names.join(' ')))
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def custom_emoji_tag(custom_emoji)
 | 
				
			||||||
 | 
					    image_tag(custom_emoji.image.url, class: 'emojione', alt: ":#{custom_emoji.shortcode}:")
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def opengraph(property, content)
 | 
					  def opengraph(property, content)
 | 
				
			||||||
    tag(:meta, content: content, property: property)
 | 
					    tag(:meta, content: content, property: property)
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -25,6 +25,8 @@ class CustomEmoji < ApplicationRecord
 | 
				
			|||||||
    :(#{SHORTCODE_RE_FRAGMENT}):
 | 
					    :(#{SHORTCODE_RE_FRAGMENT}):
 | 
				
			||||||
    (?=[^[:alnum:]:]|$)/x
 | 
					    (?=[^[:alnum:]:]|$)/x
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  has_one :local_counterpart, -> { where(domain: nil) }, class_name: 'CustomEmoji', primary_key: :shortcode, foreign_key: :shortcode
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  has_attached_file :image, styles: { static: { format: 'png', convert_options: '-coalesce -strip' } }
 | 
					  has_attached_file :image, styles: { static: { format: 'png', convert_options: '-coalesce -strip' } }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  validates_attachment :image, content_type: { content_type: 'image/png' }, presence: true, size: { in: 0..50.kilobytes }
 | 
					  validates_attachment :image, content_type: { content_type: 'image/png' }, presence: true, size: { in: 0..50.kilobytes }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
%tr
 | 
					%tr
 | 
				
			||||||
  %td
 | 
					  %td
 | 
				
			||||||
    = image_tag custom_emoji.image.url, class: 'emojione', alt: ":#{custom_emoji.shortcode}:"
 | 
					    = custom_emoji_tag(custom_emoji)
 | 
				
			||||||
  %td
 | 
					  %td
 | 
				
			||||||
    %samp= ":#{custom_emoji.shortcode}:"
 | 
					    %samp= ":#{custom_emoji.shortcode}:"
 | 
				
			||||||
  %td
 | 
					  %td
 | 
				
			||||||
@@ -15,7 +15,10 @@
 | 
				
			|||||||
      - else
 | 
					      - else
 | 
				
			||||||
        = table_link_to 'eye-slash', t('admin.custom_emojis.unlisted'), admin_custom_emoji_path(custom_emoji, custom_emoji: { visible_in_picker: true }), method: :patch
 | 
					        = table_link_to 'eye-slash', t('admin.custom_emojis.unlisted'), admin_custom_emoji_path(custom_emoji, custom_emoji: { visible_in_picker: true }), method: :patch
 | 
				
			||||||
    - else
 | 
					    - else
 | 
				
			||||||
      = table_link_to 'copy', t('admin.custom_emojis.copy'), copy_admin_custom_emoji_path(custom_emoji, page: params[:page]), method: :post
 | 
					      - if custom_emoji.local_counterpart.present?
 | 
				
			||||||
 | 
					        = link_to safe_join([custom_emoji_tag(custom_emoji.local_counterpart), t('admin.custom_emojis.overwrite')]), copy_admin_custom_emoji_path(custom_emoji, page: params[:page]), method: :post, class: 'table-action-link'
 | 
				
			||||||
 | 
					      - else
 | 
				
			||||||
 | 
					        = table_link_to 'copy', t('admin.custom_emojis.copy'), copy_admin_custom_emoji_path(custom_emoji, page: params[:page]), method: :post
 | 
				
			||||||
  %td
 | 
					  %td
 | 
				
			||||||
    - if custom_emoji.disabled?
 | 
					    - if custom_emoji.disabled?
 | 
				
			||||||
      = table_link_to 'power-off', t('admin.custom_emojis.enable'), enable_admin_custom_emoji_path(custom_emoji), method: :post, data: { confirm: t('admin.accounts.are_you_sure') }
 | 
					      = table_link_to 'power-off', t('admin.custom_emojis.enable'), enable_admin_custom_emoji_path(custom_emoji), method: :post, data: { confirm: t('admin.accounts.are_you_sure') }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,7 +10,7 @@
 | 
				
			|||||||
      "line": 122,
 | 
					      "line": 122,
 | 
				
			||||||
      "link": "http://brakemanscanner.org/docs/warning_types/link_to_href",
 | 
					      "link": "http://brakemanscanner.org/docs/warning_types/link_to_href",
 | 
				
			||||||
      "code": "link_to(Account.find(params[:id]).inbox_url, Account.find(params[:id]).inbox_url)",
 | 
					      "code": "link_to(Account.find(params[:id]).inbox_url, Account.find(params[:id]).inbox_url)",
 | 
				
			||||||
      "render_path": [{"type":"controller","class":"Admin::AccountsController","method":"show","line":13,"file":"app/controllers/admin/accounts_controller.rb"}],
 | 
					      "render_path": [{"type":"controller","class":"Admin::AccountsController","method":"show","line":15,"file":"app/controllers/admin/accounts_controller.rb"}],
 | 
				
			||||||
      "location": {
 | 
					      "location": {
 | 
				
			||||||
        "type": "template",
 | 
					        "type": "template",
 | 
				
			||||||
        "template": "admin/accounts/show"
 | 
					        "template": "admin/accounts/show"
 | 
				
			||||||
@@ -29,7 +29,7 @@
 | 
				
			|||||||
      "line": 128,
 | 
					      "line": 128,
 | 
				
			||||||
      "link": "http://brakemanscanner.org/docs/warning_types/link_to_href",
 | 
					      "link": "http://brakemanscanner.org/docs/warning_types/link_to_href",
 | 
				
			||||||
      "code": "link_to(Account.find(params[:id]).shared_inbox_url, Account.find(params[:id]).shared_inbox_url)",
 | 
					      "code": "link_to(Account.find(params[:id]).shared_inbox_url, Account.find(params[:id]).shared_inbox_url)",
 | 
				
			||||||
      "render_path": [{"type":"controller","class":"Admin::AccountsController","method":"show","line":13,"file":"app/controllers/admin/accounts_controller.rb"}],
 | 
					      "render_path": [{"type":"controller","class":"Admin::AccountsController","method":"show","line":15,"file":"app/controllers/admin/accounts_controller.rb"}],
 | 
				
			||||||
      "location": {
 | 
					      "location": {
 | 
				
			||||||
        "type": "template",
 | 
					        "type": "template",
 | 
				
			||||||
        "template": "admin/accounts/show"
 | 
					        "template": "admin/accounts/show"
 | 
				
			||||||
@@ -48,7 +48,7 @@
 | 
				
			|||||||
      "line": 35,
 | 
					      "line": 35,
 | 
				
			||||||
      "link": "http://brakemanscanner.org/docs/warning_types/link_to_href",
 | 
					      "link": "http://brakemanscanner.org/docs/warning_types/link_to_href",
 | 
				
			||||||
      "code": "link_to(Account.find(params[:id]).url, Account.find(params[:id]).url)",
 | 
					      "code": "link_to(Account.find(params[:id]).url, Account.find(params[:id]).url)",
 | 
				
			||||||
      "render_path": [{"type":"controller","class":"Admin::AccountsController","method":"show","line":13,"file":"app/controllers/admin/accounts_controller.rb"}],
 | 
					      "render_path": [{"type":"controller","class":"Admin::AccountsController","method":"show","line":15,"file":"app/controllers/admin/accounts_controller.rb"}],
 | 
				
			||||||
      "location": {
 | 
					      "location": {
 | 
				
			||||||
        "type": "template",
 | 
					        "type": "template",
 | 
				
			||||||
        "template": "admin/accounts/show"
 | 
					        "template": "admin/accounts/show"
 | 
				
			||||||
@@ -57,25 +57,6 @@
 | 
				
			|||||||
      "confidence": "Weak",
 | 
					      "confidence": "Weak",
 | 
				
			||||||
      "note": ""
 | 
					      "note": ""
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      "warning_type": "Dynamic Render Path",
 | 
					 | 
				
			||||||
      "warning_code": 15,
 | 
					 | 
				
			||||||
      "fingerprint": "3b0a20b08aef13cf8cf865384fae0cfd3324d8200a83262bf4abbc8091b5fec5",
 | 
					 | 
				
			||||||
      "check_name": "Render",
 | 
					 | 
				
			||||||
      "message": "Render path contains parameter value",
 | 
					 | 
				
			||||||
      "file": "app/views/admin/custom_emojis/index.html.haml",
 | 
					 | 
				
			||||||
      "line": 31,
 | 
					 | 
				
			||||||
      "link": "http://brakemanscanner.org/docs/warning_types/dynamic_render_path/",
 | 
					 | 
				
			||||||
      "code": "render(action => filtered_custom_emojis.page(params[:page]), {})",
 | 
					 | 
				
			||||||
      "render_path": [{"type":"controller","class":"Admin::CustomEmojisController","method":"index","line":9,"file":"app/controllers/admin/custom_emojis_controller.rb"}],
 | 
					 | 
				
			||||||
      "location": {
 | 
					 | 
				
			||||||
        "type": "template",
 | 
					 | 
				
			||||||
        "template": "admin/custom_emojis/index"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "user_input": "params[:page]",
 | 
					 | 
				
			||||||
      "confidence": "Weak",
 | 
					 | 
				
			||||||
      "note": ""
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      "warning_type": "Dynamic Render Path",
 | 
					      "warning_type": "Dynamic Render Path",
 | 
				
			||||||
      "warning_code": 15,
 | 
					      "warning_code": 15,
 | 
				
			||||||
@@ -105,7 +86,7 @@
 | 
				
			|||||||
      "line": 131,
 | 
					      "line": 131,
 | 
				
			||||||
      "link": "http://brakemanscanner.org/docs/warning_types/link_to_href",
 | 
					      "link": "http://brakemanscanner.org/docs/warning_types/link_to_href",
 | 
				
			||||||
      "code": "link_to(Account.find(params[:id]).followers_url, Account.find(params[:id]).followers_url)",
 | 
					      "code": "link_to(Account.find(params[:id]).followers_url, Account.find(params[:id]).followers_url)",
 | 
				
			||||||
      "render_path": [{"type":"controller","class":"Admin::AccountsController","method":"show","line":13,"file":"app/controllers/admin/accounts_controller.rb"}],
 | 
					      "render_path": [{"type":"controller","class":"Admin::AccountsController","method":"show","line":15,"file":"app/controllers/admin/accounts_controller.rb"}],
 | 
				
			||||||
      "location": {
 | 
					      "location": {
 | 
				
			||||||
        "type": "template",
 | 
					        "type": "template",
 | 
				
			||||||
        "template": "admin/accounts/show"
 | 
					        "template": "admin/accounts/show"
 | 
				
			||||||
@@ -124,7 +105,7 @@
 | 
				
			|||||||
      "line": 106,
 | 
					      "line": 106,
 | 
				
			||||||
      "link": "http://brakemanscanner.org/docs/warning_types/link_to_href",
 | 
					      "link": "http://brakemanscanner.org/docs/warning_types/link_to_href",
 | 
				
			||||||
      "code": "link_to(Account.find(params[:id]).salmon_url, Account.find(params[:id]).salmon_url)",
 | 
					      "code": "link_to(Account.find(params[:id]).salmon_url, Account.find(params[:id]).salmon_url)",
 | 
				
			||||||
      "render_path": [{"type":"controller","class":"Admin::AccountsController","method":"show","line":13,"file":"app/controllers/admin/accounts_controller.rb"}],
 | 
					      "render_path": [{"type":"controller","class":"Admin::AccountsController","method":"show","line":15,"file":"app/controllers/admin/accounts_controller.rb"}],
 | 
				
			||||||
      "location": {
 | 
					      "location": {
 | 
				
			||||||
        "type": "template",
 | 
					        "type": "template",
 | 
				
			||||||
        "template": "admin/accounts/show"
 | 
					        "template": "admin/accounts/show"
 | 
				
			||||||
@@ -133,6 +114,25 @@
 | 
				
			|||||||
      "confidence": "Weak",
 | 
					      "confidence": "Weak",
 | 
				
			||||||
      "note": ""
 | 
					      "note": ""
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "warning_type": "Dynamic Render Path",
 | 
				
			||||||
 | 
					      "warning_code": 15,
 | 
				
			||||||
 | 
					      "fingerprint": "8d843713d99e8403f7992f3e72251b633817cf9076ffcbbad5613859d2bbc127",
 | 
				
			||||||
 | 
					      "check_name": "Render",
 | 
				
			||||||
 | 
					      "message": "Render path contains parameter value",
 | 
				
			||||||
 | 
					      "file": "app/views/admin/custom_emojis/index.html.haml",
 | 
				
			||||||
 | 
					      "line": 31,
 | 
				
			||||||
 | 
					      "link": "http://brakemanscanner.org/docs/warning_types/dynamic_render_path/",
 | 
				
			||||||
 | 
					      "code": "render(action => filtered_custom_emojis.eager_load(:local_counterpart).page(params[:page]), {})",
 | 
				
			||||||
 | 
					      "render_path": [{"type":"controller","class":"Admin::CustomEmojisController","method":"index","line":9,"file":"app/controllers/admin/custom_emojis_controller.rb"}],
 | 
				
			||||||
 | 
					      "location": {
 | 
				
			||||||
 | 
					        "type": "template",
 | 
				
			||||||
 | 
					        "template": "admin/custom_emojis/index"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "user_input": "params[:page]",
 | 
				
			||||||
 | 
					      "confidence": "Weak",
 | 
				
			||||||
 | 
					      "note": ""
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      "warning_type": "SQL Injection",
 | 
					      "warning_type": "SQL Injection",
 | 
				
			||||||
      "warning_code": 0,
 | 
					      "warning_code": 0,
 | 
				
			||||||
@@ -140,7 +140,7 @@
 | 
				
			|||||||
      "check_name": "SQL",
 | 
					      "check_name": "SQL",
 | 
				
			||||||
      "message": "Possible SQL injection",
 | 
					      "message": "Possible SQL injection",
 | 
				
			||||||
      "file": "lib/mastodon/snowflake.rb",
 | 
					      "file": "lib/mastodon/snowflake.rb",
 | 
				
			||||||
      "line": 86,
 | 
					      "line": 87,
 | 
				
			||||||
      "link": "http://brakemanscanner.org/docs/warning_types/sql_injection/",
 | 
					      "link": "http://brakemanscanner.org/docs/warning_types/sql_injection/",
 | 
				
			||||||
      "code": "connection.execute(\"        CREATE OR REPLACE FUNCTION timestamp_id(table_name text)\\n        RETURNS bigint AS\\n        $$\\n          DECLARE\\n            time_part bigint;\\n            sequence_base bigint;\\n            tail bigint;\\n          BEGIN\\n            time_part := (\\n              -- Get the time in milliseconds\\n              ((date_part('epoch', now()) * 1000))::bigint\\n              -- And shift it over two bytes\\n              << 16);\\n\\n            sequence_base := (\\n              'x' ||\\n              -- Take the first two bytes (four hex characters)\\n              substr(\\n                -- Of the MD5 hash of the data we documented\\n                md5(table_name ||\\n                  '#{SecureRandom.hex(16)}' ||\\n                  time_part::text\\n                ),\\n                1, 4\\n              )\\n            -- And turn it into a bigint\\n            )::bit(16)::bigint;\\n\\n            -- Finally, add our sequence number to our base, and chop\\n            -- it to the last two bytes\\n            tail := (\\n              (sequence_base + nextval(table_name || '_id_seq'))\\n              & 65535);\\n\\n            -- Return the time part and the sequence part. OR appears\\n            -- faster here than addition, but they're equivalent:\\n            -- time_part has no trailing two bytes, and tail is only\\n            -- the last two bytes.\\n            RETURN time_part | tail;\\n          END\\n        $$ LANGUAGE plpgsql VOLATILE;\\n\")",
 | 
					      "code": "connection.execute(\"        CREATE OR REPLACE FUNCTION timestamp_id(table_name text)\\n        RETURNS bigint AS\\n        $$\\n          DECLARE\\n            time_part bigint;\\n            sequence_base bigint;\\n            tail bigint;\\n          BEGIN\\n            time_part := (\\n              -- Get the time in milliseconds\\n              ((date_part('epoch', now()) * 1000))::bigint\\n              -- And shift it over two bytes\\n              << 16);\\n\\n            sequence_base := (\\n              'x' ||\\n              -- Take the first two bytes (four hex characters)\\n              substr(\\n                -- Of the MD5 hash of the data we documented\\n                md5(table_name ||\\n                  '#{SecureRandom.hex(16)}' ||\\n                  time_part::text\\n                ),\\n                1, 4\\n              )\\n            -- And turn it into a bigint\\n            )::bit(16)::bigint;\\n\\n            -- Finally, add our sequence number to our base, and chop\\n            -- it to the last two bytes\\n            tail := (\\n              (sequence_base + nextval(table_name || '_id_seq'))\\n              & 65535);\\n\\n            -- Return the time part and the sequence part. OR appears\\n            -- faster here than addition, but they're equivalent:\\n            -- time_part has no trailing two bytes, and tail is only\\n            -- the last two bytes.\\n            RETURN time_part | tail;\\n          END\\n        $$ LANGUAGE plpgsql VOLATILE;\\n\")",
 | 
				
			||||||
      "render_path": null,
 | 
					      "render_path": null,
 | 
				
			||||||
@@ -182,7 +182,7 @@
 | 
				
			|||||||
      "line": 95,
 | 
					      "line": 95,
 | 
				
			||||||
      "link": "http://brakemanscanner.org/docs/warning_types/link_to_href",
 | 
					      "link": "http://brakemanscanner.org/docs/warning_types/link_to_href",
 | 
				
			||||||
      "code": "link_to(Account.find(params[:id]).remote_url, Account.find(params[:id]).remote_url)",
 | 
					      "code": "link_to(Account.find(params[:id]).remote_url, Account.find(params[:id]).remote_url)",
 | 
				
			||||||
      "render_path": [{"type":"controller","class":"Admin::AccountsController","method":"show","line":13,"file":"app/controllers/admin/accounts_controller.rb"}],
 | 
					      "render_path": [{"type":"controller","class":"Admin::AccountsController","method":"show","line":15,"file":"app/controllers/admin/accounts_controller.rb"}],
 | 
				
			||||||
      "location": {
 | 
					      "location": {
 | 
				
			||||||
        "type": "template",
 | 
					        "type": "template",
 | 
				
			||||||
        "template": "admin/accounts/show"
 | 
					        "template": "admin/accounts/show"
 | 
				
			||||||
@@ -240,7 +240,7 @@
 | 
				
			|||||||
      "line": 125,
 | 
					      "line": 125,
 | 
				
			||||||
      "link": "http://brakemanscanner.org/docs/warning_types/link_to_href",
 | 
					      "link": "http://brakemanscanner.org/docs/warning_types/link_to_href",
 | 
				
			||||||
      "code": "link_to(Account.find(params[:id]).outbox_url, Account.find(params[:id]).outbox_url)",
 | 
					      "code": "link_to(Account.find(params[:id]).outbox_url, Account.find(params[:id]).outbox_url)",
 | 
				
			||||||
      "render_path": [{"type":"controller","class":"Admin::AccountsController","method":"show","line":13,"file":"app/controllers/admin/accounts_controller.rb"}],
 | 
					      "render_path": [{"type":"controller","class":"Admin::AccountsController","method":"show","line":15,"file":"app/controllers/admin/accounts_controller.rb"}],
 | 
				
			||||||
      "location": {
 | 
					      "location": {
 | 
				
			||||||
        "type": "template",
 | 
					        "type": "template",
 | 
				
			||||||
        "template": "admin/accounts/show"
 | 
					        "template": "admin/accounts/show"
 | 
				
			||||||
@@ -269,6 +269,6 @@
 | 
				
			|||||||
      "note": ""
 | 
					      "note": ""
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  ],
 | 
					  ],
 | 
				
			||||||
  "updated": "2017-10-07 19:24:02 +0200",
 | 
					  "updated": "2017-10-20 00:00:54 +0900",
 | 
				
			||||||
  "brakeman_version": "4.0.1"
 | 
					  "brakeman_version": "4.0.1"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -134,6 +134,7 @@ en:
 | 
				
			|||||||
      listed: Listed
 | 
					      listed: Listed
 | 
				
			||||||
      new:
 | 
					      new:
 | 
				
			||||||
        title: Add new custom emoji
 | 
					        title: Add new custom emoji
 | 
				
			||||||
 | 
					      overwrite: Overwrite
 | 
				
			||||||
      shortcode: Shortcode
 | 
					      shortcode: Shortcode
 | 
				
			||||||
      shortcode_hint: At least 2 characters, only alphanumeric characters and underscores
 | 
					      shortcode_hint: At least 2 characters, only alphanumeric characters and underscores
 | 
				
			||||||
      title: Custom emojis
 | 
					      title: Custom emojis
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user