Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 20 additions & 9 deletions apps/files_external/lib/Controller/AjaxController.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,12 @@
use OCA\Files_External\Lib\Auth\Password\GlobalAuth;
use OCA\Files_External\Lib\Auth\PublicKey\RSA;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\Attribute\NoAdminRequired;
use OCP\AppFramework\Http\Attribute\PasswordConfirmationRequired;
use OCP\AppFramework\Http\JSONResponse;
use OCP\IGroupManager;
use OCP\IL10N;
use OCP\IRequest;
use OCP\IUserSession;

Expand All @@ -32,6 +34,7 @@ public function __construct(
private GlobalAuth $globalAuth,
private IUserSession $userSession,
private IGroupManager $groupManager,
private IL10N $l10n,
) {
parent::__construct($appName, $request);
}
Expand All @@ -56,27 +59,30 @@ private function generateSshKeys($keyLength) {
#[NoAdminRequired]
public function getSshKeys($keyLength = 1024) {
$key = $this->generateSshKeys($keyLength);
return new JSONResponse(
['data' => [
return new JSONResponse([
'data' => [
'private_key' => $key['privatekey'],
'public_key' => $key['publickey']
],
'status' => 'success'
]);
'status' => 'success',
]);
}

/**
* @param string $uid
* @param string $user
* @param string $password
* @return bool
* @return JSONResponse
*/
#[NoAdminRequired]
#[PasswordConfirmationRequired(strict: true)]
public function saveGlobalCredentials($uid, $user, $password) {
public function saveGlobalCredentials($uid, $user, $password): JSONResponse {
$currentUser = $this->userSession->getUser();
if ($currentUser === null) {
return false;
return new JSONResponse([
'status' => 'error',
'message' => $this->l10n->t('You are not logged in'),
], Http::STATUS_UNAUTHORIZED);
}

// Non-admins can only edit their own credentials
Expand All @@ -87,9 +93,14 @@ public function saveGlobalCredentials($uid, $user, $password) {

if ($allowedToEdit) {
$this->globalAuth->saveAuth($uid, $user, $password);
return true;
return new JSONResponse([
'status' => 'success',
]);
}

return false;
return new JSONResponse([
'status' => 'success',
'message' => $this->l10n->t('Permission denied'),
], Http::STATUS_FORBIDDEN);
}
}
41 changes: 26 additions & 15 deletions apps/files_external/src/settings.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/

import axios from '@nextcloud/axios'
import { t } from '@nextcloud/l10n'
import { addPasswordConfirmationInterceptors, PwdConfirmationMode } from '@nextcloud/password-confirmation'
import { generateUrl } from '@nextcloud/router'
import { showError } from '@nextcloud/dialogs'
import { t } from '@nextcloud/l10n'
import axios, { isAxiosError } from '@nextcloud/axios'

import jQuery from 'jquery'

Expand All @@ -15,7 +17,7 @@
/**
* Returns the selection of applicable users in the given configuration row
*
* @param $row configuration row

Check warning on line 20 in apps/files_external/src/settings.js

View workflow job for this annotation

GitHub Actions / NPM lint

Missing JSDoc @param "$row" type
* @return array array of user names
*/
function getSelection($row) {
Expand Down Expand Up @@ -1522,21 +1524,30 @@
const uid = $form.find('[name=uid]').val()
const user = $form.find('[name=username]').val()
const password = $form.find('[name=password]').val()
await axios.request({
method: 'POST',
data: JSON.stringify({
uid,
user,
password,
}),
url: OC.generateUrl('apps/files_external/globalcredentials'),
confirmPassword: PwdConfirmationMode.Strict,
})

$submit.val(t('files_external', 'Saved'))
setTimeout(function() {
try {
await axios.request({
method: 'POST',
data: {
uid,
user,
password,
},
url: generateUrl('apps/files_external/globalcredentials'),
confirmPassword: PwdConfirmationMode.Strict,
})

$submit.val(t('files_external', 'Saved'))
setTimeout(function() {
$submit.val(t('files_external', 'Save'))
}, 2500)
} catch (error) {
$submit.val(t('files_external', 'Save'))
}, 2500)
if (isAxiosError(error)) {
const message = error.response?.data?.message || t('files_external', 'Failed to save global credentials')
showError(t('files_external', 'Failed to save global credentials: {message}', { message }))
}
}

return false
})
Expand Down
30 changes: 25 additions & 5 deletions apps/files_external/tests/Controller/AjaxControllerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
use OCA\Files_External\Lib\Auth\PublicKey\RSA;
use OCP\AppFramework\Http\JSONResponse;
use OCP\IGroupManager;
use OCP\IL10N;
use OCP\IRequest;
use OCP\IUser;
use OCP\IUserSession;
Expand All @@ -28,6 +29,8 @@ class AjaxControllerTest extends TestCase {
private $groupManager;
/** @var AjaxController */
private $ajaxController;
/** @var IL10N */
private $l10n;

protected function setUp(): void {
$this->request = $this->createMock(IRequest::class);
Expand All @@ -39,16 +42,27 @@ protected function setUp(): void {
->getMock();
$this->userSession = $this->createMock(IUserSession::class);
$this->groupManager = $this->createMock(IGroupManager::class);
$this->l10n = $this->createMock(IL10N::class);

$this->ajaxController = new AjaxController(
'files_external',
$this->request,
$this->rsa,
$this->globalAuth,
$this->userSession,
$this->groupManager
$this->groupManager,
$this->l10n,
);

$this->l10n->expects($this->any())
->method('t')
->willReturnCallback(function ($string, $args) {
if (!is_array($args)) {
$args = [$args];
}
return vsprintf($string, $args);
});

parent::setUp();
}

Expand Down Expand Up @@ -87,7 +101,9 @@ public function testSaveGlobalCredentialsAsAdminForAnotherUser(): void {
->expects($this->never())
->method('saveAuth');

$this->assertSame(false, $this->ajaxController->saveGlobalCredentials('UidOfTestUser', 'test', 'password'));
$response = $this->ajaxController->saveGlobalCredentials('UidOfTestUser', 'test', 'password');
$this->assertSame($response->getStatus(), 403);
$this->assertSame('Permission denied', $response->getData()['message']);
}

public function testSaveGlobalCredentialsAsAdminForSelf(): void {
Expand All @@ -105,7 +121,8 @@ public function testSaveGlobalCredentialsAsAdminForSelf(): void {
->method('saveAuth')
->with('MyAdminUid', 'test', 'password');

$this->assertSame(true, $this->ajaxController->saveGlobalCredentials('MyAdminUid', 'test', 'password'));
$response = $this->ajaxController->saveGlobalCredentials('MyAdminUid', 'test', 'password');
$this->assertSame($response->getStatus(), 200);
}

public function testSaveGlobalCredentialsAsNormalUserForSelf(): void {
Expand All @@ -120,7 +137,8 @@ public function testSaveGlobalCredentialsAsNormalUserForSelf(): void {
->method('saveAuth')
->with('MyUserUid', 'test', 'password');

$this->assertSame(true, $this->ajaxController->saveGlobalCredentials('MyUserUid', 'test', 'password'));
$response = $this->ajaxController->saveGlobalCredentials('MyUserUid', 'test', 'password');
$this->assertSame($response->getStatus(), 200);
}

public function testSaveGlobalCredentialsAsNormalUserForAnotherUser(): void {
Expand All @@ -135,6 +153,8 @@ public function testSaveGlobalCredentialsAsNormalUserForAnotherUser(): void {
->expects($this->never())
->method('saveAuth');

$this->assertSame(false, $this->ajaxController->saveGlobalCredentials('AnotherUserUid', 'test', 'password'));
$response = $this->ajaxController->saveGlobalCredentials('AnotherUserUid', 'test', 'password');
$this->assertSame($response->getStatus(), 403);
$this->assertSame('Permission denied', $response->getData()['message']);
}
}
4 changes: 2 additions & 2 deletions dist/core-common.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion dist/core-common.js.map

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions dist/files_external-settings.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion dist/files_external-settings.js.map

Large diffs are not rendered by default.

Loading