Skip to content

Commit 4505ee4

Browse files
committed
re-add VT endpoints
1 parent 75be6ea commit 4505ee4

File tree

2 files changed

+71
-73
lines changed

2 files changed

+71
-73
lines changed

getwvkeys/libraries.py

+25-25
Original file line numberDiff line numberDiff line change
@@ -487,33 +487,33 @@ def run(self, curl=False):
487487

488488
return jsonify(output)
489489

490-
# def vinetrimmer(self, library: Library):
491-
# if self.response is None:
492-
# wvdecrypt = WvDecrypt(self.pssh, deviceconfig.DeviceConfig(library, self.buildinfo))
493-
# challenge = wvdecrypt.create_challenge()
494-
# if len(wv_sessions) > config.MAX_SESSIONS:
495-
# # remove the oldest session
496-
# wv_sessions.pop(next(iter(wv_sessions)))
497-
# self.session_id = wvdecrypt.session.hex()
498-
# wv_sessions[self.session_id] = wvdecrypt
499-
500-
# res = base64.b64encode(challenge).decode()
501-
# return {"challenge": res, "session_id": self.session_id}
502-
# else:
503-
# if self.session_id not in wv_sessions:
504-
# raise BadRequest("Session not found, did you generate a challenge first?")
505-
# wvdecrypt = wv_sessions[self.session_id]
506-
# wvdecrypt.decrypt_license(self.response)
507-
# for _, y in enumerate(wvdecrypt.get_content_key()):
508-
# (kid, _) = y.split(":")
509-
# self.content_keys.append(CachedKey(kid, self.time, self.user_id, self.license_url, y))
510-
# keys = self._cache_keys(vt=True)
511-
# # close the session
512-
# wvdecrypt.close_session()
513-
# return {"keys": keys, "session_id": self.session_id}
490+
def vinetrimmer(self, library: Library):
491+
if self.response is None:
492+
wvdecrypt = WvDecrypt(self.pssh, deviceconfig.DeviceConfig(library, self.buildinfo))
493+
challenge = wvdecrypt.create_challenge()
494+
if len(wv_sessions) > config.MAX_SESSIONS:
495+
# remove the oldest session
496+
wv_sessions.pop(next(iter(wv_sessions)))
497+
self.session_id = wvdecrypt.session.hex()
498+
wv_sessions[self.session_id] = wvdecrypt
499+
500+
res = base64.b64encode(challenge).decode()
501+
return {"challenge": res, "session_id": self.session_id}
502+
else:
503+
if self.session_id not in wv_sessions:
504+
raise BadRequest("Session not found, did you generate a challenge first?")
505+
wvdecrypt = wv_sessions[self.session_id]
506+
wvdecrypt.decrypt_license(self.response)
507+
for _, y in enumerate(wvdecrypt.get_content_key()):
508+
(kid, _) = y.split(":")
509+
self.content_keys.append(CachedKey(kid, self.time, self.user_id, self.license_url, y))
510+
keys = self._cache_keys(vt=True)
511+
# close the session
512+
wvdecrypt.close_session()
513+
return {"keys": keys, "session_id": self.session_id}
514514

515515
def _cache_keys(self, vt=False):
516-
# self.library.cache_keys(self.content_keys)
516+
self.library.cache_keys(self.content_keys)
517517

518518
# return a list of dicts containing kid and key, this is what vinetrimmer expects
519519
if vt:

getwvkeys/main.py

+46-48
Original file line numberDiff line numberDiff line change
@@ -365,53 +365,51 @@ def api():
365365
return render_template("api.html", current_user=current_user, website_version=sha)
366366

367367

