mirror of
https://github.com/dkmstr/openuds.git
synced 2025-01-05 09:17:54 +03:00
Updated user and admin interfaces
Updated download logic
This commit is contained in:
parent
dca747969e
commit
fa31a30ba2
@ -34,9 +34,11 @@ Author: Adolfo Gómez, dkmaster at dkmon dot com
|
|||||||
import os
|
import os
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
|
import typing
|
||||||
from wsgiref.util import FileWrapper
|
from wsgiref.util import FileWrapper
|
||||||
from django.http import HttpResponse, Http404, HttpRequest
|
from django.http import HttpResponse, Http404, HttpRequest
|
||||||
|
|
||||||
|
from uds.core import types
|
||||||
from uds.core.managers.crypto import CryptoManager
|
from uds.core.managers.crypto import CryptoManager
|
||||||
from uds.core.util import singleton
|
from uds.core.util import singleton
|
||||||
|
|
||||||
@ -55,7 +57,7 @@ class DownloadsManager(metaclass=singleton.Singleton):
|
|||||||
'application/x-msdos-program')
|
'application/x-msdos-program')
|
||||||
"""
|
"""
|
||||||
|
|
||||||
_downloadables: dict[str, dict[str, str]] = {}
|
_downloadables: dict[str, types.downloads.Downloadable]
|
||||||
|
|
||||||
def __init__(self) -> None:
|
def __init__(self) -> None:
|
||||||
super().__init__()
|
super().__init__()
|
||||||
@ -66,7 +68,7 @@ class DownloadsManager(metaclass=singleton.Singleton):
|
|||||||
# Singleton pattern will return always the same instance
|
# Singleton pattern will return always the same instance
|
||||||
return DownloadsManager()
|
return DownloadsManager()
|
||||||
|
|
||||||
def register(self, name: str, comment: str, path: str, mime: str = 'application/octet-stream') -> None:
|
def register(self, name: str, description: str, path: str, *, mimetype: str = 'application/octet-stream', legacy: bool = False) -> None:
|
||||||
"""
|
"""
|
||||||
Registers a downloadable file.
|
Registers a downloadable file.
|
||||||
@param name: name shown
|
@param name: name shown
|
||||||
@ -74,14 +76,15 @@ class DownloadsManager(metaclass=singleton.Singleton):
|
|||||||
@params zip: If download as zip
|
@params zip: If download as zip
|
||||||
"""
|
"""
|
||||||
_id = CryptoManager.manager().uuid(name)
|
_id = CryptoManager.manager().uuid(name)
|
||||||
self._downloadables[_id] = {
|
self._downloadables[_id] = types.downloads.Downloadable(
|
||||||
'name': name,
|
name=name,
|
||||||
'comment': comment,
|
description=description,
|
||||||
'path': path,
|
path=path,
|
||||||
'mime': mime,
|
mimetype=mimetype,
|
||||||
}
|
legacy=legacy,
|
||||||
|
)
|
||||||
|
|
||||||
def downloadables(self) -> dict[str, dict[str, str]]:
|
def downloadables(self) -> typing.Mapping[str, types.downloads.Downloadable]:
|
||||||
return self._downloadables
|
return self._downloadables
|
||||||
|
|
||||||
def send(self, request: 'HttpRequest', _id: str) -> HttpResponse:
|
def send(self, request: 'HttpRequest', _id: str) -> HttpResponse:
|
||||||
@ -90,9 +93,9 @@ class DownloadsManager(metaclass=singleton.Singleton):
|
|||||||
raise Http404
|
raise Http404
|
||||||
return self._send_file(
|
return self._send_file(
|
||||||
request,
|
request,
|
||||||
self._downloadables[_id]['name'],
|
self._downloadables[_id].name,
|
||||||
self._downloadables[_id]['path'],
|
self._downloadables[_id].path,
|
||||||
self._downloadables[_id]['mime'],
|
self._downloadables[_id].mimetype,
|
||||||
)
|
)
|
||||||
|
|
||||||
def _send_file(self, request: 'HttpRequest', name: str, filename: str, mime: str) -> HttpResponse:
|
def _send_file(self, request: 'HttpRequest', name: str, filename: str, mime: str) -> HttpResponse:
|
||||||
|
@ -34,6 +34,7 @@ from . import (
|
|||||||
auth,
|
auth,
|
||||||
calendar,
|
calendar,
|
||||||
connections,
|
connections,
|
||||||
|
downloads,
|
||||||
errors,
|
errors,
|
||||||
os,
|
os,
|
||||||
permissions,
|
permissions,
|
||||||
|
42
server/src/uds/core/types/downloads.py
Normal file
42
server/src/uds/core/types/downloads.py
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
#
|
||||||
|
# Copyright (c) 2024 Virtual Cable S.L.U.
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
# are permitted provided that the following conditions are met:
|
||||||
|
#
|
||||||
|
# * Redistributions of source code must retain the above copyright notice,
|
||||||
|
# this list of conditions and the following disclaimer.
|
||||||
|
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
# this list of conditions and the following disclaimer in the documentation
|
||||||
|
# and/or other materials provided with the distribution.
|
||||||
|
# * Neither the name of Virtual Cable S.L.U. nor the names of its contributors
|
||||||
|
# may be used to endorse or promote products derived from this software
|
||||||
|
# without specific prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||||
|
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||||
|
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
"""
|
||||||
|
Author: Adolfo Gómez, dkmaster at dkmon dot com
|
||||||
|
"""
|
||||||
|
import dataclasses
|
||||||
|
|
||||||
|
@dataclasses.dataclass
|
||||||
|
class Downloadable:
|
||||||
|
name: str
|
||||||
|
description: str
|
||||||
|
path: str
|
||||||
|
mimetype: str
|
||||||
|
legacy: bool
|
||||||
|
|
@ -52,14 +52,14 @@ downloads_manager().register(
|
|||||||
f'udsactor_{VERSION}_all.deb',
|
f'udsactor_{VERSION}_all.deb',
|
||||||
_('UDS Actor for Debian, Ubuntu, ... Linux machines <b>(Requires python >= 3.9)</b>'),
|
_('UDS Actor for Debian, Ubuntu, ... Linux machines <b>(Requires python >= 3.9)</b>'),
|
||||||
_mypath + f'/files/udsactor_{VERSION}_all.deb',
|
_mypath + f'/files/udsactor_{VERSION}_all.deb',
|
||||||
'application/x-debian-package',
|
mimetype='application/x-debian-package',
|
||||||
)
|
)
|
||||||
|
|
||||||
downloads_manager().register(
|
downloads_manager().register(
|
||||||
f'udsactor-{VERSION}-1.noarch.rpm',
|
f'udsactor-{VERSION}-1.noarch.rpm',
|
||||||
_('UDS Actor for Centos, Fedora, RH, Suse, ... Linux machines <b>(Requires python >= 3.9)</b>'),
|
_('UDS Actor for Centos, Fedora, RH, Suse, ... Linux machines <b>(Requires python >= 3.9)</b>'),
|
||||||
_mypath + f'/files/udsactor-{VERSION}-1.noarch.rpm',
|
_mypath + f'/files/udsactor-{VERSION}-1.noarch.rpm',
|
||||||
'application/x-redhat-package-manager',
|
mimetype='application/x-redhat-package-manager',
|
||||||
)
|
)
|
||||||
|
|
||||||
downloads_manager().register(
|
downloads_manager().register(
|
||||||
@ -68,7 +68,7 @@ downloads_manager().register(
|
|||||||
'UDS Actor for Debian based Linux machines. Used ONLY for static machines. <b>(Requires python >= 3.9)</b>'
|
'UDS Actor for Debian based Linux machines. Used ONLY for static machines. <b>(Requires python >= 3.9)</b>'
|
||||||
),
|
),
|
||||||
_mypath + f'/files/udsactor-unmanaged_{VERSION}_all.deb',
|
_mypath + f'/files/udsactor-unmanaged_{VERSION}_all.deb',
|
||||||
'application/x-debian-package',
|
mimetype='application/x-debian-package',
|
||||||
)
|
)
|
||||||
|
|
||||||
downloads_manager().register(
|
downloads_manager().register(
|
||||||
@ -77,6 +77,6 @@ downloads_manager().register(
|
|||||||
'UDS Actor for Centos, Fedora, RH, Suse, ... Linux machines. Used ONLY for static machines. <b>(Requires python >= 3.9)</b>'
|
'UDS Actor for Centos, Fedora, RH, Suse, ... Linux machines. Used ONLY for static machines. <b>(Requires python >= 3.9)</b>'
|
||||||
),
|
),
|
||||||
_mypath + f'/files/udsactor-unmanaged-{VERSION}-1.noarch.rpm',
|
_mypath + f'/files/udsactor-unmanaged-{VERSION}-1.noarch.rpm',
|
||||||
'application/x-redhat-package-manager',
|
mimetype='application/x-redhat-package-manager',
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -51,12 +51,12 @@ managers.downloads_manager().register(
|
|||||||
f'UDSActorSetup-{VERSION}.exe',
|
f'UDSActorSetup-{VERSION}.exe',
|
||||||
_('UDS Actor for windows machines'),
|
_('UDS Actor for windows machines'),
|
||||||
_mypath + f'/files/UDSActorSetup-{VERSION}.exe',
|
_mypath + f'/files/UDSActorSetup-{VERSION}.exe',
|
||||||
'application/vnd.microsoft.portable-executable',
|
mimetype='application/vnd.microsoft.portable-executable',
|
||||||
)
|
)
|
||||||
|
|
||||||
managers.downloads_manager().register(
|
managers.downloads_manager().register(
|
||||||
f'UDSActorUnmanagedSetup-{VERSION}.exe',
|
f'UDSActorUnmanagedSetup-{VERSION}.exe',
|
||||||
_('UDS Actor for Unmanaged windows machines. Used ONLY for static machines.'),
|
_('UDS Actor for Unmanaged windows machines. Used ONLY for static machines.'),
|
||||||
_mypath + f'/files/UDSActorUnmanagedSetup-{VERSION}.exe',
|
_mypath + f'/files/UDSActorUnmanagedSetup-{VERSION}.exe',
|
||||||
'application/vnd.microsoft.portable-executable',
|
mimetype='application/vnd.microsoft.portable-executable',
|
||||||
)
|
)
|
||||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -102,6 +102,6 @@
|
|||||||
</svg>
|
</svg>
|
||||||
</div>
|
</div>
|
||||||
</uds-root>
|
</uds-root>
|
||||||
<link rel="modulepreload" href="/uds/res/admin/chunk-73GRIXMY.js?stamp=1726504179" integrity="sha384-Fpv0IdDryEri8NL538mQTvQZuUECB0hfUOg4tD6kZBiqZQ3FcrF5c0zhJzv7Jo4U"><script src="/uds/res/admin/polyfills.js?stamp=1726504179" type="module" crossorigin="anonymous" integrity="sha384-TVRkn44wOGJBeCKWJBHWLvXubZ+Julj/yA0OoEFa3LgJHVHaPeeATX6NcjuNgsIA"></script><script src="/uds/res/admin/main.js?stamp=1726504179" type="module" crossorigin="anonymous" integrity="sha384-nCeugctkRurEmWqhkTrHftQYKE7YgvMaq4t6/6LGfAqiwhIjzH5UbXdR6abHAN0S"></script></body>
|
<link rel="modulepreload" href="/uds/res/admin/chunk-73GRIXMY.js?stamp=1727363038" integrity="sha384-Fpv0IdDryEri8NL538mQTvQZuUECB0hfUOg4tD6kZBiqZQ3FcrF5c0zhJzv7Jo4U"><script src="/uds/res/admin/polyfills.js?stamp=1727363038" type="module" crossorigin="anonymous" integrity="sha384-TVRkn44wOGJBeCKWJBHWLvXubZ+Julj/yA0OoEFa3LgJHVHaPeeATX6NcjuNgsIA"></script><script src="/uds/res/admin/main.js?stamp=1727363038" type="module" crossorigin="anonymous" integrity="sha384-yoO6CHaYaHwauEU0EYuLYArKCtNaiUuN4QzkRFDc85sAz6zv/DTY5bTob6pwBEe9"></script></body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
@ -109,6 +109,6 @@
|
|||||||
</svg>
|
</svg>
|
||||||
</div>
|
</div>
|
||||||
</uds-root>
|
</uds-root>
|
||||||
<script src="/uds/res/modern/polyfills.js" type="module" crossorigin="anonymous" integrity="sha384-gjZXw6bYB+td6SIdruY5JyqQBkqxY+puwSPNXlrc1Fu5fcv6y+sthRBgUlAL3EJp"></script><script src="/uds/res/modern/scripts.js" defer crossorigin="anonymous" integrity="sha384-gJ6CPuwXlJNL6wOYMLzD98cFi988rpY6Ln6S+UhAkZs84+MOQ+ws+0qgV4WicE5i"></script><script src="/uds/res/modern/main.js" type="module" crossorigin="anonymous" integrity="sha384-3VkmDnTsGPF2e/Fj+vdKHFJYmtxfimxEzlMUwma8aXpzQqcEwxRX2xpD4d+TOzp1"></script></body>
|
<script src="/uds/res/modern/polyfills.js" type="module" crossorigin="anonymous" integrity="sha384-gjZXw6bYB+td6SIdruY5JyqQBkqxY+puwSPNXlrc1Fu5fcv6y+sthRBgUlAL3EJp"></script><script src="/uds/res/modern/scripts.js" defer crossorigin="anonymous" integrity="sha384-gJ6CPuwXlJNL6wOYMLzD98cFi988rpY6Ln6S+UhAkZs84+MOQ+ws+0qgV4WicE5i"></script><script src="/uds/res/modern/main.js" type="module" crossorigin="anonymous" integrity="sha384-VOPdy8egqxyAkOsPhDQQ1AJbecy42gTvZxEEk7hXnl7NXz2BVEUg8+9NyBgVBXgm"></script></body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
@ -185,7 +185,7 @@ def uds_js(request: 'ExtendedHttpRequest') -> str:
|
|||||||
('UDSClient-{version}.pkg', gettext('Mac OS X client'), 'MacOS', False),
|
('UDSClient-{version}.pkg', gettext('Mac OS X client'), 'MacOS', False),
|
||||||
(
|
(
|
||||||
'udsclient3_{version}_all.deb',
|
'udsclient3_{version}_all.deb',
|
||||||
gettext('Debian based Linux client') + ' ' + gettext('(requires Python-3.6 or newer)'),
|
gettext('Debian based Linux client') + ' ' + gettext('(requires Python-3.9 or newer)'),
|
||||||
'Linux',
|
'Linux',
|
||||||
False,
|
False,
|
||||||
),
|
),
|
||||||
@ -193,7 +193,7 @@ def uds_js(request: 'ExtendedHttpRequest') -> str:
|
|||||||
'udsclient3-{version}-1.noarch.rpm',
|
'udsclient3-{version}-1.noarch.rpm',
|
||||||
gettext('RPM based Linux client (Fedora, Suse, ...)')
|
gettext('RPM based Linux client (Fedora, Suse, ...)')
|
||||||
+ ' '
|
+ ' '
|
||||||
+ gettext('(requires Python-3.6 or newer)'),
|
+ gettext('(requires Python-3.9 or newer)'),
|
||||||
'Linux',
|
'Linux',
|
||||||
False,
|
False,
|
||||||
),
|
),
|
||||||
@ -205,13 +205,13 @@ def uds_js(request: 'ExtendedHttpRequest') -> str:
|
|||||||
),
|
),
|
||||||
(
|
(
|
||||||
'udsclient3-armhf-{version}.tar.gz',
|
'udsclient3-armhf-{version}.tar.gz',
|
||||||
gettext('Binary appimage Raspberry Linux client'),
|
gettext('Binary appimage ARMHF Linux client (Raspberry, ...)'),
|
||||||
'Linux',
|
'Linux',
|
||||||
False,
|
False,
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
'udsclient3-{version}.tar.gz',
|
'udsclient3-{version}.tar.gz',
|
||||||
gettext('Generic .tar.gz Linux client') + ' ' + gettext('(requires Python-3.6 or newer)'),
|
gettext('Generic .tar.gz Linux client') + ' ' + gettext('(requires Python-3.9 or newer)'),
|
||||||
'Linux',
|
'Linux',
|
||||||
False,
|
False,
|
||||||
),
|
),
|
||||||
@ -226,7 +226,7 @@ def uds_js(request: 'ExtendedHttpRequest') -> str:
|
|||||||
# 'legacy': False # True = Gray, False = White
|
# 'legacy': False # True = Gray, False = White
|
||||||
# })
|
# })
|
||||||
|
|
||||||
actors: list[dict[str, str]] = []
|
actors: list[dict[str, str|bool]] = []
|
||||||
|
|
||||||
if user and user.is_staff(): # Add staff things
|
if user and user.is_staff(): # Add staff things
|
||||||
# If is admin (informational, REST api checks users privileges anyway...)
|
# If is admin (informational, REST api checks users privileges anyway...)
|
||||||
@ -238,8 +238,9 @@ def uds_js(request: 'ExtendedHttpRequest') -> str:
|
|||||||
actors = [
|
actors = [
|
||||||
{
|
{
|
||||||
'url': reverse('utility.downloader', kwargs={'download_id': key}),
|
'url': reverse('utility.downloader', kwargs={'download_id': key}),
|
||||||
'name': val['name'],
|
'name': val.name,
|
||||||
'description': gettext(val['comment']),
|
'description': val.description,
|
||||||
|
'legacy': val.legacy,
|
||||||
}
|
}
|
||||||
for key, val in downloads_manager().downloadables().items()
|
for key, val in downloads_manager().downloadables().items()
|
||||||
]
|
]
|
||||||
|
Loading…
Reference in New Issue
Block a user