Package: calibre
Version: 3.33.1+dfsg-1
Severity: normal
File: /usr/bin/calibre-server

I was trying to run calibre-server in a readonly sandbox that didn't
actually have write permissions to my library for security reasons.

So I create a separate user (adduser --disabled-password
calibre-sandbox), sudo'd to that user, and called:

    calibre-server --enable-auth /srv/books/ --disable-local-write

The first problem was this:

calibre server listening on 0.0.0.0:8080
OPDS feeds advertised via BonJour at: 192.168.0.3 port: 8080
Failed login attempt from: 192.168.0.7
Unhandled exception in state: State: _job_done Client: 192.168.0.7:59050 
Request: GET /interface-data/init?1541644405904 HTTP/1.1
Traceback (most recent call last):
  File "/usr/lib/calibre/calibre/srv/loop.py", line 569, in tick
    conn.handle_event(event)
  File "/usr/lib/calibre/calibre/srv/loop.py", line 307, in _job_done
    self.job_done(*event)
  File "/usr/lib/calibre/calibre/srv/pool.py", line 35, in run
    result = func()
  File "/usr/lib/calibre/calibre/srv/http_response.py", line 441, in 
run_request_handler
    result = self.request_handler(data)
  File "/usr/lib/calibre/calibre/srv/routes.py", line 313, in dispatch
    ans = endpoint_(self.ctx, data, *args)
  File "/usr/lib/calibre/calibre/srv/code.py", line 257, in interface_data
    ans['library_id'], db, sorts, orders, vl = get_basic_query_data(ctx, rd)
  File "/usr/lib/calibre/calibre/srv/code.py", line 75, in get_basic_query_data
    db, library_id, library_map, default_library = get_library_data(ctx, rd)
  File "/usr/lib/calibre/calibre/srv/utils.py", line 493, in get_library_data
    db = get_db(ctx, rd, library_id)
  File "/usr/lib/calibre/calibre/srv/utils.py", line 480, in get_db
    db = ctx.get_library(rd, library_id)
  File "/usr/lib/calibre/calibre/srv/handler.py", line 71, in get_library
    return self.library_broker.get(library_id)
  File "/usr/lib/calibre/calibre/srv/library_broker.py", line 104, in get
    path, library_id == self.default_library)
  File "/usr/lib/calibre/calibre/srv/library_broker.py", line 113, in 
init_library
    return init_library(library_path, is_default_library)
  File "/usr/lib/calibre/calibre/srv/library_broker.py", line 46, in 
init_library
    library_path, load_user_formatter_functions=is_default_library))
  File "/usr/lib/calibre/calibre/db/legacy.py", line 48, in create_backend
    load_user_formatter_functions=load_user_formatter_functions)
  File "/usr/lib/calibre/calibre/db/backend.py", line 382, in __init__
    self.is_case_sensitive = is_case_sensitive(self.library_path)
  File "/usr/lib/calibre/calibre/utils/filenames.py", line 124, in 
is_case_sensitive
    open(f1, 'w').close()
IOError: [Errno 13] Permission non accordée: 
u'/srv/books/calibre_test_case_sensitivity.txt'

It seems it's trying to create a test file, and failing. If I fix the
permissions on the folder (e.g. make them group-writable and add the
user to the group), that error goes away, and I'm confronted with the
next one:

calibre-sandbox@marcos:~$ calibre-server --enable-auth /srv/books/ 
--disable-local-write
calibre server listening on 0.0.0.0:8080
OPDS feeds advertised via BonJour at: 192.168.0.3 port: 8080
Failed login attempt from: 192.168.0.7
Unhandled exception in state: State: _job_done Client: 192.168.0.7:59060 
Request: GET /interface-data/init?1541644438465 HTTP/1.1
Traceback (most recent call last):
  File "/usr/lib/calibre/calibre/srv/loop.py", line 569, in tick
    conn.handle_event(event)
  File "/usr/lib/calibre/calibre/srv/loop.py", line 307, in _job_done
    self.job_done(*event)
  File "/usr/lib/calibre/calibre/srv/pool.py", line 35, in run
    result = func()
  File "/usr/lib/calibre/calibre/srv/http_response.py", line 441, in 