368-
# @app.route("/vinetrimmer", methods=["POST"])
369-
# def vinetrimmer():
370-
# event_data = request.get_json()
371-
# # validate the request body
372-
# if not validators.vinetrimmer_validator(event_data):
373-
# return jsonify({"status_code": 400, "message": "Malformed Body"})
374-
375-
# # get the data
376-
# (method, params, token) = (event_data["method"], event_data["params"], event_data["token"])
377-
# user = FlaskUser.get_user_by_api_key(db, token)
378-
# if not user:
379-
# return jsonify({"status_code": 401, "message": "Invalid API Key"})
380-
381-
# if not user.flags.has(UserFlags.VINETRIMMER):
382-
# return jsonify({"status_code": 403, "message": "Missing Access"})
383-
384-
# if method == "GetKeysX":
385-
# # Validate params required for method
386-
# if not validators.key_exchange_validator(params):
387-
# return jsonify({"status_code": 400, "message": "Malformed Params"})
388-
# return jsonify({"status_code": 501, "message": "Method Not Implemented"})
389-
# elif method == "GetKeys":
390-
# # Validate params required for method
391-
# if not validators.keys_validator(params):
392-
# return jsonify({"status_code": 400, "message": "Malformed Params"})
393-
# (cdmkeyresponse, session_id) = (params["cdmkeyresponse"], params["session_id"])
394-
# magic = libraries.Pywidevine(
395-
# library, user.id, license_response=cdmkeyresponse, session_id=session_id, buildinfo=None
396-
# )
397-
# res = magic.vinetrimmer(library)
398-
# return jsonify({"status_code": 200, "message": res})
399-
# elif method == "GetChallenge":
400-
# # Validate params required for method
401-
# if not validators.challenge_validator(params):
402-
# return jsonify({"status_code": 400, "message": "Malformed Params"})
403-
# (init, cert, raw, licensetype, device) = (
404-
# params["init"],
405-
# params["cert"],
406-
# params["raw"],
407-
# params["licensetype"],
408-
# params["device"],
409-
# )
410-
# magic = libraries.Pywidevine(library, user.id, pssh=init, buildinfo=device, server_certificate=cert)
411-
# res = magic.vinetrimmer(library)
412-
# return jsonify({"status_code": 200, "message": res})
413-
414-
# return jsonify({"status_code": 400, "message": "Invalid Method"})
368+
@app.route("/vinetrimmer", methods=["POST"])
369+
def vinetrimmer():
370+
event_data = request.get_json()
371+
# validate the request body
372+
if not validators.vinetrimmer_validator(event_data):
373+
return jsonify({"status_code": 400, "message": "Malformed Body"})
374+
375+
# get the data
376+
(method, params, token) = (event_data["method"], event_data["params"], event_data["token"])
377+
user = FlaskUser.get_user_by_api_key(db, token)
378+
if not user:
379+
return jsonify({"status_code": 401, "message": "Invalid API Key"})
380+
381+
if not user.flags.has(UserFlags.VINETRIMMER):
382+
return jsonify({"status_code": 403, "message": "Missing Access"})
383+
384+
if method == "GetKeysX":
385+
# Validate params required for method
386+
if not validators.key_exchange_validator(params):
387+
return jsonify({"status_code": 400, "message": "Malformed Params"})
388+
return jsonify({"status_code": 501, "message": "Method Not Implemented"})
389+
elif method == "GetKeys":
390+
# Validate params required for method
391+
if not validators.keys_validator(params):
392+
return jsonify({"status_code": 400, "message": "Malformed Params"})
393+
(cdmkeyresponse, session_id) = (params["cdmkeyresponse"], params["session_id"])
394+
magic = libraries.Pywidevine(library, user.id, response=cdmkeyresponse, session_id=session_id, buildinfo=None)
395+
res = magic.vinetrimmer(library)
396+
return jsonify({"status_code": 200, "message": res})
397+
elif method == "GetChallenge":
398+
# Validate params required for method
399+
if not validators.challenge_validator(params):
400+
return jsonify({"status_code": 400, "message": "Malformed Params"})
401+
(init, cert, raw, licensetype, device) = (
402+
params["init"],
403+
params["cert"],
404+
params["raw"],
405+
params["licensetype"],
406+
params["device"],
407+
)
408+
magic = libraries.Pywidevine(library, user.id, pssh=init, buildinfo=device, server_certificate=cert)
409+
res = magic.vinetrimmer(library)
410+
return jsonify({"status_code": 200, "message": res})
411+
412+
return jsonify({"status_code": 400, "message": "Invalid Method"})
415413

416414

417415
@app.route("/vault", methods=["GET"])
@@ -444,7 +442,7 @@ def vault():
444442
else:
445443
keys = [{"key": f"{kid}:{key}", "license_url": f"https://{service}/"}]
446444
library.add_keys(keys=keys, user_id=current_user.id)
447-
return jsonify({"message": "added in database.", "inserted": True, "status_code": 200})
445+
return jsonify({"message": "Added", "inserted": True, "status_code": 200})
448446

449447

450448
# auth endpoints

0 commit comments

Comments
 (0)