Subject: bug#35969: 26.2, Excorporate

From: Collin Day <[email-masked]>
Date: Wed, 10 Jul 2019 09:35:34 -0600

When I add your patch, there is still an error:

Contacting host: outlook.office365.com:443
error in process filter: exco--parse-xml-in-current-buffer: Server
response is not an XML document
error in process filter: Server response is not an XML document

* http outlook,office365.com:443*
HTTP/1.1 401 Unauthorized
Server: Microsoft-IIS/10.0
request-id: 33a1707c-bed3-4edd-98c6-bd1443827acf
X-WSSecurity-Enabled: True
X-WSSecurity-For: Logon
X-FederationTrustTokenIssuerUri: urn:federation:MicrosoftOnline
X-WSSecurity-SymmetricKey-Enabled: True
X-WSSecurity-X509Cert-Enabled: True
X-OAuth-Enabled: True
X-Powered-By: ASP.NET
X-FEServer: SN4PR0601CA0013
WWW-Authenticate: Basic Realm=""
Date: Wed, 10 Jul 2019 15:27:49 GMT
Content-Length: 0

URL-DEBUG
http -> Contacting host: outlook.office365.com:443
http -> Marking connection as busy: outlook.office365.com:443
#<process outlook.office365.com>
http -> getting referer from buffer: buffer:#<buffer *scratch*>
target-url:#s(url "https" nil nil "outlook.office365.com" nil
"/EWS/Services.wsdl" nil nil t nil t t) lastloc:nil
http -> Calling after change function
`url-https-proxy-after-change-function' for `#<process
outlook.office365.com>'
http -> url-http-parse-response called in ( *http outlook.office365.com:443*)
http -> Request is:
GET /EWS/Services.wsdl HTTP/1.1
MIME-Version: 1.0
Connection: keep-alive
Extension: Security/Digest Security/SSL
Host: outlook.office365.com
Accept-encoding: gzip
Accept: */*
User-Agent: URL/Emacs Emacs/27.0.50 (X11; x86_64-pc-linux-gnu)

http -> Calling after change function
`url-http-wait-for-headers-change-function' for `#<process
outlook.office365.com>'
http -> url-http-wait-for-headers-change-function ( *http
outlook.office365.com:443*)
http -> Saw end of headers... ( *http outlook.office365.com:443*)
http -> url-http-parse-response called in ( *http outlook.office365.com:443*)
http -> Got a content-length, being smart about document end.
http -> Got 0-length content-length, activating callback immediately.
http -> Marking connection as free: outlook.office365.com:443
#<process outlook.office365.com>
http -> url-http-parse-headers called in ( *http outlook.office365.com:443*)
http -> url-http-parse-response called in ( *http outlook.office365.com:443*)
http -> Parsed HTTP headers: class=4 status=401
http -> Handling normal authentication
http -> Found existing connection: outlook.office365.com:443 #<process
outlook.office365.com>
http -> Reusing existing connection: outlook.office365.com:443
http -> Marking connection as busy: outlook.office365.com:443
#<process outlook.office365.com>
http -> getting referer from buffer: buffer:#<buffer  *http
outlook.office365.com:443*> target-url:#s(url "https" nil nil
"outlook.office365.com" nil "/EWS/Services.wsdl" nil nil t nil t t)
lastloc:nil
http -> Finished parsing HTTP headers: nil
http -> Spinning waiting for headers...
http -> Calling after change function
`url-https-proxy-after-change-function' for `#<process
outlook.office365.com>'
http -> url-http-parse-response called in ( *http
outlook.office365.com:443*-293116)
http -> error response: 400
http -> Marking connection as free: outlook.office365.com:443
#<process outlook.office365.com>
http -> Activating callback in buffer ( *http
outlook.office365.com:443*-293116): #[257
"p\303\304\305\306\307 !\310\"\311$\216
@\312=\203$\0\313\301\314\315\316\302\"#\210\317\300\320\"\202/\0\313\301\321\322
#\210\317\300\323\")\207" [fsm-exco--fsm-0 (:identifier ("my email" .
"https://outlook.office365.com/EWS/Exchange.asmx") :mail-address "my
email" :retrying nil :autodiscovery-urls nil :service-url
"https://outlook.office365.com/EWS/Exchange.asmx" :service-xml nil
:service-wsdl nil :next-state-after-success nil :failure-message nil
:server-version nil) "https://outlook.office365.com/EWS/Services.wsdl"
make-byte-code 0 "\301\300!\205    \0\302\300!\207" vconcat vector
[buffer-live-p kill-buffer] 2 :error plist-put :failure-message format
"Failed to retrieve %s" fsm-send :unrecoverable-error :service-xml
exco--parse-xml-in-current-buffer :success] 8 "

(fn STATUS)"] ((:peer (:certificates ((:version 3 :serial-number
"0b:be:0b:85:09:74:2b:7b:f8:7f:80:dc:14:67:6d:54" :issuer
"C=US,O=DigiCert Inc,CN=DigiCert Cloud Services CA-1" :valid-from
"2018-11-19" :valid-to "2020-11-19" :subject
"C=US,ST=Washington,L=Redmond,O=Microsoft Corporation,CN=outlook.com"
:public-key-algorithm "RSA" :certificate-security-level "Medium"
:signature-algorithm "RSA-SHA256" :public-key-id
"sha1:35:1a:fe:e2:6c:d9:35:08:3c:95:a2:c1:12:a1:2a:8e:7f:87:fa:07"
:certificate-id
"sha1:9a:44:16:e2:84:8e:3d:26:86:f0:23:a2:ff:f2:d0:24:28:2f:18:8f")
(:version 3 :serial-number
"01:9e:c1:c6:bd:3f:59:7b:b2:0c:33:38:e5:51:d8:77" :issuer
"C=US,O=DigiCert Inc,OU=www.digicert.com,CN=DigiCert Global Root CA"
:valid-from "2015-08-04" :valid-to "2030-08-04" :subject
"C=US,O=DigiCert Inc,CN=DigiCert Cloud Services CA-1"
:public-key-algorithm "RSA" :certificate-security-level "Medium"
:signature-algorithm "RSA-SHA256" :public-key-id
"sha1:ac:13:d5:79:03:66:f3:cc:ff:fe:7c:23:71:a7:61:5d:39:20:89:6e"
:certificate-id
"sha1:81:b6:8d:6c:d2:f2:21:f8:f5:34:e6:77:52:3b:b2:36:bb:a1:dc:56"))
:certificate (:version 3 :serial-number
"0b:be:0b:85:09:74:2b:7b:f8:7f:80:dc:14:67:6d:54" :issuer
"C=US,O=DigiCert Inc,CN=DigiCert Cloud Services CA-1" :valid-from
"2018-11-19" :valid-to "2020-11-19" :subject
"C=US,ST=Washington,L=Redmond,O=Microsoft Corporation,CN=outlook.com"
:public-key-algorithm "RSA" :certificate-security-level "Medium"
:signature-algorithm "RSA-SHA256" :public-key-id
"sha1:35:1a:fe:e2:6c:d9:35:08:3c:95:a2:c1:12:a1:2a:8e:7f:87:fa:07"
:certificate-id
"sha1:9a:44:16:e2:84:8e:3d:26:86:f0:23:a2:ff:f2:d0:24:28:2f:18:8f")
:key-exchange "ECDHE-RSA" :protocol "TLS1.2" :cipher "AES-256-GCM"
:mac "AEAD")))

url-http.el with patch from describe function, just to make sure patch
is applied:
   ...
    (setq request
          (concat
             ;; The request
             (or url-http-method "GET") " "
             (url-http--encode-string
             ;; (if using-proxy (url-recreate-url url-http-target-url)
real-fname))
             (if (and using-proxy
                 (not (equal "https" (url-type url-http-target-url))))
                 (url-recreate-url url-http-target-url)
              real-fname))
             " HTTP/" url-http-version "\r\n"
    ...

output from make:
make[2]: Entering directory '/home/dayd/projects/emacs/lisp'
  ELC      url/url-http.elc

Sorry if the extra info is extraneous, just trying to grab as much as
I can for you.  I think there is something else wrong at this point
though - like I mentioned it seems strange I had to run
package-install 4 times to get excorporate to install in the first
place.

Thanks!
-C

On Tue, Jul 9, 2019 at 6:11 PM Thomas Fitzsimmons <[email-masked]> wrote:
>
> I think there should be no need to remove test-home, so you won't have
> to re-run the M-x package-install steps.
>
> Thomas
>
> Thomas Fitzsimmons <[email-masked]> writes:
>
> > OK, can you apply my patch, then run "make" again and confirm it works?
> >
> > Thanks,
> > Thomas
> >
> > Collin Day <[email-masked]> writes:
> >
> >> Did a git pull and followed instructions above.
> >>
> >> There are some issues.  First, I need to run M-x package-install <RET>
> >> excorporate <RET>  four times because I see (each line after each
> >> invocation)
> >>
> >> package--with-response-buffer-1:
> >> https://elpa.gnu.org/packages/url-http-ntlm-2.0.4.el: Method not
> >> allowed
> >> package--with-response-buffer-1:
> >> https://elpa.gnu.org/packages/fsm-0.2.1.el: Method not allowed
> >> package--with-response-buffer-1:
> >> https://elpa.gnu.org/packages/excorporate-0.8.3.tar: Method not
> >> allowed
> >>
> >> After the 4th call it compiles and becomes available.
> >>
> >> M-x customize-group <RET> excorporate, set up for no autoconfig right
> >> now, hit apply for current sessions, save not availiable....
> >>
> >> M-x excorporate <RET>
> >>
> >> enter uname and password
> >>
> >> Contacting host: outlook.office365.com:443
> >> error in process filter: exco--parse-xml-in-current-buffer: Server
> >> response is not an XML document
> >> error in process filter: Server response is not an XML documen
> >>
> >> *http outlook.office.365.com:443*
> >
> > [...]
> >
> >> So it appears not to work, at least on the current head as of today....
> >>
> >> Thanks!
> >>
> >> -C
> >>
> >> On Tue, Jul 9, 2019 at 4:09 PM Collin Day <[email-masked]> wrote:
> >>>
> >>> Sorry, I have not had the chance to.  A lot has been going on at my
> >>> place of employment.  It has crossed my mind, and as soon as I have
> >>> a chance, I will try what you suggested above.  Thanks, sorry for
> >>> the inconvenience.
> >>>
> >>> On Tue, Jul 9, 2019, 3:53 PM Thomas Fitzsimmons <[email-masked]> wrote:
> >>>>
> >>>> Hi,
> >>>>
> >>>> Were you able to complete building Emacs?  I'd like to know if my patch
> >>>> is needed on top of Andreas's to make Excorporate work through your
> >>>> proxy.
> >>>>
> >>>> I'm not sure why the built version would interfere with the current
> >>>> installation.  If you were doing "make install" to a common prefix, that
> >>>> might explain it.  Instead you can try something like this:
> >>>>
> >>>> cd emacs-master [your github.com checkout]
> >>>> make
> >>>> mkdir test-home
> >>>> HOME=`pwd`/test-home ./src/emacs -Q
> >>>>
> >>>> That will ensure you're only running the built Emacs, and completely
> >>>> ignoring the packages installed in your home directory.
> >>>>
> >>>> Thomas
> >>>>
> >>>> "tenspd137 ." <[email-masked]> writes:
> >>>>
> >>>> > I haven't tried the first item on the list yet - ie reloading Andreas'
> >>>> > function.  i have tried to build emacs from
> >>>> > https://github.com/emacs-mirror/emacs.git because I can't reach the
> >>>> > official repo from my firewall for whatever reason.  I am sure it is
> >>>> > something here.  Anyway, I was having problems because my built
> >>>> > version (27.0.x) was getting seemingly mixed up with my current
> >>>> > installation.  I can try again later, but right now things are pretty
> >>>> > busy at work.
> >>>> >
> >>>> > Thanks.
> >>>> >
> >>>> > On Tue, Jun 18, 2019 at 10:26 PM Thomas Fitzsimmons <[email-masked]> wrote:
> >>>> >>
> >>>> >> Hi,
> >>>> >>
> >>>> >> "tenspd137 ." <[email-masked]> writes:
> >>>> >>
> >>>> >> > So - I am not sure if I did it correctly, but I copied this function
> >>>> >> > with Andreas' changes into a file:
> >>>> >> >
> >>>> >> > (defun url-https-proxy-after-change-function (_st _nd _length)
> >>>> >> >   (let* ((process-buffer (current-buffer))
> >>>> >> >          (proc (get-buffer-process process-buffer)))
> >>>> >> >     (goto-char (point-min))
> >>>> >> >     (when (re-search-forward "^\r?\n" nil t)
> >>>> >> >       (backward-char 1)
> >>>> >> >       ;; Saw the end of the headers
> >>>> >> >       (setq url-http-end-of-headers (set-marker (make-marker) (point)))
> >>>> >> >       (url-http-parse-response)
> >>>> >> >       (cond
> >>>> >> >        ((null url-http-response-status)
> >>>> >> >         ;; We got back a headerless malformed response from the
> >>>> >> >         ;; server.
> >>>> >> >         (url-http-activate-callback)
> >>>> >> >         (error "Malformed response from proxy, fail!"))
> >>>> >> >        ((= url-http-response-status 200)
> >>>> >> >         (if (gnutls-available-p)
> >>>> >> >             (condition-case e
> >>>> >> >                 (let ((tls-connection (gnutls-negotiate
> >>>> >> >                                        :process proc
> >>>> >> >                                        :hostname (url-host url-current-object)
> >>>> >> >                                        :verify-error nil)))
> >>>> >> >                   ;; check certificate validity
> >>>> >> >                   (setq tls-connection
> >>>> >> >                         (nsm-verify-connection tls-connection
> >>>> >> >                                                (url-host url-current-object)
> >>>> >> >                                                (url-port url-current-object)))
> >>>> >> >                   (with-current-buffer process-buffer (erase-buffer))
> >>>> >> >                   (set-process-buffer tls-connection process-buffer)
> >>>> >> >                   (setq url-http-after-change-function
> >>>> >> >                         'url-http-wait-for-headers-change-function)
> >>>> >> >                   (set-process-filter tls-connection 'url-http-generic-filter)
> >>>> >> >                   (process-send-string tls-connection
> >>>> >> >                                        ;; Use the non-proxy form of the request
> >>>> >> >                                        (let (url-http-proxy)
> >>>> >> >                                          (url-http-create-request))))
> >>>> >> >               (gnutls-error
> >>>> >> >                (url-http-activate-callback)
> >>>> >> >                (error "gnutls-error: %s" e))
> >>>> >> >               (error
> >>>> >> >                (url-http-activate-callback)
> >>>> >> >                (error "error: %s" e)))
> >>>> >> >           (error "error: gnutls support needed!")))
> >>>> >> >        (t
> >>>> >> >         (url-http-debug "error response: %d" url-http-response-status)
> >>>> >> >         (url-http-activate-callback))))))
> >>>> >> >
> >>>> >> > and then loaded it before running excorporate.  After that, I did M-x
> >>>> >> > excorporate, and the minibuffer returns:  error in process filter:
> >>>> >> > Server response is not an XML document
> >>>> >>
> >>>> >> In this scenario, if you immediately (without restarting Emacs/reloading
> >>>> >> anything) re-run M-x excorporate does it still fail?  I just want to
> >>>> >> make sure that's not a transient failure.  If it does fail the second
> >>>> >> time, can you post the HTTP response from the server?
> >>>> >>
> >>>> >> > When I do the similar test by loading the url-http-create-request with
> >>>> >> > Thomas's changes, I can get a connection and grab my schedule
> >>>> >> > through the proxy.
> >>>> >>
> >>>> >> OK.
> >>>> >>
> >>>> >> > Let me know if I need to try something different.
> >>>> >>
> >>>> >> Are you in a position to build Emacs master tip and retry the experiment
> >>>> >> without patching anything?
> >>>> >>
> >>>> >> Thanks,
> >>>> >> Thomas
> >>>> >>
> >>>> >> > On Mon, Jun 17, 2019 at 4:08 PM Thomas Fitzsimmons <[email-masked]> wrote:
> >>>> >> >>
> >>>> >> >> Hi,
> >>>> >> >>
> >>>> >> >> Good to hear that the patch I posted worked!
> >>>> >> >>
> >>>> >> >> Yes, that's the patch that Andreas's commit
> >>>> >> >> 84613dae5c34ea742dd9a3e56f5acb55f604b483 applied.  From what I can tell,
> >>>> >> >> you will not have that in Emacs 26.2.
> >>>> >> >>
> >>>> >> >> Can you try reverting my patch and applying Andreas's patch, and see if
> >>>> >> >> Excorporate still works through the proxy?
> >>>> >> >>
> >>>> >> >> Thanks,
> >>>> >> >> Thomas
> >>>> >> >>
> >>>> >> >> "tenspd137 ." <[email-masked]> writes:
> >>>> >> >>
> >>>> >> >> > The patch Thomas seems to work from behind the proxy.  My current
> >>>> >> >> > emacs version is 26.2, so I would think it would include the commit
> >>>> >> >> > Andreas is talking about....  I went and looked it up - is this the
> >>>> >> >> > correct commit?
> >>>> >> >> >
> >>>> >> >> > diff --git a/lisp/url/url-http.el b/lisp/url/url-http.el
> >>>> >> >> > index 53798f7..817c5ce 100644
> >>>> >> >> > --- a/lisp/url/url-http.el
> >>>> >> >> > +++ b/lisp/url/url-http.el
> >>>> >> >> > @@ -1412,7 +1412,9 @@ The return value of this function is the
> >>>> >> >> > retrieval buffer."
> >>>> >> >> > 'url-http-wait-for-headers-change-function)
> >>>> >> >> > (set-process-filter tls-connection 'url-http-generic-filter)
> >>>> >> >> > (process-send-string tls-connection
> >>>> >> >> > - (url-http-create-request)))
> >>>> >> >> > + ;; Use the non-proxy form of the request
> >>>> >> >> > + (let (url-http-proxy)
> >>>> >> >> > + (url-http-create-request))))
> >>>> >> >> > (gnutls-error
> >>>> >> >> > (url-http-activate-callback)
> >>>> >> >> > (error "gnutls-error: %s" e))
> >>>> >> >> >
> >>>> >> >> > Thanks!
> >>>> >> >> >
> >>>> >> >> > -C
> >>>> >> >> >
> >>>> >> >> >
> >>>> >> >> > On Sat, Jun 15, 2019 at 1:41 AM Andreas Schwab <[email-masked]> wrote:
> >>>> >> >> >>
> >>>> >> >> >> On Jun 14 2019, Thomas Fitzsimmons <[email-masked]> wrote:
> >>>> >> >> >>
> >>>> >> >> >> > diff --git a/lisp/url/url-http.el b/lisp/url/url-http.el
> >>>> >> >> >> > index 00803a103a..723d111d58 100644
> >>>> >> >> >> > --- a/lisp/url/url-http.el
> >>>> >> >> >> > +++ b/lisp/url/url-http.el
> >>>> >> >> >> > @@ -329,7 +329,10 @@ url-http-create-request
> >>>> >> >> >> >               ;; The request
> >>>> >> >> >> >               (or url-http-method "GET") " "
> >>>> >> >> >> >               (url-http--encode-string
> >>>> >> >> >> > -              (if using-proxy (url-recreate-url url-http-target-url) real-fname))
> >>>> >> >> >> > +              (if (and using-proxy
> >>>> >> >> >> > +                       (not (equal "https" (url-type url-http-target-url))))
> >>>> >> >> >> > +                  (url-recreate-url url-http-target-url)
> >>>> >> >> >> > +                real-fname))
> >>>> >> >> >>
> >>>> >> >> >> That should already be handled by commit 84613dae5c.
> >>>> >> >> >>
> >>>> >> >> >> Andreas.
> >>>> >> >> >>
> >>>> >> >> >> --
> >>>> >> >> >> Andreas Schwab, [email-masked]
> >>>> >> >> >> GPG Key fingerprint = 7578 EB47 D4E5 4D69 2510  2552 DF73 E780 A9DA AEC1
> >>>> >> >> >> "And now for something completely different."