diff --git a/frontend/src/components/configurationForm/index.tsx b/frontend/src/components/configurationForm/index.tsx index fe4de86..819e801 100644 --- a/frontend/src/components/configurationForm/index.tsx +++ b/frontend/src/components/configurationForm/index.tsx @@ -1,6 +1,6 @@ import { FC } from 'react'; import { zodResolver } from '@hookform/resolvers/zod'; -import { encode as base64_encode } from 'js-base64'; +import { Base64 } from 'js-base64'; import { useForm } from 'react-hook-form'; import { v4 as uuidv4 } from 'uuid'; import { @@ -49,7 +49,7 @@ const ConfigurationForm: FC = ({ servers }) => { sections.find((s) => s.key === item.key), ); - const encodedConfiguration = base64_encode(JSON.stringify(configuration)); + const encodedConfiguration = Base64.encodeURI(JSON.stringify(configuration)); const addonUrl = `${window.location.origin}/${uuidv4()}/${encodedConfiguration}/manifest.json`; if (event.nativeEvent.submitter.name === 'clipboard') { diff --git a/plexio/dependencies.py b/plexio/dependencies.py index 1801221..cd7f1e8 100644 --- a/plexio/dependencies.py +++ b/plexio/dependencies.py @@ -15,11 +15,17 @@ def get_http_client(request: Request) -> ClientSession: def get_cache(request: Request): return request.state.cache +def base64_url_decode(base64_cfg: str) -> bytes: + padding = len(base64_cfg) % 4 + if padding: + base64_cfg += '=' * (4 - padding) + + return base64.urlsafe_b64decode(base64_cfg) def get_addon_configuration(base64_cfg: str | None = None) -> AddonConfiguration | None: if base64_cfg is None: return None - decoded = base64.b64decode(base64_cfg) + decoded = base64_url_decode(base64_cfg) configuration = AddonConfiguration(**json.loads(decoded)) return configuration