summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xcgi/admin364
1 files changed, 364 insertions, 0 deletions
diff --git a/cgi/admin b/cgi/admin
new file mode 100755
index 000000000..5ed1d54be
--- /dev/null
+++ b/cgi/admin
@@ -0,0 +1,364 @@
+#!/usr/local/bin/python
+import sys, os, cgi, string, crypt, types
+f = open('/tmp/quick', 'a+')
+#sys.stderr = sys.stdout
+sys.stderr = f
+sys.path.append('/home/mailman/mailman/modules')
+import mm_utils, maillist, mm_cfg, htmlformat
+
+
+def InitDocument():
+ return htmlformat.Document()
+
+doc = InitDocument()
+
+path = os.environ['PATH_INFO']
+list_info = mm_utils.GetPathPieces(path)
+
+if len(list_info) < 1:
+ doc.AddItem(htmlformat.Header(2, "Invalid options to CGI script."))
+ print doc.Format()
+ sys.exit(0)
+
+list_name = list_info[0]
+
+try:
+ list = maillist.MailList(list_name)
+except:
+ doc.AddItem(htmlformat.Header(2, "%s : No such list" % list_name))
+ print doc.Format()
+ sys.exit(0)
+
+if not list._ready:
+ doc.AddItem(htmlformat.Header(2, "%s : No such list" % list_name))
+ print doc.Format()
+ sys.exit(0)
+
+
+def GetGuiItem(table_entry):
+ varname, type, params, dependancies, descr = table_entry
+ if type == mm_cfg.Radio or type == mm_cfg.Toggle:
+ gui_part = htmlformat.RadioButtonArray(varname, params,
+ getattr(list, varname))
+ elif (type == mm_cfg.String or type == mm_cfg.Email or type == mm_cfg.Host
+ or type == mm_cfg.Number):
+ gui_part = htmlformat.TextBox(varname, getattr(list, varname), params)
+ elif type == mm_cfg.Text:
+ if params:
+ r, c = params
+ else:
+ r, c = None, None
+ val = getattr(list, varname)
+ if not val:
+ val = ''
+ gui_part = htmlformat.TextArea(varname, val, r, c)
+ elif type == mm_cfg.EmailList:
+ if params:
+ r, c = params
+ else:
+ r, c = None, None
+ res = string.join(getattr(list, varname), '\n')
+ gui_part = htmlformat.TextArea(varname, res, r, c, wrap='off')
+ return gui_part
+
+def FormatConfiguration(doc):
+ doc.SetTitle('%s Administration' % list.real_name)
+ doc.AddItem(htmlformat.Header(2, 'Configuration for %s' % list.real_name))
+
+
+ doc.AddItem('<hr>')
+
+ link = htmlformat.Link(list.GetScriptURL('admindb'),
+ 'View or edit the administrative requests database.')
+ doc.AddItem(htmlformat.FontSize("+1", link))
+ doc.AddItem('<p>')
+
+ link = htmlformat.Link(list.GetScriptURL('listinfo'),
+ 'Go to the general list information page.')
+ doc.AddItem(htmlformat.FontSize("+1", link))
+ doc.AddItem('<p>')
+
+ link = htmlformat.Link(list.GetScriptURL('edithtml'),
+ 'Edit the HTML for the public list pages.')
+ doc.AddItem(htmlformat.FontSize("+1", link))
+ doc.AddItem('<p>')
+
+ doc.AddItem('<hr>')
+
+
+ form = htmlformat.Form(list.GetScriptURL('admin'))
+ doc.AddItem(form)
+
+ password_table = htmlformat.Table()
+ password_table.AddRow(['Enter the admin password to change options:',
+ htmlformat.PasswordBox('adminpw')])
+ password_table.AddRow(['When you are done...',
+ htmlformat.SubmitButton('submit', 'Submit Changes')])
+
+ form.AddItem(password_table)
+
+ big_table = htmlformat.Table(border=2)
+ big_table.AddRow([htmlformat.Center(htmlformat.Header(2, 'General Options'))])
+ big_table.AddCellInfo(0,0,colspan=2)
+ big_table.AddRow([htmlformat.Bold('Option'), htmlformat.Bold('Value')])
+
+ for item in general:
+ gui_item = GetGuiItem(item)
+ big_table.AddRow([item[4], gui_item])
+ # This wasn't handled too well.
+ if item[1] == mm_cfg.Toggle:
+ big_table.AddRow([htmlformat.Header(2, "If so:")])
+ big_table.AddCellInfo(big_table.GetCurrentRowIndex(), 0, colspan=2)
+
+
+ big_table.AddRow(['<br>'])
+ big_table.AddCellInfo(big_table.GetCurrentRowIndex(), 0, colspan=2)
+
+ big_table.AddRow([htmlformat.Center(htmlformat.Header(2, 'Digest Options'))])
+ big_table.AddCellInfo(big_table.GetCurrentRowIndex(), 0, colspan=2)
+
+ big_table.AddRow([htmlformat.Bold('Option'), htmlformat.Bold('Value')])
+
+ for item in digest:
+ gui_item = GetGuiItem(item)
+ big_table.AddRow([item[4], gui_item])
+ # Yuck.
+ if item[1] == mm_cfg.Toggle:
+ big_table.AddRow([htmlformat.Header(2, "If so:")])
+ big_table.AddCellInfo(big_table.GetCurrentRowIndex(), 0, colspan=2)
+
+
+ big_table.AddRow(['<br>'])
+ big_table.AddCellInfo(big_table.GetCurrentRowIndex(), 0, colspan=2)
+
+ big_table.AddRow([htmlformat.Center(htmlformat.Header(2,
+ 'Non-Digested Options'))])
+ big_table.AddCellInfo(big_table.GetCurrentRowIndex(), 0, colspan=2)
+
+ big_table.AddRow([htmlformat.Bold('Option'), htmlformat.Bold('Value')])
+
+ for item in nodigest:
+ gui_item = GetGuiItem(item)
+ big_table.AddRow([item[4], gui_item])
+ # *sigh*
+ if item[1] == mm_cfg.Toggle:
+ big_table.AddRow([htmlformat.Header(2, "If so:")])
+ big_table.AddCellInfo(big_table.GetCurrentRowIndex(), 0, colspan=2)
+
+ big_table.AddRow(['<br>'])
+ big_table.AddCellInfo(big_table.GetCurrentRowIndex(), 0, colspan=2)
+ big_table.AddRow([htmlformat.Center(htmlformat.Header(2, 'Bounce Administration Options'))])
+ big_table.AddCellInfo(big_table.GetCurrentRowIndex(), 0, colspan=2)
+ for item in bounce:
+ gui_item = GetGuiItem(item)
+ big_table.AddRow([item[4], gui_item])
+ # This code sux...
+ if item[1] == mm_cfg.Toggle:
+ big_table.AddRow([htmlformat.Header(2, "If so:")])
+ big_table.AddCellInfo(big_table.GetCurrentRowIndex(), 0, colspan=2)
+
+ big_table.AddRow(['<br>'])
+ big_table.AddCellInfo(big_table.GetCurrentRowIndex(), 0, colspan=2)
+
+ big_table.AddRow([htmlformat.Center(htmlformat.Header(2, 'Archival Options'))])
+ big_table.AddCellInfo(big_table.GetCurrentRowIndex(), 0, colspan=2)
+
+ big_table.AddRow([htmlformat.Bold('Option'), htmlformat.Bold('Value')])
+
+ for item in archives:
+ gui_item = GetGuiItem(item)
+ big_table.AddRow([item[4], gui_item])
+ # This code sux...
+ if item[1] == mm_cfg.Toggle:
+ big_table.AddRow([htmlformat.Header(2, "If so:")])
+ big_table.AddCellInfo(big_table.GetCurrentRowIndex(), 0, colspan=2)
+
+
+ form.AddItem(big_table)
+ form.AddItem('<p>')
+
+ change_pw_table = htmlformat.Table(border=2)
+ change_pw_table.AddRow([htmlformat.Header(2,
+ htmlformat.Center(
+ 'Change Your Password:'))])
+ change_pw_table.AddCellInfo(change_pw_table.GetCurrentRowIndex(), 0,
+ colspan=2)
+
+ change_pw_table.AddRow(['Enter your new password:',
+ htmlformat.PasswordBox('newpw')])
+ change_pw_table.AddRow(['And also confirm it:',
+ htmlformat.PasswordBox('confirmpw')])
+
+ form.AddItem(htmlformat.Center(change_pw_table))
+ # Improve the html here...
+ form.AddItem('<hr>')
+ form.AddItem('<h3>Mass Subscribe People</h3>')
+ form.AddItem('<h4>enter one email address per line</h4>')
+ form.AddItem(htmlformat.TextArea(name='subscribees',rows=20,cols=60,wrap=None))
+ form.AddItem(list.GetMailmanFooter())
+
+
+turn_on_moderation = 0
+
+def GetValidValue(list, prop, my_type, val, dependant):
+ if my_type == mm_cfg.Radio or my_type == mm_cfg.Toggle:
+ if type(val) <> types.IntType:
+ try:
+ val = eval(val)
+ except:
+ pass
+ # Don't know what to do here...
+ return val
+ elif my_type == mm_cfg.String or my_type == mm_cfg.Text:
+ return val
+ elif my_type == mm_cfg.Email:
+ try:
+ valid = mm_utils.ValidEmail(val)
+ if valid:
+ return val
+ except:
+ pass
+ # Revert to the old value.
+ return getattr(list, prop)
+ elif my_type == mm_cfg.EmailList:
+ def SafeValidAddr(addr):
+ import mm_utils
+ try:
+ valid = mm_utils.ValidEmail(addr)
+ if valid:
+ return 1
+ else:
+ return 0
+ except:
+ return 0
+
+ val = filter(SafeValidAddr, map(string.strip, string.split(val, '\n')))
+ if dependant and len(val):
+ # Wait till we've set everything to turn it on,
+ # as we don't want to clobber our special case.
+ turn_on_moderation = 1
+ return val
+ elif my_type == mm_cfg.Host:
+ return val
+##
+## This code is sendmail dependant, so we'll just live w/o the error
+## Checking for now.
+##
+## # Shouldn't have to read in the whole file.
+## file = open('/etc/sendmail.cf', 'r')
+## lines = string.split(file.read(), '\n')
+## file.close()
+## def ConfirmCWEntry(item):
+## return item[0:2] == 'Cw'
+## lines = filter(ConfirmCWEntry, lines)
+## if not len(lines):
+## # Revert to the old value.
+## return getattr(list, prop)
+## for line in lines:
+## if string.lower(string.strip(line[2:])) == string.lower(val):
+## return val
+## return getattr(list, prop)
+ elif my_type == mm_cfg.Number:
+ try:
+ num = eval(val)
+ if num < 0:
+ return getattr(list, prop)
+ return num
+ except:
+ return getattr(list, prop)
+ else:
+ # Should never get here...
+ return val
+
+
+def ChangeOptions(list, opt_list, cgi_info, document):
+ for item in opt_list:
+ property, type, args, dependancies, desc = item
+ if not cgi_info.has_key(property):
+ if (type <> mm_cfg.Text and
+ type <> mm_cfg.String and
+ type <> mm_cfg.EmailList):
+ continue
+ else:
+ val = ''
+ else:
+ val = cgi_info[property].value
+ value = GetValidValue(list, property, type, val, dependancies)
+ setattr(list, property, value)
+ if cgi_info.has_key('subscribees'):
+ name_text = cgi_info['subscribees'].value
+ names = string.split(name_text, '\r\n')
+ for new_name in names:
+ try:
+#FIXME: The admin needs to be able to specify the options to subscribe w/
+ list.AddMember(new_name, mm_utils.GetRandomSeed())
+#FIXME: Give some sort of an indication of which names didn't work, and why
+# they didn't work...
+ except:
+ pass
+ if cgi_info.has_key('newpw'):
+ if cgi_info.has_key('confirmpw'):
+ new = cgi_info['newpw'].value
+ confirm = cgi_info['confirmpw'].value
+ if new == confirm:
+ list.password = crypt.crypt(new, mm_utils.GetRandomSeed())
+ else:
+ document.AddItem(htmlformat.Header(3, htmlformat.Italic(
+ 'Error: Passwords did not match.')))
+ else:
+ document.AddItem(htmlformat.Header(3, htmlformat.Italic(
+ 'Error: You must type in your new password twice.')))
+
+ list.Save()
+
+
+try:
+ info = list.GetConfigInfo()
+ general = info['general']
+ nodigest = info['nondigest']
+ digest = info['digest']
+ archives = info['archive']
+ if len(list._internal_name) < 3 or list._internal_name[-3:] <> '.jp':
+ bounce = info['bounce']
+ else:
+ bounce = []
+
+ cgi_data = cgi.FieldStorage()
+ if len(cgi_data.keys()):
+ if not cgi_data.has_key('adminpw'):
+ doc.AddItem('<hr>')
+ doc.AddItem(
+ htmlformat.Header(3, htmlformat.Italic('Error: '
+ 'You must supply the admin password to change options.')))
+ else:
+ try:
+ list.ConfirmAdminPassword(cgi_data['adminpw'].value)
+ ChangeOptions(list, general + nodigest + digest + archives + bounce,
+ cgi_data, doc)
+ # Yuck. This shouldn't need to be here.
+ if not list.digestable and not list.nondigestable:
+ list.nondigestable = 1
+ except:
+ doc.AddItem('<hr>')
+ doc.AddItem(
+ htmlformat.Header(3, htmlformat.Italic(
+ 'Error: Incorrect admin password.')))
+
+ if not list.digestable and len(list.digest_members):
+ doc.AddItem('<hr>')
+ doc.AddItem(htmlformat.Header(3, 'Warning: you have digest members, '
+ 'but digests are turned off. Those people will not receive mail.'))
+ if not list.nondigestable and len(list.members):
+ doc.AddItem('<hr>')
+ doc.AddItem(htmlformat.Header(3, 'Warning: you have list members, but '
+ 'non-digestified mail is turned off. They will receive mail until '
+ 'you fix this problem.'))
+
+ FormatConfiguration(doc)
+
+finally:
+ try:
+ print doc.Format()
+ except:
+ pass
+ list.Unlock()