add admin section to select groups allowed to print

This commit is contained in:
Simon Vieille 2020-11-20 15:45:11 +01:00
parent f854accbcc
commit 497a9f4892
Signed by: deblan
GPG key ID: 03383D15A1D31745
8 changed files with 309 additions and 4 deletions

View file

@ -28,6 +28,10 @@
<bugs>https://github.com/e-alfred/nextcloud-printer/issues</bugs>
<screenshot>https://github.com/e-alfred/nextcloud-printer/raw/master/screenshots/printer.gif</screenshot>
<dependencies>
<nextcloud min-version="16" max-version="19" />
<nextcloud min-version="17" max-version="19" />
</dependencies>
<settings>
<admin>OCA\Printer\Settings\Admin\AllowedGroups</admin>
<admin-section>OCA\Printer\Settings\Admin\Section</admin-section>
</settings>
</info>

3
css/admin.css Normal file
View file

@ -0,0 +1,3 @@
#printer_admin input {
vertical-align: middle;
}

65
js/admin.js Normal file
View file

@ -0,0 +1,65 @@
let elements = []
const selector = '#printer-message';
const appConfig = (name, value, callbacks) => {
OCP.AppConfig.setValue('printer', name, value, callbacks)
}
const saveSettings = (key) => {
const element = elements.get(key)
let value
let name
if (jQuery(element).is('[data-checkbox]')) {
name = jQuery(element).attr('data-name')
const inputs = jQuery('input[name="' + name + '[]"]:checked')
value = []
inputs.each((i, v) => {
value.push(v.value)
})
value = JSON.stringify(value)
} else {
name = jQuery(element).attr('name')
value = jQuery(element).val()
}
const size = elements.length
if (name === 'cache') {
++value
}
const callbacks = {
success: () => {
OC.msg.finishedSuccess(
selector,
t('printer', (key + 1) + '/' + size)
)
if (key < size - 1) {
saveSettings(++key)
} else {
OC.msg.finishedSuccess(selector, t('printer', 'Saved'))
}
},
error: () => {
OC.msg.finishedError(selector, t('printer', 'Error while saving "' + element + '"'))
}
}
appConfig(name, value, callbacks)
}
jQuery(document).ready(() => {
elements = jQuery('.printer-setting')
jQuery('#printer-save').on('click', (event) => {
event.preventDefault()
OC.msg.startSaving(selector)
saveSettings(0)
});
});

66
lib/Config.php Normal file
View file

@ -0,0 +1,66 @@
<?php
declare(strict_types=1);
namespace OCA\Printer;
use OCP\AppFramework\Utility\ITimeFactory;
use OCP\IConfig;
use OCP\IGroupManager;
use OCP\IUser;
use OCP\Security\ISecureRandom;
class Config
{
/**
* @var IConfig
*/
protected $config;
/**
* @var ITimeFactory
*/
protected $timeFactory;
/**
* @var IGroupManager
*/
private $groupManager;
/**
* @var ISecureRandom
*/
private $secureRandom;
public function __construct(IConfig $config, ISecureRandom $secureRandom, IGroupManager $groupManager, ITimeFactory $timeFactory)
{
$this->config = $config;
$this->secureRandom = $secureRandom;
$this->groupManager = $groupManager;
$this->timeFactory = $timeFactory;
}
/**
* @return string[]
*/
public function getAllowedGroupIds(): array
{
$groups = $this->config->getAppValue('printer', 'allowed_groups', '[]');
$groups = json_decode($groups, true);
return \is_array($groups) ? $groups : [];
}
public function isDisabledForUser(IUser $user): bool
{
$allowedGroups = $this->getAllowedGroupIds();
if (empty($allowedGroups)) {
return false;
}
$userGroups = $this->groupManager->getUserGroupIds($user);
return empty(array_intersect($allowedGroups, $userGroups));
}
}

View file

