Start work on testing restrictions

This commit is contained in:
Kovid Goyal 2017-05-18 16:51:28 +05:30
parent 598c5058f8
commit df9449207d
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
4 changed files with 46 additions and 3 deletions

View File

@ -554,7 +554,10 @@ def search_result(ctx, rd, db, query, num, offset, sort, sort_order, vl=''):
@endpoint('/ajax/search/{library_id=None}', postprocess=json) @endpoint('/ajax/search/{library_id=None}', postprocess=json)
def search(ctx, rd, library_id): def search(ctx, rd, library_id):
''' '''
Return the books (as list of ids) matching the specified search query. Return the books matching the specified search query.
The returned object is a dict with the field book_ids which
is a list of matched book ids. For all the other fields in the object, see
:func:`search_result`.
Optional: ?num=100&offset=0&sort=title&sort_order=asc&query=&vl= Optional: ?num=100&offset=0&sort=title&sort_order=asc&query=&vl=
''' '''

View File

@ -137,6 +137,7 @@ class Context(object):
def search(self, request_data, db, query, vl=''): def search(self, request_data, db, query, vl=''):
restrict_to_ids = self.get_effective_book_ids(db, request_data, vl) restrict_to_ids = self.get_effective_book_ids(db, request_data, vl)
query = query or ''
key = query, restrict_to_ids key = query, restrict_to_ids
with self.lock: with self.lock:
cache = self.library_broker.search_caches[db.server_library_id] cache = self.library_broker.search_caches[db.server_library_id]
@ -181,3 +182,7 @@ class Handler(object):
def close(self): def close(self):
self.router.ctx.library_broker.close() self.router.ctx.library_broker.close()
@property
def ctx(self):
return self.router.ctx

View File

@ -6,14 +6,17 @@ from __future__ import (unicode_literals, division, absolute_import,
__license__ = 'GPL v3' __license__ = 'GPL v3'
__copyright__ = '2015, Kovid Goyal <kovid at kovidgoyal.net>' __copyright__ = '2015, Kovid Goyal <kovid at kovidgoyal.net>'
import httplib, zlib, json import httplib, zlib, json, base64, os
from functools import partial from functools import partial
from urllib import urlencode from urllib import urlencode
from httplib import OK, NOT_FOUND
from calibre.srv.tests.base import LibraryBaseTest from calibre.srv.tests.base import LibraryBaseTest
def make_request(conn, url, headers={}, prefix='/ajax'): def make_request(conn, url, headers={}, prefix='/ajax', username=None, password=None):
if username and password:
headers[b'Authorization'] = b'Basic ' + base64.standard_b64encode((username + ':' + password).encode('utf-8'))
conn.request('GET', prefix + url, headers=headers) conn.request('GET', prefix + url, headers=headers)
r = conn.getresponse() r = conn.getresponse()
data = r.read() data = r.read()
@ -78,3 +81,34 @@ class ContentTest(LibraryBaseTest):
r, data = request('/search?' + urlencode({'query': 'tags:"=Tag One"', 'vl':'1'})) r, data = request('/search?' + urlencode({'query': 'tags:"=Tag One"', 'vl':'1'}))
self.ae(set(data['book_ids']), {2}) self.ae(set(data['book_ids']), {2})
# }}} # }}}
def test_srv_restrictions(self):
' Test that virtual lib. + search restriction works on all end points'
with self.create_server(auth=True, auth_mode='basic') as server:
db = server.handler.router.ctx.library_broker.get(None)
db.set_pref('virtual_libraries', {'1':'id:1', '12':'id:1 or id:2'})
db.set_field('tags', {1: ['present'], 3: ['missing']})
server.handler.ctx.user_manager.add_user('12', 'test', restriction={
'library_restrictions':{os.path.basename(db.backend.library_path): 'id:1 or id:2'}})
conn = server.connect()
url_for = server.handler.router.url_for
def r(path, status=OK):
r, data = make_request(conn, path, username='12', password='test', prefix='')
self.assertEqual(status, r.status)
return data
ok = r
nf = partial(r, status=NOT_FOUND)
ok(url_for('/ajax/book', book_id=1))
nf(url_for('/ajax/book', book_id=3))
data = ok(url_for('/ajax/books'))
self.assertIsNone(data['3'])
for i in '12':
self.assertIsNotNone(data[i])
self.assertEqual(set(r('/ajax/search')['book_ids']), {1,2})
self.assertEqual(set(r('/ajax/search?query=id:2')['book_ids']), {2})
self.assertEqual(set(r('/ajax/search?vl=1')['book_ids']), {1})
nf(url_for('/book-manifest', book_id=3, fmt='x'))
nf(url_for('/book-file', book_id=3, fmt='x', size=1, mtime=1, name='x'))

View File

@ -96,6 +96,7 @@ class TestServer(Thread):
kwargs['shutdown_timeout'] = kwargs.get('shutdown_timeout', 0.1) kwargs['shutdown_timeout'] = kwargs.get('shutdown_timeout', 0.1)
kwargs['listen_on'] = kwargs.get('listen_on', 'localhost') kwargs['listen_on'] = kwargs.get('listen_on', 'localhost')
kwargs['port'] = kwargs.get('port', 0) kwargs['port'] = kwargs.get('port', 0)
kwargs['userdb'] = kwargs.get('userdb', ':memory:')
def run(self): def run(self):
try: try: