Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
D
douban-api-proxy
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
captainwong
douban-api-proxy
Commits
9a963bbe
Commit
9a963bbe
authored
Mar 15, 2021
by
Ozzie Isaacs
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Refactored code
Testrun
parent
994bc8b0
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
1538 additions
and
772 deletions
+1538
-772
editbooks.py
cps/editbooks.py
+206
-174
helper.py
cps/helper.py
+1
-1
kobo.py
cps/kobo.py
+1
-1
oauth_bb.py
cps/oauth_bb.py
+111
-108
server.py
cps/server.py
+1
-1
updater.py
cps/updater.py
+58
-51
Calibre-Web TestSummary_Linux.html
test/Calibre-Web TestSummary_Linux.html
+1160
-436
No files found.
cps/editbooks.py
View file @
9a963bbe
This diff is collapsed.
Click to expand it.
cps/helper.py
View file @
9a963bbe
...
@@ -730,7 +730,7 @@ def format_runtime(runtime):
...
@@ -730,7 +730,7 @@ def format_runtime(runtime):
# helper function to apply localize status information in tasklist entries
# helper function to apply localize status information in tasklist entries
def
render_task_status
(
tasklist
):
def
render_task_status
(
tasklist
):
renderedtasklist
=
list
()
renderedtasklist
=
list
()
for
__
,
user
,
added
,
task
in
tasklist
:
for
__
,
user
,
__
,
task
in
tasklist
:
if
user
==
current_user
.
nickname
or
current_user
.
role_admin
():
if
user
==
current_user
.
nickname
or
current_user
.
role_admin
():
ret
=
{}
ret
=
{}
if
task
.
start_time
:
if
task
.
start_time
:
...
...
cps/kobo.py
View file @
9a963bbe
...
@@ -918,7 +918,7 @@ def HandleAuthRequest():
...
@@ -918,7 +918,7 @@ def HandleAuthRequest():
if
config
.
config_kobo_proxy
:
if
config
.
config_kobo_proxy
:
try
:
try
:
return
redirect_or_proxy_request
()
return
redirect_or_proxy_request
()
except
:
except
Exception
:
log
.
error
(
"Failed to receive or parse response from Kobo's auth endpoint. Falling back to un-proxied mode."
)
log
.
error
(
"Failed to receive or parse response from Kobo's auth endpoint. Falling back to un-proxied mode."
)
return
make_calibre_web_auth_response
()
return
make_calibre_web_auth_response
()
...
...
cps/oauth_bb.py
View file @
9a963bbe
...
@@ -96,7 +96,113 @@ def logout_oauth_user():
...
@@ -96,7 +96,113 @@ def logout_oauth_user():
session
.
pop
(
str
(
oauth_key
)
+
'_oauth_user_id'
)
session
.
pop
(
str
(
oauth_key
)
+
'_oauth_user_id'
)
if
ub
.
oauth_support
:
def
oauth_update_token
(
provider_id
,
token
,
provider_user_id
):
session
[
provider_id
+
"_oauth_user_id"
]
=
provider_user_id
session
[
provider_id
+
"_oauth_token"
]
=
token
# Find this OAuth token in the database, or create it
query
=
ub
.
session
.
query
(
ub
.
OAuth
)
.
filter_by
(
provider
=
provider_id
,
provider_user_id
=
provider_user_id
,
)
try
:
oauth_entry
=
query
.
one
()
# update token
oauth_entry
.
token
=
token
except
NoResultFound
:
oauth_entry
=
ub
.
OAuth
(
provider
=
provider_id
,
provider_user_id
=
provider_user_id
,
token
=
token
,
)
ub
.
session
.
add
(
oauth_entry
)
ub
.
session_commit
()
# Disable Flask-Dance's default behavior for saving the OAuth token
# Value differrs depending on flask-dance version
return
backend_resultcode
def
bind_oauth_or_register
(
provider_id
,
provider_user_id
,
redirect_url
,
provider_name
):
query
=
ub
.
session
.
query
(
ub
.
OAuth
)
.
filter_by
(
provider
=
provider_id
,
provider_user_id
=
provider_user_id
,
)
try
:
oauth_entry
=
query
.
first
()
# already bind with user, just login
if
oauth_entry
.
user
:
login_user
(
oauth_entry
.
user
)
log
.
debug
(
u"You are now logged in as: '
%
s'"
,
oauth_entry
.
user
.
nickname
)
flash
(
_
(
u"you are now logged in as: '
%(nickname)
s'"
,
nickname
=
oauth_entry
.
user
.
nickname
),
category
=
"success"
)
return
redirect
(
url_for
(
'web.index'
))
else
:
# bind to current user
if
current_user
and
current_user
.
is_authenticated
:
oauth_entry
.
user
=
current_user
try
:
ub
.
session
.
add
(
oauth_entry
)
ub
.
session
.
commit
()
flash
(
_
(
u"Link to
%(oauth)
s Succeeded"
,
oauth
=
provider_name
),
category
=
"success"
)
return
redirect
(
url_for
(
'web.profile'
))
except
Exception
as
e
:
log
.
debug_or_exception
(
e
)
ub
.
session
.
rollback
()
else
:
flash
(
_
(
u"Login failed, No User Linked With OAuth Account"
),
category
=
"error"
)
log
.
info
(
'Login failed, No User Linked With OAuth Account'
)
return
redirect
(
url_for
(
'web.login'
))
# return redirect(url_for('web.login'))
# if config.config_public_reg:
# return redirect(url_for('web.register'))
# else:
# flash(_(u"Public registration is not enabled"), category="error")
# return redirect(url_for(redirect_url))
except
(
NoResultFound
,
AttributeError
):
return
redirect
(
url_for
(
redirect_url
))
def
get_oauth_status
():
status
=
[]
query
=
ub
.
session
.
query
(
ub
.
OAuth
)
.
filter_by
(
user_id
=
current_user
.
id
,
)
try
:
oauths
=
query
.
all
()
for
oauth_entry
in
oauths
:
status
.
append
(
int
(
oauth_entry
.
provider
))
return
status
except
NoResultFound
:
return
None
def
unlink_oauth
(
provider
):
if
request
.
host_url
+
'me'
!=
request
.
referrer
:
pass
query
=
ub
.
session
.
query
(
ub
.
OAuth
)
.
filter_by
(
provider
=
provider
,
user_id
=
current_user
.
id
,
)
try
:
oauth_entry
=
query
.
one
()
if
current_user
and
current_user
.
is_authenticated
:
oauth_entry
.
user
=
current_user
try
:
ub
.
session
.
delete
(
oauth_entry
)
ub
.
session
.
commit
()
logout_oauth_user
()
flash
(
_
(
u"Unlink to
%(oauth)
s Succeeded"
,
oauth
=
oauth_check
[
provider
]),
category
=
"success"
)
except
Exception
as
e
:
log
.
debug_or_exception
(
e
)
ub
.
session
.
rollback
()
flash
(
_
(
u"Unlink to
%(oauth)
s Failed"
,
oauth
=
oauth_check
[
provider
]),
category
=
"error"
)
except
NoResultFound
:
log
.
warning
(
"oauth
%
s for user
%
d not found"
,
provider
,
current_user
.
id
)
flash
(
_
(
u"Not Linked to
%(oauth)
s"
,
oauth
=
provider
),
category
=
"error"
)
return
redirect
(
url_for
(
'web.profile'
))
def
generate_oauth_blueprints
():
oauthblueprints
=
[]
oauthblueprints
=
[]
if
not
ub
.
session
.
query
(
ub
.
OAuthProvider
)
.
count
():
if
not
ub
.
session
.
query
(
ub
.
OAuthProvider
)
.
count
():
for
provider
in
(
"github"
,
"google"
):
for
provider
in
(
"github"
,
"google"
):
...
@@ -141,7 +247,11 @@ if ub.oauth_support:
...
@@ -141,7 +247,11 @@ if ub.oauth_support:
app
.
register_blueprint
(
blueprint
,
url_prefix
=
"/login"
)
app
.
register_blueprint
(
blueprint
,
url_prefix
=
"/login"
)
if
element
[
'active'
]:
if
element
[
'active'
]:
register_oauth_blueprint
(
element
[
'id'
],
element
[
'provider_name'
])
register_oauth_blueprint
(
element
[
'id'
],
element
[
'provider_name'
])
return
oauthblueprints
if
ub
.
oauth_support
:
oauthblueprints
=
generate_oauth_blueprints
()
@
oauth_authorized
.
connect_via
(
oauthblueprints
[
0
][
'blueprint'
])
@
oauth_authorized
.
connect_via
(
oauthblueprints
[
0
][
'blueprint'
])
def
github_logged_in
(
blueprint
,
token
):
def
github_logged_in
(
blueprint
,
token
):
...
@@ -175,113 +285,6 @@ if ub.oauth_support:
...
@@ -175,113 +285,6 @@ if ub.oauth_support:
return
oauth_update_token
(
str
(
oauthblueprints
[
1
][
'id'
]),
token
,
google_user_id
)
return
oauth_update_token
(
str
(
oauthblueprints
[
1
][
'id'
]),
token
,
google_user_id
)
def
oauth_update_token
(
provider_id
,
token
,
provider_user_id
):
session
[
provider_id
+
"_oauth_user_id"
]
=
provider_user_id
session
[
provider_id
+
"_oauth_token"
]
=
token
# Find this OAuth token in the database, or create it
query
=
ub
.
session
.
query
(
ub
.
OAuth
)
.
filter_by
(
provider
=
provider_id
,
provider_user_id
=
provider_user_id
,
)
try
:
oauth_entry
=
query
.
one
()
# update token
oauth_entry
.
token
=
token
except
NoResultFound
:
oauth_entry
=
ub
.
OAuth
(
provider
=
provider_id
,
provider_user_id
=
provider_user_id
,
token
=
token
,
)
ub
.
session
.
add
(
oauth_entry
)
ub
.
session_commit
()
# Disable Flask-Dance's default behavior for saving the OAuth token
# Value differrs depending on flask-dance version
return
backend_resultcode
def
bind_oauth_or_register
(
provider_id
,
provider_user_id
,
redirect_url
,
provider_name
):
query
=
ub
.
session
.
query
(
ub
.
OAuth
)
.
filter_by
(
provider
=
provider_id
,
provider_user_id
=
provider_user_id
,
)
try
:
oauth_entry
=
query
.
first
()
# already bind with user, just login
if
oauth_entry
.
user
:
login_user
(
oauth_entry
.
user
)
log
.
debug
(
u"You are now logged in as: '
%
s'"
,
oauth_entry
.
user
.
nickname
)
flash
(
_
(
u"you are now logged in as: '
%(nickname)
s'"
,
nickname
=
oauth_entry
.
user
.
nickname
),
category
=
"success"
)
return
redirect
(
url_for
(
'web.index'
))
else
:
# bind to current user
if
current_user
and
current_user
.
is_authenticated
:
oauth_entry
.
user
=
current_user
try
:
ub
.
session
.
add
(
oauth_entry
)
ub
.
session
.
commit
()
flash
(
_
(
u"Link to
%(oauth)
s Succeeded"
,
oauth
=
provider_name
),
category
=
"success"
)
return
redirect
(
url_for
(
'web.profile'
))
except
Exception
as
e
:
log
.
debug_or_exception
(
e
)
ub
.
session
.
rollback
()
else
:
flash
(
_
(
u"Login failed, No User Linked With OAuth Account"
),
category
=
"error"
)
log
.
info
(
'Login failed, No User Linked With OAuth Account'
)
return
redirect
(
url_for
(
'web.login'
))
# return redirect(url_for('web.login'))
# if config.config_public_reg:
# return redirect(url_for('web.register'))
# else:
# flash(_(u"Public registration is not enabled"), category="error")
# return redirect(url_for(redirect_url))
except
(
NoResultFound
,
AttributeError
):
return
redirect
(
url_for
(
redirect_url
))
def
get_oauth_status
():
status
=
[]
query
=
ub
.
session
.
query
(
ub
.
OAuth
)
.
filter_by
(
user_id
=
current_user
.
id
,
)
try
:
oauths
=
query
.
all
()
for
oauth_entry
in
oauths
:
status
.
append
(
int
(
oauth_entry
.
provider
))
return
status
except
NoResultFound
:
return
None
def
unlink_oauth
(
provider
):
if
request
.
host_url
+
'me'
!=
request
.
referrer
:
pass
query
=
ub
.
session
.
query
(
ub
.
OAuth
)
.
filter_by
(
provider
=
provider
,
user_id
=
current_user
.
id
,
)
try
:
oauth_entry
=
query
.
one
()
if
current_user
and
current_user
.
is_authenticated
:
oauth_entry
.
user
=
current_user
try
:
ub
.
session
.
delete
(
oauth_entry
)
ub
.
session
.
commit
()
logout_oauth_user
()
flash
(
_
(
u"Unlink to
%(oauth)
s Succeeded"
,
oauth
=
oauth_check
[
provider
]),
category
=
"success"
)
except
Exception
as
e
:
log
.
debug_or_exception
(
e
)
ub
.
session
.
rollback
()
flash
(
_
(
u"Unlink to
%(oauth)
s Failed"
,
oauth
=
oauth_check
[
provider
]),
category
=
"error"
)
except
NoResultFound
:
log
.
warning
(
"oauth
%
s for user
%
d not found"
,
provider
,
current_user
.
id
)
flash
(
_
(
u"Not Linked to
%(oauth)
s"
,
oauth
=
provider
),
category
=
"error"
)
return
redirect
(
url_for
(
'web.profile'
))
# notify on OAuth provider error
# notify on OAuth provider error
@
oauth_error
.
connect_via
(
oauthblueprints
[
0
][
'blueprint'
])
@
oauth_error
.
connect_via
(
oauthblueprints
[
0
][
'blueprint'
])
def
github_error
(
blueprint
,
error
,
error_description
=
None
,
error_uri
=
None
):
def
github_error
(
blueprint
,
error
,
error_description
=
None
,
error_uri
=
None
):
...
...
cps/server.py
View file @
9a963bbe
...
@@ -253,7 +253,7 @@ class WebServer(object):
...
@@ -253,7 +253,7 @@ class WebServer(object):
if
not
self
.
restart
:
if
not
self
.
restart
:
log
.
info
(
"Performing shutdown of Calibre-Web"
)
log
.
info
(
"Performing shutdown of Calibre-Web"
)
# prevent irrit
i
ating log of pending tasks message from asyncio
# prevent irritating log of pending tasks message from asyncio
logger
.
get
(
'asyncio'
)
.
setLevel
(
logger
.
logging
.
CRITICAL
)
logger
.
get
(
'asyncio'
)
.
setLevel
(
logger
.
logging
.
CRITICAL
)
return
True
return
True
...
...
cps/updater.py
View file @
9a963bbe
...
@@ -284,6 +284,62 @@ class Updater(threading.Thread):
...
@@ -284,6 +284,62 @@ class Updater(threading.Thread):
def
_stable_version_info
(
cls
):
def
_stable_version_info
(
cls
):
return
constants
.
STABLE_VERSION
# Current version
return
constants
.
STABLE_VERSION
# Current version
def
_populate_parent_commits
(
self
,
update_data
,
status
,
locale
,
tz
,
parents
):
try
:
parent_commit
=
update_data
[
'parents'
][
0
]
# limit the maximum search depth
remaining_parents_cnt
=
10
except
(
IndexError
,
KeyError
):
remaining_parents_cnt
=
None
if
remaining_parents_cnt
is
not
None
:
while
True
:
if
remaining_parents_cnt
==
0
:
break
# check if we are more than one update behind if so, go up the tree
if
parent_commit
[
'sha'
]
!=
status
[
'current_commit_hash'
]:
try
:
headers
=
{
'Accept'
:
'application/vnd.github.v3+json'
}
r
=
requests
.
get
(
parent_commit
[
'url'
],
headers
=
headers
,
timeout
=
10
)
r
.
raise_for_status
()
parent_data
=
r
.
json
()
parent_commit_date
=
datetime
.
datetime
.
strptime
(
parent_data
[
'committer'
][
'date'
],
'
%
Y-
%
m-
%
dT
%
H:
%
M:
%
SZ'
)
-
tz
parent_commit_date
=
format_datetime
(
parent_commit_date
,
format
=
'short'
,
locale
=
locale
)
parents
.
append
([
parent_commit_date
,
parent_data
[
'message'
]
.
replace
(
'
\r\n
'
,
'<p>'
)
.
replace
(
'
\n
'
,
'<p>'
)])
parent_commit
=
parent_data
[
'parents'
][
0
]
remaining_parents_cnt
-=
1
except
Exception
:
# it isn't crucial if we can't get information about the parent
break
else
:
# parent is our current version
break
return
parents
def
_load_nightly_data
(
self
,
repository_url
,
commit
,
status
):
try
:
headers
=
{
'Accept'
:
'application/vnd.github.v3+json'
}
r
=
requests
.
get
(
repository_url
+
'/git/commits/'
+
commit
[
'object'
][
'sha'
],
headers
=
headers
,
timeout
=
10
)
r
.
raise_for_status
()
update_data
=
r
.
json
()
except
requests
.
exceptions
.
HTTPError
as
e
:
status
[
'message'
]
=
_
(
u'HTTP Error'
)
+
' '
+
str
(
e
)
except
requests
.
exceptions
.
ConnectionError
:
status
[
'message'
]
=
_
(
u'Connection error'
)
except
requests
.
exceptions
.
Timeout
:
status
[
'message'
]
=
_
(
u'Timeout while establishing connection'
)
except
(
requests
.
exceptions
.
RequestException
,
ValueError
):
status
[
'message'
]
=
_
(
u'General error'
)
return
status
,
update_data
def
_nightly_available_updates
(
self
,
request_method
,
locale
):
def
_nightly_available_updates
(
self
,
request_method
,
locale
):
tz
=
datetime
.
timedelta
(
seconds
=
time
.
timezone
if
(
time
.
localtime
()
.
tm_isdst
==
0
)
else
time
.
altzone
)
tz
=
datetime
.
timedelta
(
seconds
=
time
.
timezone
if
(
time
.
localtime
()
.
tm_isdst
==
0
)
else
time
.
altzone
)
if
request_method
==
"GET"
:
if
request_method
==
"GET"
:
...
@@ -309,22 +365,7 @@ class Updater(threading.Thread):
...
@@ -309,22 +365,7 @@ class Updater(threading.Thread):
# a new update is available
# a new update is available
status
[
'update'
]
=
True
status
[
'update'
]
=
True
status
,
update_data
=
self
.
_load_nightly_data
(
repository_url
,
commit
,
status
)
try
:
headers
=
{
'Accept'
:
'application/vnd.github.v3+json'
}
r
=
requests
.
get
(
repository_url
+
'/git/commits/'
+
commit
[
'object'
][
'sha'
],
headers
=
headers
,
timeout
=
10
)
r
.
raise_for_status
()
update_data
=
r
.
json
()
except
requests
.
exceptions
.
HTTPError
as
e
:
status
[
'message'
]
=
_
(
u'HTTP Error'
)
+
' '
+
str
(
e
)
except
requests
.
exceptions
.
ConnectionError
:
status
[
'message'
]
=
_
(
u'Connection error'
)
except
requests
.
exceptions
.
Timeout
:
status
[
'message'
]
=
_
(
u'Timeout while establishing connection'
)
except
(
requests
.
exceptions
.
RequestException
,
ValueError
):
status
[
'message'
]
=
_
(
u'General error'
)
if
status
[
'message'
]
!=
''
:
if
status
[
'message'
]
!=
''
:
return
json
.
dumps
(
status
)
return
json
.
dumps
(
status
)
...
@@ -346,41 +387,7 @@ class Updater(threading.Thread):
...
@@ -346,41 +387,7 @@ class Updater(threading.Thread):
)
)
# it only makes sense to analyze the parents if we know the current commit hash
# it only makes sense to analyze the parents if we know the current commit hash
if
status
[
'current_commit_hash'
]
!=
''
:
if
status
[
'current_commit_hash'
]
!=
''
:
try
:
parents
=
self
.
_populate_parent_commits
(
update_data
,
status
,
locale
,
tz
,
parents
)
parent_commit
=
update_data
[
'parents'
][
0
]
# limit the maximum search depth
remaining_parents_cnt
=
10
except
(
IndexError
,
KeyError
):
remaining_parents_cnt
=
None
if
remaining_parents_cnt
is
not
None
:
while
True
:
if
remaining_parents_cnt
==
0
:
break
# check if we are more than one update behind if so, go up the tree
if
parent_commit
[
'sha'
]
!=
status
[
'current_commit_hash'
]:
try
:
headers
=
{
'Accept'
:
'application/vnd.github.v3+json'
}
r
=
requests
.
get
(
parent_commit
[
'url'
],
headers
=
headers
,
timeout
=
10
)
r
.
raise_for_status
()
parent_data
=
r
.
json
()
parent_commit_date
=
datetime
.
datetime
.
strptime
(
parent_data
[
'committer'
][
'date'
],
'
%
Y-
%
m-
%
dT
%
H:
%
M:
%
SZ'
)
-
tz
parent_commit_date
=
format_datetime
(
parent_commit_date
,
format
=
'short'
,
locale
=
locale
)
parents
.
append
([
parent_commit_date
,
parent_data
[
'message'
]
.
replace
(
'
\r\n
'
,
'<p>'
)
.
replace
(
'
\n
'
,
'<p>'
)])
parent_commit
=
parent_data
[
'parents'
][
0
]
remaining_parents_cnt
-=
1
except
Exception
:
# it isn't crucial if we can't get information about the parent
break
else
:
# parent is our current version
break
status
[
'history'
]
=
parents
[::
-
1
]
status
[
'history'
]
=
parents
[::
-
1
]
except
(
IndexError
,
KeyError
):
except
(
IndexError
,
KeyError
):
status
[
'success'
]
=
False
status
[
'success'
]
=
False
...
...
test/Calibre-Web TestSummary_Linux.html
View file @
9a963bbe
This source diff could not be displayed because it is too large. You can
view the blob
instead.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment