]> code.delx.au - gnu-emacs/blobdiff - lisp/url/url-cookie.el
Update copyright year to 2015
[gnu-emacs] / lisp / url / url-cookie.el
index 84200d1d41b93e4972862c295747f771b35ecdf9..ccb2606c52899b9fc257468584c3b90cb7ea9489 100644 (file)
@@ -1,6 +1,6 @@
 ;;; url-cookie.el --- URL cookie support
 
-;; Copyright (C) 1996-1999, 2004-201 Free Software Foundation, Inc.
+;; Copyright (C) 1996-1999, 2004-2015 Free Software Foundation, Inc.
 
 ;; Keywords: comm, data, processes, hypermedia
 
@@ -158,7 +158,9 @@ telling Microsoft that."
   "Return non-nil if COOKIE is expired."
   (let ((exp (url-cookie-expires cookie)))
     (and (> (length exp) 0)
-        (> (float-time) (float-time (date-to-time exp))))))
+        (condition-case ()
+            (> (float-time) (float-time (date-to-time exp)))
+          (error nil)))))
 
 (defun url-cookie-retrieve (host &optional localpart secure)
   "Retrieve all cookies for a specified HOST and LOCALPART."
@@ -349,6 +351,95 @@ to run the `url-cookie-setup-save-timer' function manually."
                                          url-cookie-save-interval
                                          #'url-cookie-write-file))))
 
+;;; Mode for listing and editing cookies.
+
+(defun url-cookie-list ()
+  "Display a buffer listing the current URL cookies, if there are any.
+Use \\<url-cookie-mode-map>\\\[url-cookie-delete] to remove cookies."
+  (interactive)
+  (when (and (null url-cookie-secure-storage)
+            (null url-cookie-storage))
+    (error "No cookies are defined"))
+
+  (pop-to-buffer "*url cookies*")
+  (let ((inhibit-read-only t)
+       (domains (sort
+                 (copy-sequence
+                  (append url-cookie-secure-storage
+                          url-cookie-storage))
+                 (lambda (e1 e2)
+                   (string< (car e1) (car e2)))))
+       (domain-length 0)
+       start name format domain)
+    (erase-buffer)
+    (url-cookie-mode)
+    (dolist (elem domains)
+      (setq domain-length (max domain-length (length (car elem)))))
+    (setq format (format "%%-%ds %%-20s %%s" domain-length)
+         header-line-format
+         (concat " " (format format "Domain" "Name" "Value")))
+    (dolist (elem domains)
+      (setq domain (car elem))
+      (dolist (cookie (sort (copy-sequence (cdr elem))
+                           (lambda (c1 c2)
+                             (string< (url-cookie-name c1)
+                                      (url-cookie-name c2)))))
+       (setq start (point)
+             name (url-cookie-name cookie))
+       (when (> (length name) 20)
+         (setq name (substring name 0 20)))
+       (insert (format format domain name
+                       (url-cookie-value cookie))
+               "\n")
+       (setq domain "")
+       (put-text-property start (1+ start) 'url-cookie cookie)))
+    (goto-char (point-min))))
+
+(defun url-cookie-delete ()
+  "Delete the cookie on the current line."
+  (interactive)
+  (let ((cookie (get-text-property (line-beginning-position) 'url-cookie))
+       (inhibit-read-only t)
+       variable)
+    (unless cookie
+      (error "No cookie on the current line"))
+    (setq variable (if (url-cookie-secure cookie)
+                      'url-cookie-secure-storage
+                    'url-cookie-storage))
+    (let* ((list (symbol-value variable))
+          (elem (assoc (url-cookie-domain cookie) list)))
+      (setq elem (delq cookie elem))
+      (when (zerop (length (cdr elem)))
+       (setq list (delq elem list)))
+      (set variable list))
+    (setq url-cookies-changed-since-last-save t)
+    (url-cookie-write-file)
+    (delete-region (line-beginning-position)
+                  (progn
+                    (forward-line 1)
+                    (point)))))
+
+(defun url-cookie-quit ()
+  "Kill the current buffer."
+  (interactive)
+  (kill-buffer (current-buffer)))
+
+(defvar url-cookie-mode-map
+  (let ((map (make-sparse-keymap)))
+    (suppress-keymap map)
+    (define-key map "q" 'url-cookie-quit)
+    (define-key map [delete] 'url-cookie-delete)
+    (define-key map [(control k)] 'url-cookie-delete)
+    map))
+
+(define-derived-mode url-cookie-mode nil "URL Cookie"
+  "Mode for listing cookies.
+
+\\{url-cookie-mode-map}"
+  (buffer-disable-undo)
+  (setq buffer-read-only t
+       truncate-lines t))
+
 (provide 'url-cookie)
 
 ;;; url-cookie.el ends here