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
68936352
Commit
68936352
authored
Feb 18, 2020
by
Ozzieisaacs
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Handle kobo auth request
Handle access from localhost for kobo
parent
ba6b5f8f
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
61 additions
and
28 deletions
+61
-28
kobo.py
cps/kobo.py
+26
-3
kobo_auth.py
cps/kobo_auth.py
+33
-23
generate_kobo_auth_url.html
cps/templates/generate_kobo_auth_url.html
+2
-2
No files found.
cps/kobo.py
View file @
68936352
...
...
@@ -18,6 +18,8 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import
sys
import
base64
import
os
import
uuid
from
time
import
gmtime
,
strftime
try
:
...
...
@@ -394,10 +396,31 @@ def handle_404(err):
log
.
debug
(
"Unknown Request received:
%
s"
,
request
.
base_url
)
return
redirect_or_proxy_request
()
@
kobo
.
route
(
"/v1/auth/device"
,
methods
=
[
"POST"
])
def
login_auth_token
():
log
.
info
(
'Auth'
)
return
redirect_or_proxy_request
(
proxy
=
True
)
@
requires_kobo_auth
def
HandleAuthRequest
():
# Missing feature: Authentication :)
log
.
debug
(
'Kobo Auth request'
)
content
=
request
.
get_json
()
AccessToken
=
base64
.
b64encode
(
os
.
urandom
(
24
))
.
decode
(
'utf-8'
)
RefreshToken
=
base64
.
b64encode
(
os
.
urandom
(
24
))
.
decode
(
'utf-8'
)
if
config
.
config_kobo_proxy
:
return
redirect_or_proxy_request
(
proxy
=
True
)
else
:
response
=
make_response
(
jsonify
(
{
"AccessToken"
:
AccessToken
,
"RefreshToken"
:
RefreshToken
,
"TokenType"
:
"Bearer"
,
"TrackingId"
:
str
(
uuid
.
uuid4
()),
"UserKey"
:
content
[
'UserKey'
],
}
)
)
return
response
@
kobo
.
route
(
"/v1/initialization"
)
@
requires_kobo_auth
...
...
cps/kobo_auth.py
View file @
68936352
...
...
@@ -60,8 +60,9 @@ particular calls to non-Kobo specific endpoints such as the CalibreWeb book down
from
binascii
import
hexlify
from
datetime
import
datetime
from
os
import
urandom
import
os
from
flask
import
g
,
Blueprint
,
url_for
,
abort
from
flask
import
g
,
Blueprint
,
url_for
,
abort
,
request
from
flask_login
import
login_user
,
login_required
from
flask_babel
import
gettext
as
_
...
...
@@ -119,28 +120,37 @@ kobo_auth = Blueprint("kobo_auth", __name__, url_prefix="/kobo_auth")
@
kobo_auth
.
route
(
"/generate_auth_token/<int:user_id>"
)
@
login_required
def
generate_auth_token
(
user_id
):
# Invalidate any prevously generated Kobo Auth token for this user.
auth_token
=
ub
.
session
.
query
(
ub
.
RemoteAuthToken
)
.
filter
(
ub
.
RemoteAuthToken
.
user_id
==
user_id
)
.
filter
(
ub
.
RemoteAuthToken
.
token_type
==
1
)
.
first
()
if
not
auth_token
:
auth_token
=
ub
.
RemoteAuthToken
()
auth_token
.
user_id
=
user_id
auth_token
.
expiration
=
datetime
.
max
auth_token
.
auth_token
=
(
hexlify
(
urandom
(
16
)))
.
decode
(
"utf-8"
)
auth_token
.
token_type
=
1
ub
.
session
.
add
(
auth_token
)
ub
.
session
.
commit
()
return
render_title_template
(
"generate_kobo_auth_url.html"
,
title
=
_
(
u"Kobo Set-up"
),
kobo_auth_url
=
url_for
(
"kobo.TopLevelEndpoint"
,
auth_token
=
auth_token
.
auth_token
,
_external
=
True
),
)
host
=
':'
.
join
(
request
.
host
.
rsplit
(
':'
)[
0
:
-
1
])
if
host
==
'127.0.0.1'
or
host
.
lower
()
==
'localhost'
or
host
==
'[::ffff:7f00:1]'
:
warning
=
_
(
'PLease access calibre-web from non localhost to get valid api_endpoint for kobo device'
)
return
render_title_template
(
"generate_kobo_auth_url.html"
,
title
=
_
(
u"Kobo Set-up"
),
warning
=
warning
)
else
:
# Invalidate any prevously generated Kobo Auth token for this user.
auth_token
=
ub
.
session
.
query
(
ub
.
RemoteAuthToken
)
.
filter
(
ub
.
RemoteAuthToken
.
user_id
==
user_id
)
.
filter
(
ub
.
RemoteAuthToken
.
token_type
==
1
)
.
first
()
if
not
auth_token
:
auth_token
=
ub
.
RemoteAuthToken
()
auth_token
.
user_id
=
user_id
auth_token
.
expiration
=
datetime
.
max
auth_token
.
auth_token
=
(
hexlify
(
urandom
(
16
)))
.
decode
(
"utf-8"
)
auth_token
.
token_type
=
1
ub
.
session
.
add
(
auth_token
)
ub
.
session
.
commit
()
return
render_title_template
(
"generate_kobo_auth_url.html"
,
title
=
_
(
u"Kobo Set-up"
),
kobo_auth_url
=
url_for
(
"kobo.TopLevelEndpoint"
,
auth_token
=
auth_token
.
auth_token
,
_external
=
True
),
warning
=
False
)
@
kobo_auth
.
route
(
"/deleteauthtoken/<int:user_id>"
)
...
...
cps/templates/generate_kobo_auth_url.html
View file @
68936352
...
...
@@ -2,10 +2,10 @@
{% block body %}
<div
class=
"well"
>
<p>
{{_('Open the .kobo/Kobo eReader.conf file in a text editor and add (or edit):')}}
</a>
.
{{_('Open the .kobo/Kobo eReader.conf file in a text editor and add (or edit):')}}
</a>
</p>
<p>
{
{_('api_endpoint=')}}{{kobo_auth_url}
}
</a>
{
% if not warning %}{{_('api_endpoint=')}}{{kobo_auth_url}}{% else %}{{warning}}{% endif %
}
</a>
</p>
<p>
{{_('Please note that every visit to this current page invalidates any previously generated Authentication url for this user.')}}
</a>
...
...
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