mirror of
https://github.com/nextcloud/server.git
synced 2026-04-21 22:27:31 -04:00
fix(external_storage): fix settings save
Signed-off-by: skjnldsv <skjnldsv@protonmail.com>
This commit is contained in:
parent
1d58ce82c9
commit
9ff9096e4a
3 changed files with 71 additions and 29 deletions
|
|
@ -9,10 +9,12 @@ namespace OCA\Files_External\Controller;
|
|||
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;
|
||||
|
||||
|
|
@ -32,6 +34,7 @@ class AjaxController extends Controller {
|
|||
private GlobalAuth $globalAuth,
|
||||
private IUserSession $userSession,
|
||||
private IGroupManager $groupManager,
|
||||
private IL10N $l10n,
|
||||
) {
|
||||
parent::__construct($appName, $request);
|
||||
}
|
||||
|
|
@ -56,27 +59,30 @@ class AjaxController extends Controller {
|
|||
#[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
|
||||
|
|
@ -87,9 +93,14 @@ class AjaxController extends Controller {
|
|||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
|
||||
|
|
@ -1522,21 +1524,30 @@ window.addEventListener('DOMContentLoaded', function() {
|
|||
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
|
||||
})
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@ use OCA\Files_External\Lib\Auth\Password\GlobalAuth;
|
|||
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;
|
||||
|
|
@ -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);
|
||||
|
|
@ -39,6 +42,7 @@ class AjaxControllerTest extends TestCase {
|
|||
->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',
|
||||
|
|
@ -46,9 +50,19 @@ class AjaxControllerTest extends TestCase {
|
|||
$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();
|
||||
}
|
||||
|
||||
|
|
@ -87,7 +101,9 @@ class AjaxControllerTest extends TestCase {
|
|||
->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 {
|
||||
|
|
@ -105,7 +121,8 @@ class AjaxControllerTest extends TestCase {
|
|||
->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 {
|
||||
|
|
@ -120,7 +137,8 @@ class AjaxControllerTest extends TestCase {
|
|||
->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 {
|
||||
|
|
@ -135,6 +153,8 @@ class AjaxControllerTest extends TestCase {
|
|||
->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']);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue