Skip to content

Commit aec772e

Browse files
authored
Merge pull request #151 from internxt/fix/webdav-auth-on-init
[PB-3399]: fix/improve-and-fix-webdav-auth-management
2 parents 992d76b + 6ea5bab commit aec772e

File tree

6 files changed

+32
-18
lines changed

6 files changed

+32
-18
lines changed

src/commands/webdav.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { CLIUtils } from '../utils/cli.utils';
44
import { ConfigService } from '../services/config.service';
55
import { DriveDatabaseManager } from '../services/database/drive-database-manager.service';
66
import { ErrorUtils } from '../utils/errors.utils';
7+
import { AuthService } from '../services/auth.service';
78

89
export default class Webdav extends Command {
910
static readonly args = {
@@ -31,6 +32,7 @@ export default class Webdav extends Command {
3132
await PM2Utils.connect();
3233
switch (args.action) {
3334
case 'enable': {
35+
await AuthService.instance.getAuthDetails();
3436
message = await this.enableWebDav();
3537
break;
3638
}
@@ -41,6 +43,7 @@ export default class Webdav extends Command {
4143
}
4244

4345
case 'restart': {
46+
await AuthService.instance.getAuthDetails();
4447
message = await this.restartWebDav();
4548
break;
4649
}

src/services/auth.service.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ export class AuthService {
7777
};
7878

7979
/**
80-
* Obtains the user auth details
80+
* Checks and returns the user auth details (it refreshes the tokens if needed)
8181
*
8282
* @returns The user details and the auth tokens
8383
*/

src/webdav/index.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { AuthService } from '../services/auth.service';
1313
import { CryptoService } from '../services/crypto.service';
1414
import { TrashService } from '../services/drive/trash.service';
1515
import { webdavLogger } from '../utils/logger.utils';
16+
import { SdkManager } from '../services/sdk-manager.service';
1617

1718
dotenv.config();
1819

@@ -23,6 +24,12 @@ const init = async () => {
2324

2425
await DriveDatabaseManager.init();
2526

27+
const { token, newToken } = await AuthService.instance.getAuthDetails();
28+
SdkManager.init({
29+
token,
30+
newToken,
31+
});
32+
2633
new WebDavServer(
2734
express(),
2835
ConfigService.instance,

src/webdav/middewares/auth.middleware.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,24 @@
11
import { RequestHandler } from 'express';
2-
import { ConfigService } from '../../services/config.service';
32
import { SdkManager } from '../../services/sdk-manager.service';
3+
import { AuthService } from '../../services/auth.service';
4+
import { webdavLogger } from '../../utils/logger.utils';
45

5-
export const AuthMiddleware = (configService: ConfigService): RequestHandler => {
6+
export const AuthMiddleware = (authService: AuthService): RequestHandler => {
67
return (req, res, next) => {
78
(async () => {
89
try {
9-
const credentials = await configService.readUser();
10-
if (!credentials) throw new Error('Unauthorized');
10+
const { token, newToken, user } = await authService.getAuthDetails();
1111
SdkManager.init({
12-
token: credentials.token,
13-
newToken: credentials.newToken,
12+
token,
13+
newToken,
1414
});
1515
req.user = {
16-
uuid: credentials.user.uuid,
17-
rootFolderId: credentials.user.root_folder_id,
16+
uuid: user.uuid,
17+
rootFolderId: user.root_folder_id,
1818
};
1919
next();
2020
} catch (error) {
21+
webdavLogger.error('Error from AuthMiddleware: ' + (error as Error).message);
2122
res.status(401).send({ error: (error as Error).message });
2223
}
2324
})();

src/webdav/webdav-server.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ export class WebDavServer {
5959
private readonly registerMiddlewares = async () => {
6060
this.app.use(bodyParser.text({ type: ['application/xml', 'text/xml'] }));
6161
this.app.use(ErrorHandlingMiddleware);
62-
this.app.use(AuthMiddleware(ConfigService.instance));
62+
this.app.use(AuthMiddleware(AuthService.instance));
6363
this.app.use(
6464
RequestLoggerMiddleware({
6565
enable: true,

test/webdav/middlewares/auth.middleware.test.ts

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import { beforeEach, describe, expect, it, vi } from 'vitest';
22
import { AuthMiddleware } from '../../../src/webdav/middewares/auth.middleware';
33
import { createWebDavRequestFixture, createWebDavResponseFixture } from '../../fixtures/webdav.fixture';
4-
import { ConfigService } from '../../../src/services/config.service';
54
import { UserCredentialsFixture } from '../../fixtures/login.fixture';
5+
import { AuthService } from '../../../src/services/auth.service';
6+
import { MissingCredentialsError } from '../../../src/types/command.types';
67

78
describe('Auth middleware', () => {
89
beforeEach(() => {
@@ -18,14 +19,16 @@ describe('Auth middleware', () => {
1819
});
1920
const next = vi.fn();
2021

21-
const configServiceStub = vi.spyOn(ConfigService.instance, 'readUser').mockResolvedValue(undefined);
22+
const authServiceStub = vi
23+
.spyOn(AuthService.instance, 'getAuthDetails')
24+
.mockRejectedValue(new MissingCredentialsError());
2225

23-
await AuthMiddleware(ConfigService.instance)(req, res, next);
26+
await AuthMiddleware(AuthService.instance)(req, res, next);
2427

25-
expect(configServiceStub).toHaveBeenCalledOnce();
28+
expect(authServiceStub).toHaveBeenCalledOnce();
2629
expect(next).not.toHaveBeenCalled();
2730
expect(res.status).toHaveBeenCalledWith(401);
28-
expect(res.send).toHaveBeenCalledWith({ error: 'Unauthorized' });
31+
expect(res.send).toHaveBeenCalledWith({ error: new MissingCredentialsError().message });
2932
});
3033

3134
it('When the user is authenticated, then it should add the user to the request', async () => {
@@ -34,13 +37,13 @@ describe('Auth middleware', () => {
3437
});
3538
const res = createWebDavResponseFixture({});
3639
const next = vi.fn();
37-
const configServiceStub = vi.spyOn(ConfigService.instance, 'readUser').mockResolvedValue(UserCredentialsFixture);
40+
const authServiceStub = vi.spyOn(AuthService.instance, 'getAuthDetails').mockResolvedValue(UserCredentialsFixture);
3841

39-
await AuthMiddleware(ConfigService.instance)(req, res, next);
42+
await AuthMiddleware(AuthService.instance)(req, res, next);
4043

4144
// @ts-expect-error - User is added to the request, but TS is not picking it as we specified null before
4245
expect(req.user.rootFolderId).to.be.equal(UserCredentialsFixture.user.root_folder_id);
43-
expect(configServiceStub).toHaveBeenCalledOnce();
46+
expect(authServiceStub).toHaveBeenCalledOnce();
4447
expect(next).toHaveBeenCalledOnce();
4548
expect(res.status).not.toHaveBeenCalled();
4649
expect(res.send).not.toHaveBeenCalled();

0 commit comments

Comments
 (0)