@ -2,11 +2,12 @@
namespace OCA\Printer\Controller;
use OCA\Printer\Config;
use OCA\Printer\Service\Printer;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\JSONResponse;
use OCP\IRequest;
use Symfony\Component\Process\Process;
use OCA\Printer\Service\Printer;
use OCP\IUserSession;
use Symfony\Component\Process\Exception\ProcessFailedException;
class PrinterController extends Controller
@ -21,12 +22,18 @@ class PrinterController extends Controller
*/
protected $printer;
public function __construct(string $appName, IRequest $request, Printer $printer)
/**
* @var Config
*/
protected $config;
public function __construct(string $appName, IRequest $request, Printer $printer, Config $config)
{
parent::__construct($appName, $request);
$this->language = \OC::$server->getL10N('printer');
$this->printer = $printer;
$this->config = $config;
}
/**
@ -46,6 +53,17 @@ class PrinterController extends Controller
'msg' => $this->language->t('Print failed'),
];
$notAllowed = [
'response' => 'error',
'msg' => $this->language->t('User not allowed'),
];
$user = \OC::$server[IUserSession::class]->getUser();
if (!$user || $this->config->isDisabledForUser($user)) {
return new JSONResponse($notAllowed);
}
if (!$this->printer->isValidOrirentation($orientation)) {
return new JSONResponse($error);
}

View file

@ -0,0 +1,63 @@
<?php
declare(strict_types=1);
namespace OCA\Printer\Settings\Admin;
use OCA\Printer\Config;
use OCP\AppFramework\Http\TemplateResponse;
use OCP\IGroupManager;
use OCP\IInitialStateService;
use OCP\Settings\ISettings;
class AllowedGroups implements ISettings
{
/**
* @var Config
*/
private $config;
/**
* @var IInitialStateService
*/
private $initialStateService;
/**
* @var IGroupManager
*/
private $groupManager;
public function __construct(Config $config, IInitialStateService $initialStateService, IGroupManager $groupManager)
{
$this->config = $config;
$this->initialStateService = $initialStateService;
$this->groupManager = $groupManager;
}
public function getForm(): TemplateResponse
{
$this->initialStateService->provideInitialState(
'printer',
'allowed_groups',
$this->config->getAllowedGroupIds()
);
$groups = $this->groupManager->search('', 100);
$allowedGroups = $this->config->getAllowedGroupIds();
return new TemplateResponse('printer', 'settings/admin/allowed-groups', [
'groups' => $groups,
'allowedGroups' => $allowedGroups,
], '');
}
public function getSection(): string
{
return 'printer';
}
public function getPriority(): int
{
return 10;
}
}

View file

@ -0,0 +1,48 @@
<?php
declare(strict_types=1);
namespace OCA\Printer\Settings\Admin;
use OCP\IL10N;
use OCP\IURLGenerator;
use OCP\Settings\IIconSection;
class Section implements IIconSection
{
/**
* @var IL10N
*/
private $l;
/**
* @var IURLGenerator
*/
private $url;
public function __construct(IURLGenerator $url, IL10N $l)
{
$this->url = $url;
$this->l = $l;
}
public function getIcon(): string
{
return $this->url->imagePath('spreed', 'app-dark.svg');
}
public function getID(): string
{
return 'printer';
}
public function getName(): string
{
return $this->l->t('Printer');
}
public function getPriority(): int
{
return 70;
}
}

View file

@ -0,0 +1,38 @@
<?php
style('printer', 'admin');
script('printer', 'admin');
?>
<div id="printer_admin">
<div class="section">
<h2><?php p($l->t('Limit to groups')) ?></h2>
<p class="settings-hint">
<?php p($l->t('When at least one group is selected, only people of the listed groups can print.')); ?>
</p>
<ul class="printer-setting" data-name="allowed_groups" data-checkbox>
<?php foreach ($_['groups'] as $group): ?>
<li>
<input
type="checkbox"
id="allowed_group_<?php echo $group->getGid() ?>"
name="allowed_groups[]"
value="<?php p($group->getGid()) ?>"
<?php if (in_array($group->getGid(), $_['allowedGroups'])): ?>
checked
<?php endif ?>
>
<label for="allowed_group_<?php echo $group->getGid() ?>">
<?php p($group->getDisplayName()) ?>
</label>
</li>
<?php endforeach ?>
</ul>
<button id="printer-save" class="btn btn-info">
<?php p($l->t('Save')); ?>
</button>
<span id="printer-message" class="msg"></span>
</div>
</div>