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
Show 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,86 +96,7 @@ def logout_oauth_user():
...
@@ -96,86 +96,7 @@ 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
):
oauthblueprints
=
[]
if
not
ub
.
session
.
query
(
ub
.
OAuthProvider
)
.
count
():
for
provider
in
(
"github"
,
"google"
):
oauthProvider
=
ub
.
OAuthProvider
()
oauthProvider
.
provider_name
=
provider
oauthProvider
.
active
=
False
ub
.
session
.
add
(
oauthProvider
)
ub
.
session_commit
(
"{} Blueprint Created"
.
format
(
provider
))
oauth_ids
=
ub
.
session
.
query
(
ub
.
OAuthProvider
)
.
all
()
ele1
=
dict
(
provider_name
=
'github'
,
id
=
oauth_ids
[
0
]
.
id
,
active
=
oauth_ids
[
0
]
.
active
,
oauth_client_id
=
oauth_ids
[
0
]
.
oauth_client_id
,
scope
=
None
,
oauth_client_secret
=
oauth_ids
[
0
]
.
oauth_client_secret
,
obtain_link
=
'https://github.com/settings/developers'
)
ele2
=
dict
(
provider_name
=
'google'
,
id
=
oauth_ids
[
1
]
.
id
,
active
=
oauth_ids
[
1
]
.
active
,
scope
=
[
"https://www.googleapis.com/auth/userinfo.email"
],
oauth_client_id
=
oauth_ids
[
1
]
.
oauth_client_id
,
oauth_client_secret
=
oauth_ids
[
1
]
.
oauth_client_secret
,
obtain_link
=
'https://console.developers.google.com/apis/credentials'
)
oauthblueprints
.
append
(
ele1
)
oauthblueprints
.
append
(
ele2
)
for
element
in
oauthblueprints
:
if
element
[
'provider_name'
]
==
'github'
:
blueprint_func
=
make_github_blueprint
else
:
blueprint_func
=
make_google_blueprint
blueprint
=
blueprint_func
(
client_id
=
element
[
'oauth_client_id'
],
client_secret
=
element
[
'oauth_client_secret'
],
redirect_to
=
"oauth."
+
element
[
'provider_name'
]
+
"_login"
,
scope
=
element
[
'scope'
]
)
element
[
'blueprint'
]
=
blueprint
element
[
'blueprint'
]
.
backend
=
OAuthBackend
(
ub
.
OAuth
,
ub
.
session
,
str
(
element
[
'id'
]),
user
=
current_user
,
user_required
=
True
)
app
.
register_blueprint
(
blueprint
,
url_prefix
=
"/login"
)
if
element
[
'active'
]:
register_oauth_blueprint
(
element
[
'id'
],
element
[
'provider_name'
])
@
oauth_authorized
.
connect_via
(
oauthblueprints
[
0
][
'blueprint'
])
def
github_logged_in
(
blueprint
,
token
):
if
not
token
:
flash
(
_
(
u"Failed to log in with GitHub."
),
category
=
"error"
)
return
False
resp
=
blueprint
.
session
.
get
(
"/user"
)
if
not
resp
.
ok
:
flash
(
_
(
u"Failed to fetch user info from GitHub."
),
category
=
"error"
)
return
False
github_info
=
resp
.
json
()
github_user_id
=
str
(
github_info
[
"id"
])
return
oauth_update_token
(
str
(
oauthblueprints
[
0
][
'id'
]),
token
,
github_user_id
)
@
oauth_authorized
.
connect_via
(
oauthblueprints
[
1
][
'blueprint'
])
def
google_logged_in
(
blueprint
,
token
):
if
not
token
:
flash
(
_
(
u"Failed to log in with Google."
),
category
=
"error"
)
return
False
resp
=
blueprint
.
session
.
get
(
"/oauth2/v2/userinfo"
)
if
not
resp
.
ok
:
flash
(
_
(
u"Failed to fetch user info from Google."
),
category
=
"error"
)
return
False
google_info
=
resp
.
json
()
google_user_id
=
str
(
google_info
[
"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_user_id"
]
=
provider_user_id
session
[
provider_id
+
"_oauth_token"
]
=
token
session
[
provider_id
+
"_oauth_token"
]
=
token
...
@@ -202,7 +123,7 @@ if ub.oauth_support:
...
@@ -202,7 +123,7 @@ if ub.oauth_support:
return
backend_resultcode
return
backend_resultcode
def
bind_oauth_or_register
(
provider_id
,
provider_user_id
,
redirect_url
,
provider_name
):
def
bind_oauth_or_register
(
provider_id
,
provider_user_id
,
redirect_url
,
provider_name
):
query
=
ub
.
session
.
query
(
ub
.
OAuth
)
.
filter_by
(
query
=
ub
.
session
.
query
(
ub
.
OAuth
)
.
filter_by
(
provider
=
provider_id
,
provider
=
provider_id
,
provider_user_id
=
provider_user_id
,
provider_user_id
=
provider_user_id
,
...
@@ -242,7 +163,7 @@ if ub.oauth_support:
...
@@ -242,7 +163,7 @@ if ub.oauth_support:
return
redirect
(
url_for
(
redirect_url
))
return
redirect
(
url_for
(
redirect_url
))
def
get_oauth_status
():
def
get_oauth_status
():
status
=
[]
status
=
[]
query
=
ub
.
session
.
query
(
ub
.
OAuth
)
.
filter_by
(
query
=
ub
.
session
.
query
(
ub
.
OAuth
)
.
filter_by
(
user_id
=
current_user
.
id
,
user_id
=
current_user
.
id
,
...
@@ -256,7 +177,7 @@ if ub.oauth_support:
...
@@ -256,7 +177,7 @@ if ub.oauth_support:
return
None
return
None
def
unlink_oauth
(
provider
):
def
unlink_oauth
(
provider
):
if
request
.
host_url
+
'me'
!=
request
.
referrer
:
if
request
.
host_url
+
'me'
!=
request
.
referrer
:
pass
pass
query
=
ub
.
session
.
query
(
ub
.
OAuth
)
.
filter_by
(
query
=
ub
.
session
.
query
(
ub
.
OAuth
)
.
filter_by
(
...
@@ -281,6 +202,88 @@ if ub.oauth_support:
...
@@ -281,6 +202,88 @@ if ub.oauth_support:
flash
(
_
(
u"Not Linked to
%(oauth)
s"
,
oauth
=
provider
),
category
=
"error"
)
flash
(
_
(
u"Not Linked to
%(oauth)
s"
,
oauth
=
provider
),
category
=
"error"
)
return
redirect
(
url_for
(
'web.profile'
))
return
redirect
(
url_for
(
'web.profile'
))
def
generate_oauth_blueprints
():
oauthblueprints
=
[]
if
not
ub
.
session
.
query
(
ub
.
OAuthProvider
)
.
count
():
for
provider
in
(
"github"
,
"google"
):
oauthProvider
=
ub
.
OAuthProvider
()
oauthProvider
.
provider_name
=
provider
oauthProvider
.
active
=
False
ub
.
session
.
add
(
oauthProvider
)
ub
.
session_commit
(
"{} Blueprint Created"
.
format
(
provider
))
oauth_ids
=
ub
.
session
.
query
(
ub
.
OAuthProvider
)
.
all
()
ele1
=
dict
(
provider_name
=
'github'
,
id
=
oauth_ids
[
0
]
.
id
,
active
=
oauth_ids
[
0
]
.
active
,
oauth_client_id
=
oauth_ids
[
0
]
.
oauth_client_id
,
scope
=
None
,
oauth_client_secret
=
oauth_ids
[
0
]
.
oauth_client_secret
,
obtain_link
=
'https://github.com/settings/developers'
)
ele2
=
dict
(
provider_name
=
'google'
,
id
=
oauth_ids
[
1
]
.
id
,
active
=
oauth_ids
[
1
]
.
active
,
scope
=
[
"https://www.googleapis.com/auth/userinfo.email"
],
oauth_client_id
=
oauth_ids
[
1
]
.
oauth_client_id
,
oauth_client_secret
=
oauth_ids
[
1
]
.
oauth_client_secret
,
obtain_link
=
'https://console.developers.google.com/apis/credentials'
)
oauthblueprints
.
append
(
ele1
)
oauthblueprints
.
append
(
ele2
)
for
element
in
oauthblueprints
:
if
element
[
'provider_name'
]
==
'github'
:
blueprint_func
=
make_github_blueprint
else
:
blueprint_func
=
make_google_blueprint
blueprint
=
blueprint_func
(
client_id
=
element
[
'oauth_client_id'
],
client_secret
=
element
[
'oauth_client_secret'
],
redirect_to
=
"oauth."
+
element
[
'provider_name'
]
+
"_login"
,
scope
=
element
[
'scope'
]
)
element
[
'blueprint'
]
=
blueprint
element
[
'blueprint'
]
.
backend
=
OAuthBackend
(
ub
.
OAuth
,
ub
.
session
,
str
(
element
[
'id'
]),
user
=
current_user
,
user_required
=
True
)
app
.
register_blueprint
(
blueprint
,
url_prefix
=
"/login"
)
if
element
[
'active'
]:
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'
])
def
github_logged_in
(
blueprint
,
token
):
if
not
token
:
flash
(
_
(
u"Failed to log in with GitHub."
),
category
=
"error"
)
return
False
resp
=
blueprint
.
session
.
get
(
"/user"
)
if
not
resp
.
ok
:
flash
(
_
(
u"Failed to fetch user info from GitHub."
),
category
=
"error"
)
return
False
github_info
=
resp
.
json
()
github_user_id
=
str
(
github_info
[
"id"
])
return
oauth_update_token
(
str
(
oauthblueprints
[
0
][
'id'
]),
token
,
github_user_id
)
@
oauth_authorized
.
connect_via
(
oauthblueprints
[
1
][
'blueprint'
])
def
google_logged_in
(
blueprint
,
token
):
if
not
token
:
flash
(
_
(
u"Failed to log in with Google."
),
category
=
"error"
)
return
False
resp
=
blueprint
.
session
.
get
(
"/oauth2/v2/userinfo"
)
if
not
resp
.
ok
:
flash
(
_
(
u"Failed to fetch user info from Google."
),
category
=
"error"
)
return
False
google_info
=
resp
.
json
()
google_user_id
=
str
(
google_info
[
"id"
])
return
oauth_update_token
(
str
(
oauthblueprints
[
1
][
'id'
]),
token
,
google_user_id
)
# notify on OAuth provider error
# notify on OAuth provider error
@
oauth_error
.
connect_via
(
oauthblueprints
[
0
][
'blueprint'
])
@
oauth_error
.
connect_via
(
oauthblueprints
[
0
][
'blueprint'
])
...
...
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