Includes:
- compositor.app, compositor.session, compositor.session.app, compositor.audit.log models
- /web/compositor/{token,apps,launch,audit} HTTP controllers with JWT (HS256)
- CompositorService OWL service (reusable via useService('compositor'))
- CompositorCanvas OWL component (reusable canvas wrapper)
- Security: compositor_group_user, compositor_group_manager groups + ir.access.csv rules
- 5 demo apps pre-loaded (gnome-calculator, xterm, gtk4-demo, glxgears, featherpad)
- Audit log capturing JWT issuance + app launch events
- Stub mode: launching apps returns a stub SurfaceHandle when proxy isn't connected
- Tested against Odoo 20 + PostgreSQL 17
Author: 1bspace.com
Parent company: 1B Global
License: Proprietary (1B Space internal use)
47 lines
1.6 KiB
Python
47 lines
1.6 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""1B Space Compositor Core addon.
|
|
|
|
This package contains the backend models, controllers, and the OWL library
|
|
service/component registrations for the compositor.
|
|
|
|
Public Python API:
|
|
|
|
- :class:`compositor.app` — application catalog model
|
|
- :class:`compositor.session` — per-browser-tab session (mail.thread mixin)
|
|
- :class:`compositor.audit.log` — append-only audit log
|
|
- :class:`CompositorController` — HTTP controllers
|
|
|
|
Public JS API (via ``@one_os_compositor/*`` imports):
|
|
|
|
- ``@one_os_compositor/services/compositor_service`` — main service
|
|
- ``@one_os_compositor/components/compositor_canvas`` — canvas component
|
|
- ``@one_os_compositor/components/compositor_surface`` — single surface wrapper
|
|
"""
|
|
|
|
from . import models
|
|
from . import controllers
|
|
|
|
|
|
def _post_init_hook(env):
|
|
"""Called after the addon is installed.
|
|
|
|
Sets the default JWT secret if not already configured. The secret
|
|
is stored in ``ir.config_parameter`` so it can be rotated without
|
|
restarting Odoo.
|
|
|
|
:param env: Odoo environment.
|
|
"""
|
|
config_param = env["ir.config_parameter"]
|
|
if not config_param.get_str("compositor.jwt_secret"):
|
|
# Auto-generate a strong secret on first install
|
|
import secrets
|
|
secret = secrets.token_urlsafe(48)
|
|
config_param.set_str("compositor.jwt_secret", secret)
|
|
env["ir.logging"].sudo().create({
|
|
"name": "one_os_compositor",
|
|
"type": "server",
|
|
"level": "INFO",
|
|
"message": "Compositor JWT secret auto-generated on first install.",
|
|
"dbname": env.cr.dbname,
|
|
})
|