summaryrefslogtreecommitdiff
path: root/web/config
diff options
context:
space:
mode:
authorEduardo Chappa <echappa@gmx.com>2013-02-03 00:59:38 -0700
committerEduardo Chappa <echappa@gmx.com>2013-02-03 00:59:38 -0700
commit094ca96844842928810f14844413109fc6cdd890 (patch)
treee60efbb980f38ba9308ccb4fb2b77b87bbc115f3 /web/config
downloadalpine-094ca96844842928810f14844413109fc6cdd890.tar.xz
Initial Alpine Version
Diffstat (limited to 'web/config')
-rw-r--r--web/config/alpine.tcl1148
-rw-r--r--web/config/conf.deskmail55
-rw-r--r--web/config/pine.conf52
3 files changed, 1255 insertions, 0 deletions
diff --git a/web/config/alpine.tcl b/web/config/alpine.tcl
new file mode 100644
index 00000000..531dafaf
--- /dev/null
+++ b/web/config/alpine.tcl
@@ -0,0 +1,1148 @@
+# Web Alpine Config options
+# $Id: alpine.tcl 1266 2009-07-14 18:39:12Z hubert@u.washington.edu $
+# ========================================================================
+# Copyright 2006-2008 University of Washington
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# ========================================================================
+
+encoding system "utf-8"
+
+set _wp(appname) Alpine
+set _wp(admin) admin@sample-domain.edu
+set _wp(helpdesk) admin@sample-domain.edu
+set _wp(comments) help@sample-domain.edu
+
+# List of userid's allowed to request the monitor script output
+set _wp(monitors) {}
+
+# directory prefix web server uses for web alpine page requests
+# Note: set to {} if DocumentRoot set to the root of web alpine cgi scripts
+set _wp(urlprefix) webmail
+
+# file system path to CGI application files
+# directory containing web alpine application scripts and supporting tools
+set _wp(fileroot) /usr/local/libexec/alpine
+
+set _wp(tmpdir) /tmp
+
+# NOTE: Make SURE tclsh and alpine.tcl symlinks in this directory
+set _wp(cgipath) [file join $_wp(fileroot) cgi]
+
+# CGI scripts implementing U/I, session cookie scope
+set _wp(appdir) alpine
+
+# UI versions
+set _wp(ui1dir) 1.0
+set _wp(ui2dir) 2.0
+
+# place for CGI scripts not requiring session-key
+set _wp(pubdir) pub
+
+# place for binaries referenced by the CGI scripts
+set _wp(bin) [file join $_wp(fileroot) bin]
+set _wp(servlet) alpined
+set _wp(pc_servlet) pc_alpined
+set _wp(pldap) alpineldap
+
+# place for config files referenced by the CGI scripts
+set _wp(confdir) [file join $_wp(fileroot) config]
+set _wp(conffile) pine.conf
+set _wp(defconf) $_wp(conffile)
+
+# place for library files used by CGI scripts
+set _wp(lib) [file join $_wp(fileroot) lib]
+
+# directory used temporarily to stage attatched and detached files
+set _wp(detachpath) [file join $_wp(fileroot) detach]
+
+set _wp(imagepath) [file join / $_wp(urlprefix) images]
+
+set _wp(buttonpath) [file join $_wp(imagepath) buttons silver]
+
+set _wp(staticondir) env
+
+set _wp(servername) [info hostname]
+
+# MUST specify SSL/TLS connection
+set _wp(serverport) {}
+set _wp(serverpath) https://[file join [join [eval list $_wp(servername) $_wp(serverport)] :] $_wp(urlprefix)]
+
+# MAY specify a plaintext connection (comment out if plain support undesired)
+set _wp(plainport) {}
+set _wp(plainservpath) http://[file join [join [eval list $_wp(servername) $_wp(plainport)] :] $_wp(urlprefix)]
+
+# url of faq page(s) available from initial greeting page
+#set _wp(faq) "http://www.yourserver/faqs/alpine.html"
+
+# url of informational page accessible from initial greeting page
+set _wp(releaseblurb) "$_wp(plainservpath)/alpine/help/release.html"
+
+# url of previous version server to be accessible from initial greeting page
+#set _wp(oldserverpath) "https://previous.version.server.edu:444/"
+
+# session id length: make sure the integer count below matches what's built
+# into the pubcookie: "src/pubcookie/wp_uidmapper_lib.h:#define WP_KEY_LEN 6"
+set _wp(sessidlen) 6
+
+# Where and what format the alpined comm socket should take
+set _wp(sockdir) $_wp(tmpdir)
+set _wp(sockpat) wp%s
+
+# skin settings
+set _wp(bordercolor) #FEFAC9
+set _wp(menucolor) #3E2E6D
+set _wp(dialogcolor) #FEFAC9
+set _wp(titlecolor) #000000
+set _wp(logodir) alpine
+
+# various timerouts, dimensions and feature settings
+set _wp(refresh) 600
+set _wp(timeout) 900
+set _wp(autodraft) 300
+set _wp(logoutpause) 60
+set _wp(indexlines) 20
+set _wp(indexlinesmax) 50
+set _wp(indexheight) 24
+set _wp(navheight) 28
+set _wp(width) 80
+set _wp(titleheight) 34
+set _wp(titlesep) 4
+set _wp(config) remote_pinerc
+set _wp(motd) motd
+set _wp(save_cache_max) 6
+set _wp(fldr_cache_max) 20
+set _wp(fldr_cache_def) 3
+set _wp(statushelp) 0
+set _wp(imgbuttons) 0
+set _wp(keybindings) 1
+set _wp(dictionary) 0
+set _wp(debug) 0
+set _wp(cmdtime) 0
+set _wp(evaltime) 0
+set _wp(menuargs) {width="112" nowrap valign=top}
+set _wp(ispell) /usr/local/bin/ispell
+
+# Yahoo! User Interface Library location
+#set _wp(yui) $_wp(serverpath)/$_wp(appdir)/$_wp(ui2dir)/lib/yui
+set _wp(yui) "http://yui.yahooapis.com/2.7.0"
+
+# usage reporter - input: username as first command line argument
+# output: space separated integers usage and total
+#set _wp(usage) $_wp(bin)/usage.tcl
+#set _wp(usage_link) "https://uwnetid.washington.edu/disk/"
+
+# limit uploads to 1 file at a time, maximum 20MB.
+set _wp(uplim_files) 1
+set _wp(uplim_bytes) 20000000
+
+# verify sessid from consistent REMOTE_ADDR (set to 0 for proxying clusters)
+set _wp(hostcheck) 0
+
+# set to list of domains for which ssl is NOT required
+#set _wp(ssl_safe_domains) {}
+
+# set to list of address blocks or ranges for which ssl is NOT required
+#set _wp(ssl_safe_addrs) {}
+
+# set this value to zero to turn OFF ssl by default
+set _wp(ssl_default) 1
+
+# allow connecting user to specify imap server on greeting page
+set _wp(flexserver) 1
+
+# make sure tmp files and such are ours alone to read/write
+catch {exec umask 044}
+
+#fix up indexheight so it isn't too high or too low
+set _wp(indexheight) [expr {$_wp(indexheight) <= 20 ? 20 : $_wp(indexheight) >= 30 ? 30 : $_wp(indexheight)}]
+
+# SPAM reporting facility, if set "Report Spam" button appears at top of View Page
+#set _wp(spamaddr) spamaddr@sample-domain.edu
+#set _wp(spamfolder) junk-mail
+#set _wp(spamsubj) "ATTACHED SPAM"
+
+# external mail filter config link
+#set _wp(filter_link) http://delivery-filter.sample-domain.edu/filter/config
+
+# external vacation config link
+#set _wp(vacation_link) http://vacation.sample-domain.edu/vacation/config
+
+#
+# Nickname server bindings. If not present, prompt for the
+# destination of the default pinerc location.
+#
+set _wp(hosts) {
+ {
+ Deskmail
+ $User.deskmail.washington.edu/ssl
+ $_wp(confdir)/conf.deskmail
+ }
+}
+
+# Everybody inherits the cgi, comm packages
+lappend auto_path $_wp(lib)
+
+package require cgi
+package require WPComm
+
+# Recipient of bad news bubbling up from cgi.tcl...
+cgi_admin_mail_addr $_wp(admin)
+
+cgi_sendmail {}
+
+#cgi_mail_relay localhost
+cgi_mail_relay smtpserver.sample-domain.edu
+
+# set permissions for owner-only handling
+cgi_tmpfile_permissions 0640
+
+#set upload limits
+cgi_file_limit $_wp(uplim_files) $_wp(uplim_bytes)
+
+# universal body tag parameters
+cgi_body_args link=#0000FF vlink=#000080 alink=#FF0000 marginwidth=0 marginheight=0 topmargin=0 leftmargin=0
+
+# Common Images Image definitions
+cgi_imglink logo [file join $_wp(imagepath) logo $_wp(logodir) big.gif] border=0 "alt=Web Alpine"
+cgi_imglink smalllogo [file join $_wp(imagepath) logo $_wp(logodir) small.gif] border=0 "alt=About Web Alpine"
+cgi_imglink background [file join $_wp(imagepath) logo $_wp(logodir) back.gif] border=0 align=top
+cgi_imglink dot [file join $_wp(imagepath) dot2.gif] border=0 align=top
+cgi_imglink increas [file join $_wp(imagepath) increas4.gif] border=0 align=absmiddle
+cgi_imglink decreas [file join $_wp(imagepath) decreas4.gif] border=0 align=absmiddle
+cgi_imglink expand [file join $_wp(imagepath) b_plus.gif] border=0 "alt=Expand" height=9 width=9
+cgi_imglink contract [file join $_wp(imagepath) b_minus.gif] border=0 "alt=Collapse" height=9 width=9
+cgi_imglink fullhdr [file join $_wp(imagepath) hdr.gif] border=0 "alt=Full Header"
+cgi_imglink nofullhdr [file join $_wp(imagepath) hdrnon.gif] border=0 "alt=Digested Header"
+cgi_imglink bang [file join $_wp(imagepath) caution.gif] border=0 "alt=!"
+cgi_imglink postmark [file join $_wp(imagepath) postmark.gif] border=0 "alt=New Mail"
+cgi_imglink gtab [file join $_wp(imagepath) tabs gtab.gif] border=0 align=top
+cgi_imglink gdtab [file join $_wp(imagepath) tabs gdtab.gif] border=0 align=top
+cgi_imglink abtab [file join $_wp(imagepath) tabs abtab.gif] border=0 align=top
+cgi_imglink abdtab [file join $_wp(imagepath) tabs abdtab.gif] border=0 align=top
+cgi_imglink ctab [file join $_wp(imagepath) tabs ctab.gif] border=0 align=top
+cgi_imglink cdtab [file join $_wp(imagepath) tabs cdtab.gif] border=0 align=top
+cgi_imglink ftab [file join $_wp(imagepath) tabs ftab.gif] border=0 align=top
+cgi_imglink fdtab [file join $_wp(imagepath) tabs fdtab.gif] border=0 align=top
+cgi_imglink mltab [file join $_wp(imagepath) tabs mltab.gif] border=0 align=top
+cgi_imglink mldtab [file join $_wp(imagepath) tabs mldtab.gif] border=0 align=top
+cgi_imglink mvtab [file join $_wp(imagepath) tabs mvtab.gif] border=0 align=top
+cgi_imglink mvdtab [file join $_wp(imagepath) tabs mvdtab.gif] border=0 align=top
+cgi_imglink rtab [file join $_wp(imagepath) tabs rtab.gif] border=0 align=top
+cgi_imglink rdtab [file join $_wp(imagepath) tabs rdtab.gif] border=0 align=top
+
+
+# Link definitions
+cgi_link Admin "Web Alpine Administrator" "mailto:$_wp(admin)"
+cgi_link Start "Web Alpine Home Page" "$_wp(serverpath)/session/greeting.tcl" target=_top
+
+# Internally referenced CGI directory root
+cgi_root $_wp(serverpath)
+cgi_suffix .tcl
+
+# have cgi.tcl convert eols in muiltipart/form-data
+set _cgi(no_binary_upload) 1
+
+proc WPSocketName {sessid} {
+ global _wp
+
+ return [file join $_wp(sockdir) [format $_wp(sockpat) $sessid]]
+}
+
+proc WPValidId {{sessid {}}} {
+ global _wp env
+
+ if {[string length $sessid] == 0} {
+ set created 1
+
+ # Session Handle: a bit reasonably random number. the format
+ # is convenient for pubcookie auth'd support
+ set rnum {}
+ set rsrc /dev/urandom
+ set idbytelength [expr {$_wp(sessidlen) * 4}]
+ if {[file readable $rsrc] && [catch {open $rsrc r} fp] == 0} {
+ while {1} {
+ for {set i 0} {$i < $idbytelength} {incr i} {
+ if {$i && ($i % 4) == 0} {
+ append rnum "."
+ }
+
+ if {[catch {read $fp 1} n] == 0} {
+ binary scan $n c x
+ set x [expr ($x & 0xff)]
+ append rnum [format {%02x} $x]
+ } else {
+ set rnum {}
+ break
+ }
+ }
+
+ if {[file exists [WPSocketName $rnum]]} {
+ set rnum {}
+ } else {
+ break
+ }
+ }
+
+ close $fp
+ }
+
+ # second choice for random numbers
+ if {[string length $rnum] == 0} {
+ expr srand([clock seconds])
+ for {set i 0} {$i < $idbytelength} {incr i 4} {
+ if {$i && ($i % 4) == 0} {
+ append rnum "."
+ }
+
+ append rnum [format {%08x} [expr int((100000000 * rand()))]]
+ }
+ }
+
+ # generate a session ID
+ set _wp(sessid) $rnum
+ } else {
+ set sessidparts [split $sessid {@}]
+ switch [llength $sessidparts] {
+ 1 {
+ set _wp(sessid) $sessid
+ }
+ 2 {
+ if {[string compare [string tolower [lindex $sessidparts 1]] [string tolower [info hostname]]]} {
+ regexp {^([a-zA-Z]*://).*} [cgi_root] match proto
+ error [list redirect "${proto}[lindex $sessidparts 1]:$env(SERVER_PORT)?$env(QUERY_STRING)"]
+ } else {
+ set _wp(sessid) [lindex $sessidparts 0]
+ }
+ }
+ default {
+ error "Malformed Session ID: $sessid"
+ }
+ }
+ }
+
+ set _wp(sockname) [WPSocketName $_wp(sessid)]
+
+ if {[info exists _wp(cumulative)]} {
+ rename WPCmd WPCmd.orig
+ rename WPCmdTimed WPCmd
+ }
+
+ if {[info exists _wp(hostcheck)] && $_wp(hostcheck) == 1 && ![info exists created]
+ && [catch {WPCmd set wp_client} client] == 0
+ && (([info exists env(REMOTE_ADDR)] && [string length $env(REMOTE_ADDR)] && [string compare $client $env(REMOTE_ADDR)])
+ || ([info exists env(REMOTE_HOST)] && [string length $env(REMOTE_HOST)] && [string compare $client $env(REMOTE_HOST)]))} {
+ error "Request from unrecognized client"
+ }
+}
+
+proc WPAbort {} {
+ WPCleanup
+ cgi_exit
+}
+
+proc WPCleanup {} {
+ global _wp
+
+ if {[info exists _wp(cleanup)]} {
+ foreach item $_wp(cleanup) {
+ catch {eval $item}
+ }
+ }
+}
+
+proc WPEval {vars cmd} {
+ global _wp
+
+ if {$_wp(cmdtime) || $_wp(evaltime)} {
+ set _wp(cumulative) 0
+ }
+
+ set _wp(cmd) $cmd
+ set _wp(vars) [linsert $vars 0 [list sessid "Missing Session ID"]]
+
+ uplevel 1 {
+ cgi_eval {
+ if {$_wp(debug) > 1} {
+ cgi_debug -on
+ }
+
+ # Session id?
+ if {[catch {WPGetInputAndID sessid}]} {
+ return
+ }
+
+ foreach item $_wp(vars) {
+ if {[catch {eval WPImport $item} errstr]} {
+ WPInfoPage "Web Alpine Error" [font size=+2 $errstr] "Please close this window."
+ return
+ }
+ }
+
+ # evaluate the given script
+ if {[catch {cgi_buffer $_wp(cmd)} result]} {
+
+ reset_cgi_state
+
+ if {[string index $result 0] == "_"} {
+ switch -- [lindex $result 0] {
+ _info {
+ WPInfoPage [lindex $result 1] [font size=+2 [lindex $result 2]] [lindex $result 3]
+ }
+ _action {
+ switch -regexp -- [lindex $result 2] {
+ "[Ii]nactive [Ss]ession" {
+ WPInactivePage
+ }
+ default {
+ if {[string length [lindex $result 3]]} {
+ set remedy [lindex $result 3]
+ } else {
+ set remedy " Click your browser's Back button to return to previous page."
+ }
+ WPInfoPage "[lindex $result 1] Error" [font size=+2 [lindex $result 2]] \
+ "Please report this to the [cgi_link Admin].$remedy"
+ }
+ }
+ }
+ _redirect {
+ cgi_http_head {
+ cgi_redirect [lindex $result 1]
+ }
+
+ cgi_html { cgi_body {} }
+ }
+ _close {
+ if {[string length [lindex $result 1]] == 0} {
+ set result "Indeterminate error"
+ }
+
+ WPInfoPage "Web Alpine Error" [font size=+2 [lindex $result 1]] "Please close this window."
+ }
+ default {
+ if {[string length $result]} {
+ WPInfoPage "Web Alpine Error" [font size=+2 "Eval Error: $result"] \
+ "Please complain to the [cgi_link Admin]. Click Back button to return to previous page."
+ } else {
+ WPInfoPage "Web Alpine Error" [font size=+2 "Indeterminate error response"] \
+ "Please complain to the [cgi_link Admin] and click Back button to return to previous page."
+ }
+ }
+ }
+ } else {
+ if {[regexp {[Ii]nactive [Ss]ession} $result]} {
+ WPInactivePage
+ } else {
+ WPInfoPage "Web Alpine Error" [font size=+2 "Error: $result"] \
+ "Please report this to the [cgi_link Admin]. Try clicking your browser's Back button to return to a working page."
+ }
+ }
+ } else {
+ catch {cgi_puts $result}
+ }
+ }
+ }
+
+ # cleanup here
+ WPCleanup
+
+ if {[info exists _wp(cumulative)]} {
+ WPdebug "Cumulative Eval: $_wp(cumulative)"
+ unset _wp(cumulative)
+ }
+}
+
+proc WPGetInputAndID {_sessid} {
+ global _wp
+ upvar $_sessid sessid
+
+ # Import data and validate it
+ if {[catch {cgi_input "sessid=8543949466398&"} result]} {
+ WPInfoPage "Web Alpine Error" [font size=+2 $result] "Please close this window."
+ error "Cannot get CGI Input"
+ }
+
+ if {[catch {WPImport sessid "Missing Session ID"} errstr]} {
+ if {[regexp {.*sessid.*no such.*} $errstr]} {
+ WPInactivePage [list "Your browser may have failed to send the necessary <i>cookie</i> information. Please verify your browser configuration has cookies enabled."]
+ } else {
+ WPInfoPage "Web Alpine Error" [font size=+2 $errstr] "Please close this window."
+ }
+
+ error "Session ID Failure"
+ } else {
+ # initialization here
+ if {[catch {WPValidId $sessid} result]} {
+ if {[string compare [lindex $result 0] redirect]} {
+ WPInfoPage "Web Alpine Error" [font size=+2 "$result"] \
+ "Please complain to the [cgi_link Admin] and visit the [cgi_link Start] later."
+ } else {
+ cgi_http_head {
+ cgi_redirect [lindex $result 1]
+ }
+ }
+
+ error "Unrecoverable Error"
+ } elseif {$_wp(sessid) == 0} {
+ WPInactivePage
+ error "Inactive Session"
+ }
+
+ if {[catch {WPCmd set serverroot} serverroot] == 0} {
+ cgi_root $serverroot
+ }
+ }
+}
+
+proc WPCmdEval {args} {
+ return [eval $args]
+}
+
+proc WPCmd {args} {
+ global _wp
+
+ return [WPSend $_wp(sockname) $args]
+}
+
+proc WPCmdTimed {args} {
+ global _wp
+
+ set t [lindex [time {set r [WPSend $_wp(sockname) $args]}] 0]
+ incr _wp(cumulative) $t
+
+ if {$_wp(cmdtime)} {
+ WPdebug "time $t : $args"
+ }
+
+ return $r
+}
+
+proc WPLoadCGIVar {_var} {
+ upvar $_var var
+
+ if {[catch {cgi_import_as $_var var} result]
+ && [catch {WPCmd set $_var} var]
+ && [catch {cgi_import_cookie_as $_var var} result]} {
+ error [list _action "Import Cookie $_var" $result]
+ }
+}
+
+proc WPLoadCGIVarAs {_var _varas} {
+ upvar $_varas varas
+
+ if {[catch {cgi_import_as $_var varas} result]
+ && [catch {WPCmd set $_var} varas]
+ && [catch {cgi_import_cookie_as $_var varas} result]} {
+ set varas ""
+ }
+}
+
+proc WPImport {valname {errstring ""} {default 0}} {
+ upvar $valname val
+
+ if {[catch {cgi_import_as $valname val} result]} {
+ if {[catch {WPCmd set $valname} val]} {
+ if {[catch {cgi_import_cookie_as $valname val} result]} {
+ if {[string length $errstring] > 0} {
+ error "$errstring: $result"
+ } else {
+ set val $default
+ }
+ }
+ }
+ }
+}
+
+
+proc WPExportCookie {name value {scope ""}} {
+ global _wp
+
+ cgi_cookie_set $name=$value "path=[file join / $_wp(urlprefix) $scope]"
+}
+
+
+# handle dynamic sizing of images showing thread relationships
+proc WPThreadImageLink {t h} {
+ global _wp
+
+ return "<img src=\"[file join $_wp(imagepath) ${t}.gif]\" border=0 align=top height=${h} width=14>"
+}
+
+
+proc WPInactivePage {{reasons ""}} {
+ set l {}
+ foreach r $reasons {
+ append l "<li>$r"
+ }
+
+ WPInfoPage "Inactive Session" \
+ "[font size=+2 "Web Alpine Session No Longer Active"]" \
+ "There are several reasons why a session might become inactive.<ul><li>A bookmarked reference to a Web Alpine page.<li>Failed periodic page reload due to browser/system suspension associated with power saving mode, etc.${l}</ul><p>Please visit the [cgi_link Start] to start a new session."
+}
+
+proc WPInfoPage {title exp1 {exp2 ""} {imgurl {}} {exp3 ""}} {
+ global _wp
+
+ catch {
+
+ cgi_html {
+ cgi_head {
+ cgi_title $title
+ cgi_stylesheet [file join / $_wp(urlprefix) $_wp(pubdir) standard.css]
+ }
+
+ cgi_body {
+ cgi_table height="20%" {
+ cgi_table_row {
+ cgi_table_data {
+ cgi_puts [cgi_nbspace]
+ }
+ }
+ }
+
+ cgi_center {
+ cgi_table border=0 width=500 cellpadding=3 {
+ cgi_table_row {
+ cgi_table_data align=center rowspan=3 {
+ if {[string length $imgurl]} {
+ cgi_put [cgi_url [cgi_imglink logo] $imgurl]
+ } else {
+ cgi_put [cgi_imglink logo]
+ }
+ }
+
+ cgi_table_data rowspan=3 {
+ cgi_put [nbspace]
+ cgi_put [nbspace]
+ }
+
+ cgi_table_data {
+ cgi_puts $exp1
+ }
+
+ }
+
+ if {[string length $exp3]} {
+ cgi_table_row {
+ cgi_table_data "style=\"border: 1px solid red; background-color: pink\"" {
+ cgi_puts $exp3
+ }
+ }
+ }
+
+ if {[string length $exp2]} {
+ cgi_table_row {
+ cgi_table_data {
+ cgi_puts $exp2
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+proc WPimg {image {extension gif}} {
+ global _wp
+
+ return [file join $_wp(imagepath) ${image}.${extension}]
+}
+
+proc WPCharValue {c} {
+ scan "$c" %c n
+ return $n
+}
+
+proc WPPercentQuote {arg {exclude {}}} {
+ set t "\[^0-9a-zA-Z_${exclude}\]"
+ if {[regsub -all $t $arg {[format "%%%.2X" [WPCharValue "\\&"]]} subarg]} {
+ set x [subst $subarg]
+ return $x
+ } else {
+ return $arg
+ }
+}
+
+proc WPJSQuote {l} {
+ regsub -all {([\\'])} $l {\\\1} l
+ return $l
+}
+
+proc WPurl {cmd cmdargs text explanation args} {
+ global _wp
+
+ lappend urlargs $text
+ lappend urlargs $cmd
+ if {[regexp "^java*" $cmd] == 0 && [string first . $cmd] < 0} {
+ append urlargs ".tcl"
+ }
+
+ if {[string length $cmdargs]} {
+ if {[set i [string first "?" $cmdargs]] >= 0} {
+ append urlargs "[cgi_quote_url [string range $cmdargs 0 [expr {$i - 1}]]]?[cgi_quote_url [string range $cmdargs [incr i] end]]"
+ } else {
+ append urlargs "?[cgi_quote_url $cmdargs]"
+ }
+ }
+
+ if {$_wp(statushelp)} {
+ lappend urlargs [WPmouseover $explanation]
+ lappend urlargs "onMouseOut=window.status=''"
+ }
+
+ return [eval "cgi_url $urlargs $args"]
+}
+
+proc WPMenuURL {cmd cmdargs text explanation args} {
+ return [WPurl $cmd $cmdargs $text $explanation class=menubar [join $args]]
+}
+
+proc WPGetTDFontSize {{ih 24}} {
+ if {$ih <= 20 } {return 12}
+ if {$ih >= 30 } {return 24}
+ return [expr {$ih - 8}]
+}
+
+proc WPGetviewFontSize {{ih 24}} {
+ if {$ih <= 20 } {return 8}
+ if {$ih >= 30 } {return 13}
+ return [expr {($ih / 2) - 2}]
+}
+
+proc WPIndexLineHeight {{ih 0}} {
+ global _wp
+
+ set ih [WPCmd PEInfo indexheight]
+ if {[string length $ih] == 0 || $ih <= 0} {
+ set ih $_wp(indexheight)
+ }
+
+ return [expr {($ih < 20) ? 20 : $ih}]
+}
+
+proc WPStyleSheets {{ih 0}} {
+ global _wp
+
+ cgi_stylesheet [file join / $_wp(urlprefix) $_wp(pubdir) standard.css]
+
+ if {$ih <= 0} {
+ set ih [WPIndexLineHeight]
+ }
+
+ cgi_puts "<style type='text/css'>\nTD { font-size: [WPGetTDFontSize $ih]px }\n.view {font-size: [WPGetviewFontSize $ih]pt }\n</style>"
+ return $ih
+}
+
+proc WPStdScripts {{ih 0}} {
+ global _wp
+
+ set ih [WPStyleSheets $ih]
+
+ cgi_script language="JavaScript" src="[file join / $_wp(urlprefix) $_wp(pubdir) standard.js]" {}
+ cgi_script language="JavaScript1.3" {cgi_put "js_version = '1.3';"}
+ cgi_javascript {
+ cgi_puts "function getIndexHeight(){return $ih}"
+ }
+}
+
+proc WPStdHttpHdrs {{ctype {}} {expires 0}} {
+ global _wp
+
+ # set date and expires headers the same to prevent caching
+ # Date: Tue, 15 Nov 1994 08:12:31 GMT
+ set doctime [clock seconds]
+
+ if {[string length $ctype]} {
+ cgi_content_type $ctype
+ } else {
+ cgi_content_type
+ }
+
+ cgi_puts "Date: [clock format $doctime -gmt true -format "%a, %d %b %Y %H:%M:%S GMT"]"
+ if {$expires == 0} {
+ set _wp(nocache) 1
+ cgi_puts "Cache-Control: no-cache"
+ cgi_puts "Expires: [clock format [expr {$doctime - 31536000}] -gmt true -format "%a, %d %b %Y %H:%M:%S GMT"]"
+ } elseif {$expires > 0} {
+ cgi_puts "Expires: [clock format [expr {$doctime + ($expires * 60)}] -gmt true -format "%a, %d %b %Y %H:%M:%S GMT"]"
+ }
+}
+
+proc WPStdHtmlHdr {pagetitle {pagescript ""} {newmail 0}} {
+ global _wp
+
+ if {0 && $newmail} {
+ set nm "* "
+ } else {
+ set nm ""
+ }
+
+ cgi_title "${nm}Web Alpine - $pagetitle"
+ # cgi_base "href=$_wp(serverpath)/"
+ if {[info exists _wp(nocache)]} {
+ cgi_http_equiv Pragma no-cache
+ }
+
+ # cgi_http_equiv Expires $_wp(docdate)
+ cgi_meta "name=Web Alpine" content=[clock format [file mtime [info script]] -format "%y%m%d/%H%M"]
+ if {[catch {WPCmd set nojs} nojs] || $nojs != 1} {
+ cgi_script type="text/javascript" language="JavaScript" {
+ cgi_puts "if(self != top) top.location.href = location.href;"
+ cgi_puts "js_version = '1.0';"
+ }
+ }
+
+ cgi_put "<link rel=\"icon\" href=\"[cgi_root]/favicon.ico\" type=\"image/x-icon\">"
+ cgi_put "<link rel=\"shortcut icon\" href=\"[cgi_root]/favicon.ico\" type=\"image/x-icon\"> "
+}
+
+proc WPHtmlHdrReload {pagescript} {
+ global _wp
+
+ if {[regexp {\?} $pagescript]} {
+ set c "&"
+ } else {
+ set c "?"
+ }
+
+ cgi_http_equiv Refresh "$_wp(refresh); url=[cgi_root]/${pagescript}${c}reload=1"
+}
+
+proc WPNewMail {reload {viewpage msgview.tcl}} {
+
+ if {[catch {WPCmd PEMailbox newmail $reload} newmail]} {
+ return -code error $newmail
+ }
+
+ set newref ""
+
+ if {[set msgsnew [lindex $newmail 0]] > 0} {
+ if {[string length $viewpage]} {
+ if {[string first {?} $viewpage] < 0} {
+ set delim ?
+ } else {
+ set delim &
+ }
+
+ set newurl "${viewpage}${delim}uid=[lindex $newmail 1]"
+ } else {
+ set newurl [lindex $newmail 1]
+ }
+
+ set newicon "postmark"
+ set newtext [cgi_quote_html [WPCmd PEMailbox newmailstatmsg]]
+
+ if {[WPCmd PEInfo feature enable-newmail-sound]} {
+ #set audio sounds/mail_msg.wav
+ set audio /sounds/ding.wav
+ if {[isIE]} {
+ set newsound "<bgsound src=\"$audio\" loop=\"1\" volume=\"100\">"
+ } else {
+ set newsound "<embed src=\"$audio\" autostart=\"true\" hidden width=0 height=0 loop=\"false\"><noembed><bgsound src=\"$audio\" loop=\"1\"></noembed>"
+ }
+ } else {
+ set newsound {}
+ }
+
+ if {0 == [string length $newtext]} {
+ set newtext "You have $msgsnew new message[WPplural $msgsnew]"
+ }
+
+ lappend newref [list $newtext $newicon $newurl $newsound]
+ }
+
+ if {[set deleted [lindex $newmail 2]] > 0} {
+ set newtext "$deleted Message[WPplural $deleted] removed from folder"
+ lappend newref [list $newtext "" ""]
+ }
+
+ foreach statmsg [WPStatusMsgs] {
+ lappend newref [list $statmsg "" ""]
+ WPCmd PEInfo statmsg ""
+ }
+
+ if {!$reload} {
+ WPCmd PEMailbox newmailreset
+ }
+
+ return $newref
+}
+
+proc WPStatusMsgs {} {
+ set retmsgs ""
+ set lastmsg ""
+ if {[catch {WPCmd PEInfo statmsgs} statmsgs] == 0} {
+ foreach statmsg $statmsgs {
+ if {[string length $statmsg] > 0 && [string compare $statmsg $lastmsg]} {
+ if {[regexp "^Pinerc \(.+\) NOT saved$" $statmsg]} {
+ lappend retmsgs "Another Pine/WebPine session may be running. Settings cannot be saved."
+ } else {
+ lappend retmsgs $statmsg
+ }
+
+ set lastmsg $statmsg
+ }
+ }
+ }
+
+ return $retmsgs
+}
+
+proc WPStatusIcon {uid {extension gif} {statbits ""}} {
+ global _wp
+
+ if {[string length $statbits] == 0} {
+ set statbits [WPCmd PEMessage $uid statusbits]
+ }
+
+ if {[string index $statbits 0]} {
+ append sicon "new"
+ set alt " N"
+ set fullalt "New "
+ } else {
+ append sicon "read"
+ set alt " "
+ set fullalt "Viewed "
+ }
+
+ if {[string index $statbits 3]} {
+ append sicon "imp"
+ set alt "*[string range $alt 1 end]"
+ set fullaltend ", important message"
+ } elseif {([string index $statbits 4] || [string index $statbits 5])} {
+ append sicon "you"
+ set alt "+[string range $alt 1 end]"
+ set fullaltend " message to you"
+ }
+
+ if {[string index $statbits 2]} {
+ append sicon "ans"
+ set alt "[string range $alt 0 0]A"
+ append fullalt ", answered"
+ }
+
+ if {[string index $statbits 1]} {
+ append sicon "del"
+ set alt "[string range $alt 0 0]D"
+ append fullalt ", deleted"
+ }
+
+ if {[info exists fullaltend]} {
+ append fullalt $fullaltend
+ } else {
+ append fullalt message
+ }
+
+ regsub -all { } $alt {\&nbsp;} alt
+
+ return [list [file join $_wp(imagepath) $_wp(staticondir) ${sicon}.${extension}] i_${uid} $alt $fullalt]
+}
+
+proc WPStatusLabel {uid} {
+ global _wp
+
+ set statbits [WPCmd PEMessage $uid statusbits]
+
+ if {[string index $statbits 0]} {
+ set sl new
+ } else {
+ set sl read
+ }
+
+ if {[string index $statbits 3]} {
+ set sl important
+ }
+
+ if {[string index $statbits 1]} {
+ set sl deleted
+ }
+
+ if {[string index $statbits 2]} {
+ set sl answered
+ }
+
+ return $sl
+}
+
+proc WPStatusImg {uid} {
+ set sicon [WPStatusIcon $uid]
+ return [cgi_img [lindex $sicon 0] name=[lindex $sicon 1] id=[lindex $sicon 1] height=16 width=42 border=0 alt=[lindex $sicon 3]]
+}
+
+proc WPSessionState {args} {
+ switch [llength $args] {
+ 1 -
+ 2 {
+ if {[catch {WPCmd PEInfo alpinestate} state_list] == 0} {
+ array set state_array $state_list
+ if {[llength $args] == 1} {
+ return $state_array([lindex $args 0])
+ } else {
+ set state_array([lindex $args 0]) [lindex $args 1]
+ set state_list [array get state_array]
+ if {[catch {WPCmd PEInfo alpinestate $state_list} result]} {
+ error "Can't set session state : $result"
+ }
+ }
+ } else {
+ error "Can't read session state"
+ }
+ }
+ default {
+ error "Unknown SessionState Parameters: $args"
+ }
+ }
+}
+
+proc WPScriptVersion {tag {inc 0}} {
+ if {[catch {WPCmd set wp_script_version} sv]} {
+ set versions($tag) [expr int((1000 * rand()))]
+ set sv [array get versions]
+ catch {WPCmd set wp_script_version $sv}
+ } else {
+ array set versions $sv
+
+ if {![info exists versions($tag)]} {
+ set versions($tag) [expr int((1000 * rand()))]
+ set sv [array get versions]
+ catch {WPCmd set wp_script_version $sv}
+ } elseif {$inc} {
+ incr versions($tag) $inc
+ set sv [array get versions]
+ catch {WPCmd set wp_script_version $sv}
+ }
+ }
+
+ return $versions($tag)
+}
+
+proc WPplural {count} {
+ if {$count > 1} {
+ return "s"
+ }
+
+ return ""
+}
+
+proc WPcomma {number {dot ,}} {
+ set x ""
+
+ while {[set n [string length $number]] > 3} {
+ set x "${dot}[string range $number [incr n -3] end]$x"
+ set number [string range $number 0 [incr n -1]]
+ }
+
+ return "$number$x"
+}
+
+proc isIE {} {
+ global env
+
+ return [expr {[info exists env(HTTP_USER_AGENT)] == 1 && [string first MSIE $env(HTTP_USER_AGENT)] >= 0}]
+}
+
+proc isW3C {} {
+ global env
+
+ return [expr {[info exists env(HTTP_USER_AGENT)] && (([regexp {^Mozilla/([0-9]).[0-9]+} $env(HTTP_USER_AGENT) match majorversion] && $majorversion > 4) || ([regexp {Opera ([0-9])\.[0-9]+} $env(HTTP_USER_AGENT) match majorversion] && $majorversion > 5))}]
+}
+
+proc WPdebug {args} {
+ global _wp
+
+ switch [lindex $args 0] {
+ level {
+ if {[regexp {^([0-9])+$} [lindex $args 1]]} {
+ WPSend $_wp(sockname) [subst {PEDebug level [lindex $args 1]}]
+ }
+ }
+ imap {
+ switch [lindex $args 1] {
+ on {
+ WPSend $_wp(sockname) [subst {ePEDebug imap 4}]
+ }
+ off {
+ WPSend $_wp(sockname) [subst {PEDebug imap 0}]
+ }
+ }
+ }
+ default {
+ WPSend $_wp(sockname) "PEDebug write [list [list [file tail [info script]]: [lrange $args 0 end]]]"
+ }
+ }
+}
+
+proc WPdebugstack {} {
+ set stack {}
+
+ for {set n [expr {[info level] - 1}]} {$n > 0} {incr n -1} {
+ append stack "$n) [info level $n]\n"
+ }
+ return $stack
+}
+
+
+##############################################################
+# routines to improve integration with cgi.tcl
+##############################################################
+
+# routine exposing some of cgi.tcl's innards.
+# Should be exported by cgi.tcl package.
+proc reset_cgi_state {} {
+ global _cgi
+
+ catch {unset _cgi(http_head_in_progress)}
+ catch {unset _cgi(http_head_done)}
+ catch {unset _cgi(http_status_done)}
+ catch {unset _cgi(html_in_progress)}
+ catch {unset _cgi(head_in_progress)}
+ catch {unset _cgi(head_done)}
+ catch {unset _cgi(html_done)}
+ catch {unset _cgi(head_suppress_tag)}
+ catch {unset _cgi(body_in_progress)}
+ catch {unset _cgi(tag_in_progress)}
+ catch {unset _cgi(form_in_progress)}
+ catch {unset _cgi(close_proc)}
+
+ if {[info exists _cgi(returnIndex)]} {
+ while {[set _cgi(returnIndex)] > 0} {
+ incr _cgi(returnIndex) -1
+ rename cgi_puts ""
+ rename cgi_puts$_cgi(returnIndex) cgi_puts
+ }
+ }
+}
+
+###############################################################
+# routines to process (and be called in) html template files
+###############################################################
+
+proc html_readfile {file} {
+ set x [open $file "r"]
+ set result [read $x]
+ close $x
+ return $result
+}
+
+proc html_eval {_vars_ _this_} {
+ foreach {_i_ _j_} $_vars_ {
+ if {$_i_ == "global"} {global $_j_} {set $_i_ $_j_}
+ }
+ unset _vars_ _i_ _j_
+ return [subst $_this_]
+}
+
+proc html_loop {varslist text} {
+ set result ""
+ foreach {vars} $varslist {
+ append result [html_eval $vars $text]
+ }
+ return $result
+}
diff --git a/web/config/conf.deskmail b/web/config/conf.deskmail
new file mode 100644
index 00000000..4f760c75
--- /dev/null
+++ b/web/config/conf.deskmail
@@ -0,0 +1,55 @@
+#
+# Defaults that make more sense in our browser
+# oriented world...
+#
+inbox-path={${WPUSER}.deskmail.washington.edu/tls}inbox
+
+user-domain=u.washington.edu
+
+folder-collections="Deskmail Folders" {${WPUSER}.deskmail.washington.edu/tls}mail/[]
+
+literal-signature=""
+
+address-book={${WPUSER}.deskmail.washington.edu/tls}remote_addrbook
+
+feature-list=enable-msg-view-urls,
+ enable-msg-view-web-hostnames,
+ enable-msg-view-addresses,
+ enable-msg-view-attachments,
+ compose-rejects-unqualified-addrs,
+ enable-aggregate-command-set,
+ auto-zoom-after-select,
+ auto-unselect-after-apply,
+ fcc-without-attachments,
+ quell-empty-directories
+
+normal-background-color=white
+normal-foreground-color=black
+quote1-foreground-color=000,000,153
+quote1-background-color=white
+quote2-foreground-color=051,051,255
+quote2-background-color=white
+quote3-foreground-color=051,153,255
+quote3-background-color=white
+
+rsh-open-timeout=0
+ssh-open-timeout=0
+
+index-format=ATT STATUS FROMORTO(18%) SUBJECT(70%) SMARTDATETIME(12%) SIZENARROW PRIORITY
+
+viewer-hdr-colors=/HDR=Subject/FG=black/BG=yellow,
+ /HDR=message-id/FG=black/BG=206\x2C206\x2C206,
+ /HDR=In-reply-to/FG=black/BG=206\x2C206\x2C206
+
+wp-indexlines=25
+wp-aggstate=2
+
+sort-key=date/reverse
+
+ldap-servers=people.u.washington.edu "/base=o=University of Washington,c=US/impl=1/rhs=0/ref=0/nosub=0/type=/srch=/time=/size=/cust=/nick=/matr=/catr=/satr=/gatr="
+
+addressbook-formats=FULLNAME NICKNAME ADDRESS
+
+rss-news=http://uwnews.org/apps/uwnews/public/rss.aspx?q=uwnAllCategories&numToShow=10
+
+rss-weather=http://www.weather.gov/xml/current_obs/KBFI.rss
diff --git a/web/config/pine.conf b/web/config/pine.conf
new file mode 100644
index 00000000..e9f4c29c
--- /dev/null
+++ b/web/config/pine.conf
@@ -0,0 +1,52 @@
+#
+# Defaults that make more sense in our browser
+# oriented world...
+#
+inbox-path={${IMAP_SERVER}}inbox
+
+smtp-server=localhost
+
+user-domain=${IMAP_SERVER_BASE}
+
+folder-collections="Folders" {${IMAP_SERVER}}mail/[]
+
+literal-signature=""
+
+address-book={${IMAP_SERVER}}remote_addrbook
+
+feature-list=enable-msg-view-urls,
+ enable-msg-view-web-hostnames,
+ enable-msg-view-addresses,
+ enable-msg-view-attachments,
+ compose-rejects-unqualified-addrs,
+ enable-aggregate-command-set,
+ auto-zoom-after-select,
+ auto-unselect-after-apply,
+ quell-empty-directories
+
+normal-background-color=white
+normal-foreground-color=black
+quote1-foreground-color=000,000,153
+quote1-background-color=white
+quote2-foreground-color=051,051,255
+quote2-background-color=white
+quote3-foreground-color=051,153,255
+quote3-background-color=white
+
+rsh-open-timeout=0
+ssh-open-timeout=0
+
+index-format=ATT STATUS FROMORTO(18%) SUBJECT(70%) SMARTDATETIME(12%) SIZENARROW PRIORITY
+
+viewer-hdr-colors=/HDR=Subject/FG=black/BG=yellow,
+ /HDR=message-id/FG=black/BG=206\x2C206\x2C206,
+ /HDR=In-reply-to/FG=black/BG=206\x2C206\x2C206
+
+sort-key=date
+
+addressbook-formats=FULLNAME NICKNAME ADDRESS
+
+rss-news=http://uwnews.org/apps/uwnews/public/rss.aspx?q=uwnAllCategories&numToShow=10
+
+rss-weather=http://www.weather.gov/xml/current_obs/KBFI.rss
+