diff options
Diffstat (limited to 'web/cgi/session/init.tcl')
-rwxr-xr-x | web/cgi/session/init.tcl | 218 |
1 files changed, 218 insertions, 0 deletions
diff --git a/web/cgi/session/init.tcl b/web/cgi/session/init.tcl new file mode 100755 index 00000000..00f0f903 --- /dev/null +++ b/web/cgi/session/init.tcl @@ -0,0 +1,218 @@ +#!./tclsh +# $Id: init.tcl 1204 2009-02-02 19:54:23Z hubert@u.washington.edu $ +# ======================================================================== +# Copyright 2006 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 +# +# ======================================================================== + +# init.tcl +# +# Purpose: CGI script to establish foundation for webpine session + +# and any global config +source ./alpine.tcl + + +cgi_eval { + if {$_wp(debug)} { + cgi_debug -on + } + + # + # Import username and password from pubcookie, if possible. + # Otherwise get it from the form that was submitted. + # + cgi_input + + if {[catch {cgi_import User}] || 0 == [string length $User]} { + WPInfoPage "Bogus Username" \ + "[font size=+2 "Sorry, didn't catch your [bold name]!"]" \ + "Please click your browser's [bold Back] button to return to the [cgi_link Start], and fill in a [italic Username]..." + return + } + + if {[catch {cgi_import Pass}]} { + set Pass "" + } + + if {[catch {cgi_import Server}] || 0 == [string length $Server]} { + WPInfoPage "Bogus Server" \ + "[font size=+2 "Invalid Server specified"]" \ + "Please click your browser's [bold Back] button to return to the [cgi_link Start], and fill in a [italic Server]..." + return + } + + catch {cgi_import hPx} + + set defconf [file join $_wp(confdir) $_wp(defconf)] + set confloc "" + + if {[string length $Server] < 256 && 0 == [regexp {[[:cntrl:]]} $Server]} { + if {[info exists _wp(hosts)] && $Server >= 0 && $Server < [llength $_wp(hosts)]} { + set sdata [lindex $_wp(hosts) $Server] + + set env(IMAP_SERVER) "[subst [lindex $sdata 1]]/user=$User" + + if {[llength $sdata] > 2 && [string length [lindex $sdata 2]]} { + set defconf [subst [lindex $sdata 2]] + } else { + # + # Validate input? + # + WPInfoPage "Internal Error" \ + [font size=+2 "IMAP Server Mismatch"] \ + "Please complain to the [link Admin] and visit the [cgi_link Start] later." + return + } + } elseif {[regexp {/user=} $Server]} { + set env(IMAP_SERVER) "$Server" + } else { + set env(IMAP_SERVER) "$Server/user=$User" + } + + set confloc "\{$env(IMAP_SERVER)\}$_wp(config)" + + regexp {^[^:/]*} $env(IMAP_SERVER) env(IMAP_SERVER_BASE) + } else { + WPInfoPage "Bad Server Name" [font size=+2 "Server Name too long or has bogus characters."] \ + "Please click your browser's [bold Back] button to return to the [cgi_link Start] to try again..." + return + } + + set confloc "\{$env(IMAP_SERVER)\}$_wp(config)" + + if {[catch {regexp {^[^:/]*} $env(IMAP_SERVER) env(IMAP_SERVER_BASE)}]} { + set env(IMAP_SERVER_BASE) "" + } + + # in less rigid settings, it might make sense to allow + # for random input folder names... + # cgi_import Folder + + # + # Server, folder and credentials in hand, fork the client... + # <OL> + # <LI> The session is *assumed* to run over SSL. + # <LI> The server is *assumed* to be a black box + # (no, possibly hostile, user shells) + # <LI> We need to run the alpine process as the given user. + # Unless we bind to a specific server, http authentication + # isn't sufficient as t + # + # <LI> The session-id connects future requests to the newly + # created alpine engine. + # <LI> The auth-cookie will tell us the session-id isn't coming from + # j. random cracker's client + # </OL> + # + + if {[catch {exec [file join $_wp(bin) launch.tcl]} _wp(sessid)]} { + WPInfoPage "Internal Error" [font size=+2 $_wp(sessid)] \ + "Please complain to the [link Admin] and visit the [cgi_link Start] later." + return + } else { + WPValidId $_wp(sessid) + } + + if {[catch {cgi_import ssl}] || $ssl == 0} { + WPCmd set serverroot $_wp(plainservpath) + cgi_root $_wp(plainservpath) + } + + # stash login credentials away for later + if {[catch { + WPCmd set nojs 1 + WPCmd PESession creds 0 $confloc $User $Pass + } result]} { + WPInfoPage "Initialization Failure" [font size=+2 "Initialization Failure: $result"] \ + "Please click your browser's [bold Back] button to return to the [cgi_link Start] to try again..." + catch {WPCmd exit} + return + } + + set cookiepath $_wp(appdir) + + # stash session open parms in alpined's interpreter + lappend parms User + lappend parms $User + lappend parms Server + lappend parms $Server + lappend parms confloc + lappend parms $confloc + lappend parms defconf + lappend parms $defconf + lappend parms startpage + + lappend parms "$_wp(appdir)/$_wp(ui2dir)/browse/0/INBOX" + lappend parms prunepage + lappend parms "" + + if {[info exists hPx]} { + lappend parms hPx + lappend parms $hPx + } + + if {[catch {WPCmd set wp_open_parms $parms} result]} { + WPInfoPage "Internal Error" [font size=+2 $result] \ + "Please complain to the [link Admin] and visit the [cgi_link Start] later." + return + } + + # return a page that says we're logging in the user + # have that page return to opening the session... + + catch {WPCmd set wp_ver_dir $cookiepath} + + set sessid "$_wp(sessid)@[info hostname]" + + cgi_http_head { + WPExportCookie sessid $sessid $cookiepath + WPStdHttpHdrs + } + + cgi_html { + cgi_head { + cgi_http_equiv Refresh "0; url=$_wp(serverpath)/session/logon.tcl?sessid=$sessid" + } + + 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=2 { + cgi_put [cgi_imglink logo] + } + + cgi_table_data rowspan=2 { + cgi_put [cgi_img [WPimg dot2] border=0 width=18] + } + + cgi_table_data { + cgi_puts [cgi_font size=+2 "Logging into $_wp(appname)"] + } + } + + cgi_table_row { + cgi_table_data { + cgi_puts "Please be patient! Depending on Inbox size, server load and other factors this may take a moment [cgi_img [WPimg dotblink]]" + } + } + } + } + } + } +} |