diff --git a/org-ql-view.el b/org-ql-view.el index 525642d..8eb914a 100644 --- a/org-ql-view.el +++ b/org-ql-view.el @@ -98,6 +98,23 @@ Based on `org-agenda-mode-map'.") "Options for `org-ql-view'." :group 'org-ql) +(defcustom org-ql-view-ask-unsafe-links t + "Ask before opening a link that could run arbitrary code. +Org QL queries in sexp form can contain arbitrary expressions. +When opening an \"org-ql-search:\" link that contains a query in +sexp form, and this option is non-nil, the user will be prompted +for confirmation before opening the link. + +This variable may be set file-locally to disable this warning in +files that the user assumes are safe (e.g. of known provenance). +Users who are entirely unconcerned about this issue may disable +the option globally (at their own risk, however minimal it +probably is). + +See Info node `(org-ql)Queries'." + :type 'boolean + :risky t) + (defcustom org-ql-view-display-buffer-action nil "Action argument passed through `pop-to-buffer' to `display-buffer', which see." :type '(cons function alist)) @@ -600,6 +617,18 @@ protocol. See, e.g. `org-ql-view--link-store'." (read it))) (buffers-files (--when-let (alist-get "buffers-files" params nil nil #'string=) (read it)))) + (when (and org-ql-view-ask-unsafe-links + (or (string-match (rx bol (0+ space) "(") query) + (listp query))) + ;; Query is in sexp form: ask for confirmation, because it could contain arbitrary code. + (let ((query-string (propertize (cl-etypecase query + (list (prin1-to-string query)) + (string query)) + ;; FIXME: The face doesn't seem to be displayed. + 'face 'font-lock-warning-face))) + (unless (yes-or-no-p (concat "Query is in sexp form and could contain arbitrary code: " + query-string " Execute it? ")) + (user-error "Query aborted by user")))) (org-ql-search buffers-files query :sort sort :super-groups groups