emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] Add parser for Netscape/Mozilla cookie file format


From: Aurelien Aptel
Subject: [PATCH] Add parser for Netscape/Mozilla cookie file format
Date: Fri, 6 Oct 2017 16:34:48 +0200

* lisp/url/url-cookie.el (url-cookie-parse-file-netscape): New function.
---
 lisp/url/url-cookie.el | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 49 insertions(+)

diff --git a/lisp/url/url-cookie.el b/lisp/url/url-cookie.el
index 453d4fe5b6..b0dc40475b 100644
--- a/lisp/url/url-cookie.el
+++ b/lisp/url/url-cookie.el
@@ -74,6 +74,55 @@ url-cookie-parse-file
   ;; It's completely normal for the cookies file not to exist yet.
   (load (or fname url-cookie-file) t t))
 
+(defun url-cookie-parse-file-netscape (filename &optional long-session)
+  "Load cookies from FILENAME in Netscape/Mozilla format.
+When LONG-SESSION is non-nil, session cookies (expiring at t=0
+i.e. 1970-1-1) are loaded as expiring one year from now instead."
+  (interactive "fLoad Netscape/Mozilla cookie file: ")
+  (let ((n 0))
+    (with-temp-buffer
+      (insert-file-contents-literally filename)
+      (goto-char (point-min))
+      (when (not (looking-at-p "# Netscape HTTP Cookie File\n"))
+       (error (format "File %s doesn't look like a netscape cookie file" 
filename)))
+      (while (not (eobp))
+       (when (not (looking-at-p (rx bol (* space) "#")))
+         (let* ((line (buffer-substring (point) (save-excursion (end-of-line) 
(point))))
+                (fields (split-string line "\t")))
+           (cond
+            ;;((>= 1 (length line) 0)
+            ;; (message "skipping empty line"))
+            ((= (length fields) 7)
+             (let ((dom (nth 0 fields))
+                   (match (nth 1 fields))
+                   (path (nth 2 fields))
+                   (secure (string= (nth 3 fields) "TRUE"))
+                   ;; session cookies (expire time = 0) are supposed
+                   ;; to be removed when the browser is closed, but
+                   ;; the main point of loading external cookie is to
+                   ;; reuse a browser session, so to prevent the
+                   ;; cookie from being detected as expired straight
+                   ;; away, make it expire a year from now
+                   (expires (format-time-string
+                             "%d %b %Y %T [GMT]"
+                             (seconds-to-time
+                              (let ((s (string-to-number (nth 4 fields))))
+                                (if (and (= s 0) long-session)
+                                    (seconds-to-time (+ (* 365 24 60 60) 
(float-time)))
+                                  s)))))
+                   (key (nth 5 fields))
+                   (val (nth 6 fields)))
+               (incf n)
+               ;;(message "adding <%s>=<%s> exp=<%s> dom=<%s> path=<%s> 
sec=%S" key val expires dom path secure)
+               (url-cookie-store key val expires dom path secure)
+               ))
+            (t
+             (message "ignoring malformed cookie line <%s>" line)))))
+       (forward-line))
+      (when (< 0 n)
+       (setq url-cookies-changed-since-last-save t))
+      (message "added %d cookies from file %s" n filename))))
+
 (defun url-cookie-clean-up (&optional secure)
   (let ((var (if secure 'url-cookie-secure-storage 'url-cookie-storage))
        new new-cookies)
-- 
2.12.3




reply via email to

[Prev in Thread] Current Thread [Next in Thread]