From: Vlad S. <ser...@us...> - 2005-02-16 16:46:00
|
Update of /cvsroot/naviserver/naviserver/tcl In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv6070/tcl Modified Files: charsets.tcl compat.tcl debug.tcl fastpath.tcl file.tcl form.tcl http.tcl init.tcl nsdb.tcl sendmail.tcl util.tcl Removed Files: modlog.tcl Log Message: License terms in the headers are changed to Mozilla. sendmail proc extended to support cc as argument and possibly ignore error on receiving QUIT response, some mail servers just drop the connection and then sendmail generate error. ns_getform checks for connection and if no connection returns empty instead of generate error, to be used safely in schedule scripts when same code runs on the Web frontend and backend. Index: file.tcl =================================================================== RCS file: /cvsroot/naviserver/naviserver/tcl/file.tcl,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** file.tcl 16 Feb 2005 08:40:40 -0000 1.1.1.1 --- file.tcl 16 Feb 2005 16:45:44 -0000 1.2 *************** *** 1,7 **** # ! # The contents of this file are subject to the AOLserver Public License # Version 1.1 (the "License"); you may not use this file except in # compliance with the License. You may obtain a copy of the License at ! # http://aolserver.com/. # # Software distributed under the License is distributed on an "AS IS" --- 1,7 ---- # ! # The contents of this file are subject to the Mozilla Public License # Version 1.1 (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.mozilla.org/. # # Software distributed under the License is distributed on an "AS IS" *************** *** 48,52 **** ! if {$on} { ns_share errorPage ns_log notice "tcl: enabling .tcl pages" --- 48,52 ---- ! if $on { ns_share errorPage ns_log notice "tcl: enabling .tcl pages" *************** *** 65,103 **** } ! proc ns_sourceproc {conn args} { ! ns_share errorPage ! set file [ns_url2file [ns_conn url $conn]] ! if {![file exists $file]} { ! ns_returnnotfound $conn ! } else { ! set code [catch { ! source $file ! } result ] ! global errorCode errorInfo ! if { ![info exists errorCode] } { ! # Tcl bug workaround. ! set errorCode NONE ! } ! if { ![info exists errorInfo] } { ! # Another Tcl bug workaround. ! set errorInfo "" ! } ! if {$code == 1 && $errorCode == "NS_TCL_ABORT"} { ! return ! } ! if { $errorPage == "" } { ! return -code $code \ ! -errorcode $errorCode -errorinfo $errorInfo $result ! } else { ! ## Custom error page -- unfortunately we can't pass parameters. ! source $errorPage ! } } } --- 65,142 ---- } + if { ![string equal [info commands "ns_cache"] ""] } { + proc ns_sourceproc {conn ignored} { ! ns_share errorPage ! set file [ns_url2file [ns_conn url $conn]] ! if ![file exists $file] { ! ns_returnnotfound $conn ! } else { ! set code [catch { ! source_cached $file ! } result ] ! global errorCode errorInfo ! ! if { ![info exists errorCode] } { ! # Tcl bug workaround. ! set errorCode NONE ! } ! if { ![info exists errorInfo] } { ! # Another Tcl bug workaround. ! set errorInfo "" ! } ! ! if {$code == 1 && $errorCode == "NS_TCL_ABORT"} { ! return ! } ! if { $errorPage == "" } { ! return -code $code \ ! -errorcode $errorCode -errorinfo $errorInfo $result ! } else { ! ## Custom error page -- unfortunately we can't pass parameters. ! source $errorPage ! } ! } ! } ! } else { ! proc ns_sourceproc {conn ignored} { ! ! ns_share errorPage ! ! set file [ns_url2file [ns_conn url $conn]] ! if ![file exists $file] { ! ns_returnnotfound $conn ! } else { ! set code [catch { ! source $file ! } result ] ! ! global errorCode errorInfo ! if { ![info exists errorCode] } { ! # Tcl bug workaround. ! set errorCode NONE ! } ! if { ![info exists errorInfo] } { ! # Another Tcl bug workaround. ! set errorInfo "" ! } ! if {$code == 1 && $errorCode == "NS_TCL_ABORT"} { ! return ! } ! if { $errorPage == "" } { ! return -code $code \ ! -errorcode $errorCode -errorinfo $errorInfo $result ! } else { ! ## Custom error page -- unfortunately we can't pass parameters. ! source $errorPage ! } ! } } } + --- modlog.tcl DELETED --- Index: util.tcl =================================================================== RCS file: /cvsroot/naviserver/naviserver/tcl/util.tcl,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** util.tcl 16 Feb 2005 08:40:42 -0000 1.1.1.1 --- util.tcl 16 Feb 2005 16:45:45 -0000 1.2 *************** *** 1,7 **** # ! # The contents of this file are subject to the AOLserver Public License # Version 1.1 (the "License"); you may not use this file except in # compliance with the License. You may obtain a copy of the License at ! # http://aolserver.com/. # # Software distributed under the License is distributed on an "AS IS" --- 1,7 ---- # ! # The contents of this file are subject to the Mozilla Public License # Version 1.1 (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.mozilla.org/. # # Software distributed under the License is distributed on an "AS IS" Index: compat.tcl =================================================================== RCS file: /cvsroot/naviserver/naviserver/tcl/compat.tcl,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** compat.tcl 16 Feb 2005 08:40:40 -0000 1.1.1.1 --- compat.tcl 16 Feb 2005 16:45:44 -0000 1.2 *************** *** 1,7 **** # ! # The contents of this file are subject to the AOLserver Public License # Version 1.1 (the "License"); you may not use this file except in # compliance with the License. You may obtain a copy of the License at ! # http://aolserver.com/. # # Software distributed under the License is distributed on an "AS IS" --- 1,7 ---- # ! # The contents of this file are subject to the Mozilla Public License # Version 1.1 (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.mozilla.org/. # # Software distributed under the License is distributed on an "AS IS" Index: form.tcl =================================================================== RCS file: /cvsroot/naviserver/naviserver/tcl/form.tcl,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** form.tcl 16 Feb 2005 08:40:40 -0000 1.1.1.1 --- form.tcl 16 Feb 2005 16:45:44 -0000 1.2 *************** *** 1,7 **** # ! # The contents of this file are subject to the AOLserver Public License # Version 1.1 (the "License"); you may not use this file except in # compliance with the License. You may obtain a copy of the License at ! # http://aolserver.com/. # # Software distributed under the License is distributed on an "AS IS" --- 1,7 ---- # ! # The contents of this file are subject to the Mozilla Public License # Version 1.1 (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.mozilla.org/. # # Software distributed under the License is distributed on an "AS IS" *************** *** 135,138 **** --- 135,140 ---- global _ns_form _ns_formfiles + if { ![ns_conn isconnected] } { return } + # # If a charset has been specified, use ns_urlcharset to Index: fastpath.tcl =================================================================== RCS file: /cvsroot/naviserver/naviserver/tcl/fastpath.tcl,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** fastpath.tcl 16 Feb 2005 08:40:40 -0000 1.1.1.1 --- fastpath.tcl 16 Feb 2005 16:45:44 -0000 1.2 *************** *** 1,7 **** # ! # The contents of this file are subject to the AOLserver Public License # Version 1.1 (the "License"); you may not use this file except in # compliance with the License. You may obtain a copy of the License at ! # http://aolserver.com/. # # Software distributed under the License is distributed on an "AS IS" --- 1,7 ---- # ! # The contents of this file are subject to the Mozilla Public License # Version 1.1 (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.mozilla.org/. # # Software distributed under the License is distributed on an "AS IS" Index: nsdb.tcl =================================================================== RCS file: /cvsroot/naviserver/naviserver/tcl/nsdb.tcl,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** nsdb.tcl 16 Feb 2005 08:40:40 -0000 1.1.1.1 --- nsdb.tcl 16 Feb 2005 16:45:45 -0000 1.2 *************** *** 1,7 **** # ! # The contents of this file are subject to the AOLserver Public License # Version 1.1 (the "License"); you may not use this file except in # compliance with the License. You may obtain a copy of the License at ! # http://aolserver.com/. # # Software distributed under the License is distributed on an "AS IS" --- 1,7 ---- # ! # The contents of this file are subject to the Mozilla Public License # Version 1.1 (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.mozilla.org/. # # Software distributed under the License is distributed on an "AS IS" Index: charsets.tcl =================================================================== RCS file: /cvsroot/naviserver/naviserver/tcl/charsets.tcl,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** charsets.tcl 16 Feb 2005 08:40:40 -0000 1.1.1.1 --- charsets.tcl 16 Feb 2005 16:45:44 -0000 1.2 *************** *** 1,7 **** # ! # The contents of this file are subject to the AOLserver Public License # Version 1.1 (the "License"); you may not use this file except in # compliance with the License. You may obtain a copy of the License at ! # http://aolserver.com/. # # Software distributed under the License is distributed on an "AS IS" --- 1,7 ---- # ! # The contents of this file are subject to the Mozilla Public License # Version 1.1 (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.mozilla.org/. # # Software distributed under the License is distributed on an "AS IS" Index: http.tcl =================================================================== RCS file: /cvsroot/naviserver/naviserver/tcl/http.tcl,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** http.tcl 16 Feb 2005 08:40:40 -0000 1.1.1.1 --- http.tcl 16 Feb 2005 16:45:44 -0000 1.2 *************** *** 1,7 **** # ! # The contents of this file are subject to the AOLserver Public License # Version 1.1 (the "License"); you may not use this file except in # compliance with the License. You may obtain a copy of the License at ! # http://aolserver.com/. # # Software distributed under the License is distributed on an "AS IS" --- 1,7 ---- # ! # The contents of this file are subject to the Mozilla Public License # Version 1.1 (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.mozilla.org/. # # Software distributed under the License is distributed on an "AS IS" Index: sendmail.tcl =================================================================== RCS file: /cvsroot/naviserver/naviserver/tcl/sendmail.tcl,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** sendmail.tcl 16 Feb 2005 08:40:40 -0000 1.1.1.1 --- sendmail.tcl 16 Feb 2005 16:45:45 -0000 1.2 *************** *** 1,7 **** # ! # The contents of this file are subject to the AOLserver Public License # Version 1.1 (the "License"); you may not use this file except in # compliance with the License. You may obtain a copy of the License at ! # http://aolserver.com/. # # Software distributed under the License is distributed on an "AS IS" --- 1,7 ---- # ! # The contents of this file are subject to the Mozilla Public License # Version 1.1 (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.mozilla.org/. # # Software distributed under the License is distributed on an "AS IS" *************** *** 29,44 **** # - # $Header$ - # - - # # sendmail.tcl - Define the ns_sendmail procedure for sending # email from a Tcl script through a remote SMTP server. # ! ! proc _ns_smtp_send {wfp string timeout} { ! if {[lindex [ns_sockselect -timeout $timeout {} $wfp {}] 1] == ""} { ! error "Timeout writing to SMTP host" } puts $wfp $string\r --- 29,40 ---- # # sendmail.tcl - Define the ns_sendmail procedure for sending # email from a Tcl script through a remote SMTP server. # ! proc _ns_smtp_send { mode wfp string timeout} { ! ! if {[lindex [ns_sockselect -timeout $timeout {} $wfp {}] 1] == ""} { ! error "$mode: Timeout writing to SMTP host" } puts $wfp $string\r *************** *** 46,120 **** } ! ! proc _ns_smtp_recv {rfp check timeout} { ! while {1} { ! if {[lindex [ns_sockselect -timeout $timeout $rfp {} {}] 0] == ""} { ! error "Timeout reading from SMTP host" ! } ! set line [gets $rfp] ! set code [string range $line 0 2] ! if {![string match $check $code]} { ! error "Expected a $check status line; got:\n$line" ! } ! if {![string match "-" [string range $line 3 3]]} { ! break; ! } } } ! proc ns_sendmail { to from subject body {extraheaders {}} {bcc {}} } { ! ! ## Takes comma-separated values in the "to" parm ! ## Multiple To and BCC addresses are handled appropriately. ## Original ns_sendmail functionality is preserved. ! ## Cut out carriage returns ! regsub -all "\n" $to "" to ! regsub -all "\r" $to "" to ! regsub -all "\n" $bcc "" bcc ! regsub -all "\r" $bcc "" bcc ! ! ## Split to into a proper list ! set tolist_in [split $to ","] ! set bcclist_in [split $bcc ","] ## Get smtp server into, if none then use localhost set smtp [ns_config ns/parameters smtphost] ! if {[string match "" $smtp]} { ! set smtp [ns_config ns/parameters mailhost] ! } ! if {[string match "" $smtp]} { ! set smtp localhost ! } set timeout [ns_config ns/parameters smtptimeout] ! if {[string match "" $timeout]} { ! set timeout 60 ! } set smtpport [ns_config ns/parameters smtpport] ! if {[string match "" $smtpport]} { ! set smtpport 25 ! } set tolist [list] ! foreach toaddr $tolist_in { ! lappend tolist "[string trim $toaddr]" } set bcclist [list] ! if {![string match "" $bcclist_in]} { ! foreach bccaddr $bcclist_in { ! lappend bcclist "[string trim $bccaddr]" ! } } ## Send it along to _ns_sendmail ! _ns_sendmail $smtp $smtpport $timeout $tolist $bcclist \ ! $from $subject $body $extraheaders } ! ! proc _ns_sendmail {smtp smtpport timeout tolist bcclist \ ! from subject body extraheaders} { ## Put the tolist in the headers --- 42,121 ---- } ! proc _ns_smtp_recv { mode rfp check timeout { error 1 } } { ! ! while (1) { ! if {[lindex [ns_sockselect -timeout $timeout $rfp {} {}] 0] == ""} { ! error "$mode: Timeout reading from SMTP host" ! } ! set line [gets $rfp] ! set code [string range $line 0 2] ! if { ![string match $check $code] } { ! set errmsg "$mode: Expected a $check status line; got:\n$line" ! if { $error } { error $errmsg } ! ns_log Error ns_sendmail: $errmsg ! break ! } ! if ![string match "-" [string range $line 3 3]] { break } } } + proc ns_sendmail { to from subject body {headers {}} {bcc {}} {cc {}} } { ! ## Takes comma-separated values in the "to,cc,bcc" parms ! ## Multiple To,CC and BCC addresses are handled appropriately. ## Original ns_sendmail functionality is preserved. ! ## Read CC/BCC addresses from extra headers if any ! if { $headers != "" } { ! if { [set addr [ns_set iget $headers cc]] != "" } { ! ns_set idelkey $headers cc ! append cc , $addr ! } ! if { [set addr [ns_set iget $headers bcc]] != "" } { ! ns_set idelkey $headers bcc ! append bcc , $addr ! } ! } ## Get smtp server into, if none then use localhost set smtp [ns_config ns/parameters smtphost] ! if [string match "" $smtp] { set smtp [ns_config ns/parameters mailhost] } ! if [string match "" $smtp] { set smtp localhost } set timeout [ns_config ns/parameters smtptimeout] ! if [string match "" $timeout] { set timeout 60 } set smtpport [ns_config ns/parameters smtpport] ! if [string match "" $smtpport] { set smtpport 25 } + ## Extract "from" email address + if [regexp {.*<(.*)>} $from d address] { set from $address } + + ## Prepare to,cc,bcc address lists set tolist [list] ! regsub -all {[\n\r ]} $to {} to ! foreach addr [split $to ,] { ! if { [regexp {.*<(.*)>} $addr d address] } { set addr $address } ! if { [set addr [string trim $addr]] != "" } { lappend tolist $addr } ! } ! ! set cclist [list] ! regsub -all {[\n\r ]} $cc {} cc ! foreach addr [split $cc ,] { ! if { [regexp {.*<(.*)>} $addr d address] } { set addr $address } ! if { [set addr [string trim $addr]] != "" } { lappend cclist $addr } } set bcclist [list] ! regsub -all {[\n\r ]} $bcc {} bcc ! foreach addr [split $bcc ,] { ! if { [regexp {.*<(.*)>} $addr d address] } { set addr $address } ! if { [set addr [string trim $addr]] != "" } { lappend bcclist $addr } } ## Send it along to _ns_sendmail ! _ns_sendmail $smtp $smtpport $timeout $tolist $cclist $bcclist \ ! $from $subject $body $headers } ! proc _ns_sendmail {smtp smtpport timeout tolist cclist bcclist from subject body headers} { ## Put the tolist in the headers *************** *** 122,145 **** ## Build headers ! set msg "To: $rfcto\nFrom: $from\nSubject: $subject\nDate: [ns_httptime [ns_time]]" ! ## Insert extra headers, if any (not for BCC) ! if {![string match "" $extraheaders]} { ! set size [ns_set size $extraheaders] ! for {set i 0} {$i < $size} {incr i} { ! append msg "\n[ns_set key $extraheaders $i]: [ns_set value $extraheaders $i]" ! } } ## Blank line between headers and body ! append msg "\n\n$body\n" ## Terminate body with a solitary period foreach line [split $msg "\n"] { ! if {[string match . $line]} { ! append data . ! } ! append data $line ! append data "\r\n" } append data . --- 123,147 ---- ## Build headers ! set msg "To: $rfcto\nFrom: $from\nSubject: $subject\nDate: [ns_httptime [ns_time]]\n" ! ! ## CC recipients in separate header ! if { $cclist != "" } { append msg "Cc: [join $cclist ","]\n" } ! ## Insert extra headers, if any (not for BCC) ! if { $headers != "" } { ! set size [ns_set size $headers] ! for {set i 0} {$i < $size} {incr i} { ! append msg "[ns_set key $headers $i]: [ns_set value $headers $i]\n" ! } } ## Blank line between headers and body ! append msg "\n$body\n" ## Terminate body with a solitary period foreach line [split $msg "\n"] { ! if { [string match . $line] } { append data . } ! append data $line ! append data "\r\n" } append data . *************** *** 149,184 **** set rfp [lindex $sock 0] set wfp [lindex $sock 1] - - ## Strip "from:" email address - regexp {.*<(.*)>} $from ig from ## Perform the SMTP conversation if { [catch { ! _ns_smtp_recv $rfp 220 $timeout ! _ns_smtp_send $wfp "HELO [ns_info hostname]" $timeout ! _ns_smtp_recv $rfp 250 $timeout ! _ns_smtp_send $wfp "MAIL FROM:<$from>" $timeout ! _ns_smtp_recv $rfp 250 $timeout ! ## Loop through To and BCC list via multiple RCPT TO lines ! ## A BCC should never, ever appear in the header ! foreach toto [concat $tolist $bcclist] { ! #transform "Fritz <fr...@fo...>" into "fr...@fo..." ! regexp {.*<(.*)>} $toto ig toto ! _ns_smtp_send $wfp "RCPT TO:<$toto>" $timeout ! _ns_smtp_recv $rfp 250 $timeout ! } ! _ns_smtp_send $wfp DATA $timeout ! _ns_smtp_recv $rfp 354 $timeout ! _ns_smtp_send $wfp $data $timeout ! _ns_smtp_recv $rfp 250 $timeout ! _ns_smtp_send $wfp QUIT $timeout ! _ns_smtp_recv $rfp 221 $timeout } errMsg ] } { ! ## Error, close and report ! close $rfp ! close $wfp ! return -code error $errMsg } --- 151,196 ---- set rfp [lindex $sock 0] set wfp [lindex $sock 1] ## Perform the SMTP conversation if { [catch { ! _ns_smtp_recv "Start" $rfp 220 $timeout ! _ns_smtp_send "Helo" $wfp "HELO [ns_info hostname]" $timeout ! _ns_smtp_recv "Helo" $rfp 250 $timeout ! _ns_smtp_send "Mail $from" $wfp "MAIL FROM:<$from>" $timeout ! _ns_smtp_recv "Mail $from" $rfp 250 $timeout ! ## Loop through To list via multiple RCPT TO lines ! foreach to $tolist { ! if { $to == "" } { continue } ! _ns_smtp_send "Rcpt $to" $wfp "RCPT TO:<$to>" $timeout ! _ns_smtp_recv "Rcpt $to" $rfp 250 $timeout 0 ! } ! ! ## Loop through CC list via multiple RCPT TO lines ! foreach to $cclist { ! if { $to == "" } { continue } ! _ns_smtp_send "Rcpt $to" $wfp "RCPT TO:<$to>" $timeout ! _ns_smtp_recv "Rcpt $to" $rfp 250 $timeout 0 ! } ! ## Loop through BCC list via multiple RCPT TO lines ! ## A BCC should never, ever appear in the header. Ever. Not even. ! foreach to $bcclist { ! if { $to == "" } { continue } ! _ns_smtp_send "Rcpt $to" $wfp "RCPT TO:<$to>" $timeout ! _ns_smtp_recv "Rcpt $to" $rfp 250 $timeout 0 ! } ! ! _ns_smtp_send Data $wfp DATA $timeout ! _ns_smtp_recv Data $rfp 354 $timeout ! _ns_smtp_send Data $wfp $data $timeout ! _ns_smtp_recv Data $rfp 250 $timeout ! _ns_smtp_send Quit $wfp QUIT $timeout ! _ns_smtp_recv Quit $rfp 221 $timeout 0 } errMsg ] } { ! ## Error, close and report ! close $rfp ! close $wfp ! return -code error $errMsg } Index: init.tcl =================================================================== RCS file: /cvsroot/naviserver/naviserver/tcl/init.tcl,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** init.tcl 16 Feb 2005 08:40:42 -0000 1.1.1.1 --- init.tcl 16 Feb 2005 16:45:45 -0000 1.2 *************** *** 1,7 **** # ! # The contents of this file are subject to the AOLserver Public License # Version 1.1 (the "License"); you may not use this file except in # compliance with the License. You may obtain a copy of the License at ! # http://aolserver.com/. # # Software distributed under the License is distributed on an "AS IS" --- 1,7 ---- # ! # The contents of this file are subject to the Mozilla Public License # Version 1.1 (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.mozilla.org/. # # Software distributed under the License is distributed on an "AS IS" Index: debug.tcl =================================================================== RCS file: /cvsroot/naviserver/naviserver/tcl/debug.tcl,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** debug.tcl 16 Feb 2005 08:40:40 -0000 1.1.1.1 --- debug.tcl 16 Feb 2005 16:45:44 -0000 1.2 *************** *** 1,7 **** # ! # The contents of this file are subject to the AOLserver Public License # Version 1.1 (the "License"); you may not use this file except in # compliance with the License. You may obtain a copy of the License at ! # http://aolserver.com/. # # Software distributed under the License is distributed on an "AS IS" --- 1,7 ---- # ! # The contents of this file are subject to the Mozilla Public License # Version 1.1 (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.mozilla.org/. # # Software distributed under the License is distributed on an "AS IS" |