| #!/usr/bin/env ruby |
| $LOAD_PATH.unshift '/srv/whimsy/lib' |
| |
| =begin |
| APP to generate the correct ezmlm syntax for moderators |
| =end |
| |
| require 'wunderbar' |
| require 'wunderbar/bootstrap' |
| require 'whimsy/asf' |
| |
| $SAFE = 1 |
| |
| _html do |
| # ensure the generated text is selected ready for copy-pasting |
| _script %{ |
| window.onload=function() { |
| var sel = window.getSelection(); |
| sel.removeAllRanges(); |
| var range = document.createRange(); |
| var dest = document.getElementById('dest'); |
| range.selectNodeContents(dest); |
| sel.addRange(range); |
| // TODO auto copy to clipboard (tricky) |
| } |
| } |
| |
| _body? do |
| _whimsy_body( |
| title: 'Mail List Moderation Helper', |
| subtitle: 'How-To Use Moderator Commands', |
| related: { |
| 'https://www.apache.org/foundation/mailinglists.html' => 'Apache Mailing List Info Page', |
| 'https://lists.apache.org' => 'Apache Mailing List Archives', |
| '/committers/subscribe.cgi' => 'Mailing List Subscription Helper', |
| 'http://www.apache.org/foundation/mailinglists.html#subscribing' => 'Information on Subscribing/Unsubscribing', |
| 'http://apache.org/dev/committers.html#mail-moderate' => 'Guide for moderators', |
| 'http://apache.org/dev/committers.html#problem_posts' => 'Guide for moderators - dealing with problem posts', |
| 'http://untroubled.org/ezmlm/manual/Sending-commands.html#Sending-commands' => 'EZMLM Command Help', |
| 'https://issues.apache.org/jira/browse/INFRA-10476' => 'INFRA-10476 - Provide a way to force specific subscribers to be moderated' |
| }, |
| helpblock: -> { |
| _p 'This form generates ezmlm mailing list addresses for various moderator requests.' |
| _p do |
| _ 'Enter the ASF mailing list name, select the operation to perform, and enter a subscriber email (if needed).' |
| _br |
| _ 'Press Generate. The To: address below can be copy/pasted into an email to send. In most cases you must be a moderator for that list.' |
| _br |
| _span.text_danger 'Note that you must send the email from the address which is registered as a moderator.' |
| end |
| _p do |
| _ul do |
| _li 'subscribers can post and will receive mail' |
| _li 'allow-subscribers can post; they do not get copies of mails (this is used for e.g. press@. Also useful for bots.)' |
| _li 'deny-subscribers cannot post; their posts will be rejected without needing moderation' |
| _li 'sendsubscribertomod-subscribers will have all posts moderated (for posters who are borderline problems) - ask INFRA to enable the setting for the list' |
| end |
| end |
| _p do |
| _span.text_danger 'BETA SOFTWARE: double-check the command first. ' |
| _a "Feedback welcome!", href: "mailto:dev@whimsical.apache.org?Subject=Feedback on moderation helper app" |
| end |
| _p do |
| _span '** If you are not a moderator, you can contact them by emailing <list>-owner@<tlp>.apache.org **' |
| end |
| } |
| ) do |
| _form method: 'post' do |
| _fieldset do |
| _table do |
| _tr do |
| _th 'Mailing list' |
| _th 'Subscriber' |
| end |
| _tr do |
| _td do |
| _input.name name: 'maillist', size: 40, pattern: '[^@]+@([-\w]+)?', required: true, value: @maillist, |
| placeholder: 'user@project or announce@' |
| _ '.apache.org ' |
| end |
| _td do |
| _input.name name: 'email', size: 40, pattern: '[^@]+@[^@]+', value: @email, placeholder: 'user@domain.example' |
| end |
| end |
| _tr do |
| _td { |
| _br |
| _p 'The following commands operate on the list only:' |
| } |
| _td { |
| _br |
| _p 'The following commands also require a subscriber email address:' |
| } |
| end |
| _tr do |
| _td do |
| _label do |
| _input type: "radio", name: "cmd", value: "list", required: true, checked: (@cmd == "list") |
| _ 'list (current subscribers)' |
| end |
| end |
| _td do |
| _label do |
| _input type: "radio", name: "cmd", value: "subscribe", required: true, checked: (@cmd == "subscribe") |
| _ 'subscribe (normal subscription: can post and gets messages)' |
| end |
| end |
| end |
| _tr do |
| _td do |
| _label do |
| _input type: "radio", name: "cmd", value: "log", required: true, checked: (@cmd == "log") |
| _ 'log (history of subscription changes)' |
| end |
| end |
| _td do |
| _label do |
| _input type: "radio", name: "cmd", value: "unsubscribe", required: true, checked: (@cmd == "unsubscribe" || @cmd == nil) |
| _ 'unsubscribe (from list)' |
| end |
| end |
| end |
| _tr do |
| _td do |
| _label do |
| _input type: "radio", name: "cmd", value: "allow-list", required: true, checked: (@cmd == "allow-list") |
| _ 'allow-list (currently allowed to post)' |
| end |
| end |
| _td do |
| _label do |
| _input type: "radio", name: "cmd", value: "allow-subscribe", required: true, checked: (@cmd == "allow-subscribe") |
| _ 'allow-subscribe (allow posting without getting messages - e.g. for bots)' |
| end |
| end |
| end |
| _tr do |
| _td do |
| _label do |
| _input type: "radio", name: "cmd", value: "allow-log", required: true, checked: (@cmd == "allow-log") |
| _ 'allow-log (history of subscriptions to allow list)' |
| end |
| end |
| _td do |
| _label do |
| _input type: "radio", name: "cmd", value: "allow-unsubscribe", required: true, checked: (@cmd == "allow-unsubscribe") |
| _ 'allow-unsubscribe (drop allow posting)' |
| end |
| end |
| end |
| _tr do |
| _td do |
| _label do |
| _input type: "radio", name: "cmd", value: "deny-list", required: true, checked: (@cmd == "deny-list") |
| _ 'deny-list (list those currently denied to post)' |
| end |
| end |
| _td do |
| _label do |
| _input type: "radio", name: "cmd", value: "deny-subscribe", required: true, checked: (@cmd == "deny-subscribe") |
| _ 'deny-subscribe (prevent subscriber from posting)' |
| end |
| end |
| end |
| _tr do |
| _td do |
| _label do |
| _input type: "radio", name: "cmd", value: "deny-log", required: true, checked: (@cmd == "deny-log") |
| _ 'deny-log (history of deny subscriptions)' |
| end |
| end |
| _td do |
| _label do |
| _input type: "radio", name: "cmd", value: "deny-unsubscribe", required: true, checked: (@cmd == "deny-unsubscribe") |
| _ 'deny-unsubscribe (remove from list of denied posters)' |
| end |
| end |
| end |
| _tr do |
| _td ' ' |
| _td do |
| _label do |
| _input type: "radio", name: "cmd", value: "sendsubscribertomod-subscribe", required: true, checked: (@cmd == "sendsubscribertomod-subscribe") |
| _ 'sendsubscribertomod-subscribe (add to list of moderated subscribers - ask INFRA to enable this for the list)' |
| end |
| end |
| end |
| _tr do |
| _td ' ' |
| _td do |
| _label do |
| _input type: "radio", name: "cmd", value: "sendsubscribertomod-unsubscribe", required: true, checked: (@cmd == "sendsubscribertomod-unsubscribe") |
| _ 'sendsubscribertomod-unsubscribe (remove from list of moderated subscribers)' |
| end |
| end |
| end |
| end |
| _p { |
| _br |
| _input type: 'submit', value: 'Generate' |
| } |
| end |
| end |
| |
| if _.post? |
| _div.well do |
| ml0,ml1 = @maillist.split('@') |
| if ml1 |
| # enable escape for apachecon.com |
| ml1 += '.apache.org' unless ml1 =~ /\.(org|com)$/ |
| else |
| ml1 = 'apache.org' |
| end |
| em = @email.split('@') |
| _br |
| if @cmd.end_with? 'subscribe' # also catches unsubscribe |
| unless @email.length > 0 |
| _h3.error 'Need subscriber email address' |
| break |
| end |
| dest = "#{ml0}-#{@cmd}-#{em[0]}=#{em[1]}@#{ml1}" |
| else |
| dest = "#{ml0}-#{@cmd}@#{ml1}" |
| end |
| _span 'Copy this email address: ' |
| _span.dest! dest |
| _br |
| _br |
| _a 'or Click to Send Mail', href: "mailto:#{dest}?Subject=#{dest}" |
| end |
| end |
| end |
| end |
| end |