run_request_handler
    result = self.request_handler(data)
  File "/usr/lib/calibre/calibre/srv/routes.py", line 313, in dispatch
    ans = endpoint_(self.ctx, data, *args)
  File "/usr/lib/calibre/calibre/srv/code.py", line 257, in interface_data
    ans['library_id'], db, sorts, orders, vl = get_basic_query_data(ctx, rd)
  File "/usr/lib/calibre/calibre/srv/code.py", line 75, in get_basic_query_data
    db, library_id, library_map, default_library = get_library_data(ctx, rd)
  File "/usr/lib/calibre/calibre/srv/utils.py", line 493, in get_library_data
    db = get_db(ctx, rd, library_id)
  File "/usr/lib/calibre/calibre/srv/utils.py", line 480, in get_db
    db = ctx.get_library(rd, library_id)
  File "/usr/lib/calibre/calibre/srv/handler.py", line 71, in get_library
    return self.library_broker.get(library_id)
  File "/usr/lib/calibre/calibre/srv/library_broker.py", line 104, in get
    path, library_id == self.default_library)
  File "/usr/lib/calibre/calibre/srv/library_broker.py", line 113, in 
init_library
    return init_library(library_path, is_default_library)
  File "/usr/lib/calibre/calibre/srv/library_broker.py", line 46, in 
init_library
    library_path, load_user_formatter_functions=is_default_library))
  File "/usr/lib/calibre/calibre/db/legacy.py", line 48, in create_backend
    load_user_formatter_functions=load_user_formatter_functions)
  File "/usr/lib/calibre/calibre/db/backend.py", line 384, in __init__
    SchemaUpgrade(self, self.library_path, self.field_metadata)
  File "/usr/lib/calibre/calibre/db/schema_upgrades.py", line 19, in __init__
    db.execute('BEGIN EXCLUSIVE TRANSACTION')
  File "/usr/lib/calibre/calibre/db/backend.py", line 844, in execute
    return self.conn.cursor().execute(sql, bindings)
  File "src/cursor.c", line 236, in resetcursor
ReadOnlyError: ReadOnlyError: attempt to write a readonly database

This problem seems more serious; in my experience, sqlite databases
really don't like readonly files and filesystems, as they try to write
their journal there. A workaround is to disable the journal (PRAGMA
journal_mode=off or =memory) but that requires a writable database in
the first place, and has reliability implications. I'm not sure I
would risk that.

Once I made the metadata.db file writable, the warnings went away and
the server worked properly, at least at first glance. But it seems to
me the "local-write" mode really does not do what it says on the tin
and, even if it's specified, the calibre-server still tries to write
to the files.

Thanks for packaging calibre!

A.

-- System Information:
Debian Release: buster/sid
  APT prefers testing
  APT policy: (500, 'testing'), (1, 'experimental'), (1, 'unstable')
Architecture: amd64 (x86_64)

Kernel: Linux 4.18.0-2-amd64 (SMP w/4 CPU cores)
Locale: LANG=fr_CA.UTF-8, LC_CTYPE=fr_CA.UTF-8 (charmap=UTF-8), 
LANGUAGE=fr_CA.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /usr/bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled

Versions of packages calibre depends on:
ii  calibre-bin                      3.33.1+dfsg-1
ii  fonts-liberation                 1:1.07.4-8
ii  imagemagick                      8:6.9.10.14+dfsg-7
ii  imagemagick-6.q16 [imagemagick]  8:6.9.10.14+dfsg-7
ii  libjpeg-turbo-progs              1:1.5.2-2+b1
ii  libjs-coffeescript               1.12.8~dfsg-1
ii  libjs-mathjax                    2.7.4+dfsg-1
ii  optipng                          0.7.6-1.1
ii  poppler-utils                    0.69.0-2
ii  python-apsw                      3.24.0-r1-1
ii  python-chardet                   3.0.4-1
ii  python-cherrypy3                 8.9.1-2
ii  python-cssselect                 1.0.3-1
ii  python-cssutils                  1.0.2-1
ii  python-dateutil                  2.6.1-1
ii  python-dbus                      1.2.8-2+b1
ii  python-feedparser                5.2.1-1
ii  python-html5-parser              0.4.4-1+b1
ii  python-html5lib                  1.0.1-1
ii  python-lxml                      4.2.5-1
ii  python-markdown                  2.6.9-1
ii  python-mechanize                 1:0.2.5-3
ii  python-msgpack                   0.5.6-1+b1
ii  python-netifaces                 0.10.4-1+b1
ii  python-pil                       5.3.0-1
ii  python-pkg-resources             40.4.3-1
ii  python-pyparsing                 2.2.0+dfsg1-2
ii  python-pyqt5                     5.11.3+dfsg-1+b1
ii  python-pyqt5.qtsvg               5.11.3+dfsg-1+b1
ii  python-pyqt5.qtwebkit            5.11.3+dfsg-1+b1
ii  python-regex                     0.1.20180609-1+b1
ii  python-routes                    2.4.1-1
ii  python2.7                        2.7.15-4
ii  xdg-utils                        1.1.3-1

Versions of packages calibre recommends:
ii  python-dnspython  1.15.0-1

calibre suggests no packages.

-- debconf-show failed

Reply via email to