1
0
mirror of https://github.com/laurent22/joplin.git synced 2025-01-02 12:47:41 +02:00

All: Resolves #7661: Stop synchronization with unsupported WebDAV providers (#7819)

This commit is contained in:
Julien 2023-02-22 21:12:53 +08:00 committed by GitHub
parent 219585bbcf
commit 32bb256cca
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 112 additions and 1 deletions

View File

@ -513,6 +513,7 @@ packages/lib/markdownUtils.js
packages/lib/markdownUtils.test.js
packages/lib/markdownUtils2.test.js
packages/lib/markupLanguageUtils.js
packages/lib/migrations/42.js
packages/lib/models/Alarm.js
packages/lib/models/BaseItem.js
packages/lib/models/Folder.js
@ -759,6 +760,8 @@ packages/lib/themes/type.js
packages/lib/time.js
packages/lib/utils/credentialFiles.js
packages/lib/utils/joplinCloud.js
packages/lib/utils/webDAVUtils.js
packages/lib/utils/webDAVUtils.test.js
packages/lib/uuid.js
packages/lib/versionInfo.js
packages/lib/versionInfo.test.js

3
.gitignore vendored
View File

@ -501,6 +501,7 @@ packages/lib/markdownUtils.js
packages/lib/markdownUtils.test.js
packages/lib/markdownUtils2.test.js
packages/lib/markupLanguageUtils.js
packages/lib/migrations/42.js
packages/lib/models/Alarm.js
packages/lib/models/BaseItem.js
packages/lib/models/Folder.js
@ -747,6 +748,8 @@ packages/lib/themes/type.js
packages/lib/time.js
packages/lib/utils/credentialFiles.js
packages/lib/utils/joplinCloud.js
packages/lib/utils/webDAVUtils.js
packages/lib/utils/webDAVUtils.test.js
packages/lib/uuid.js
packages/lib/versionInfo.js
packages/lib/versionInfo.test.js

View File

@ -354,7 +354,7 @@ export default class JoplinDatabase extends Database {
// must be set in the synchronizer too.
// Note: v16 and v17 don't do anything. They were used to debug an issue.
const existingDatabaseVersions = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41];
const existingDatabaseVersions = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42];
let currentVersionIndex = existingDatabaseVersions.indexOf(fromVersion);
@ -913,6 +913,10 @@ export default class JoplinDatabase extends Database {
queries.push('ALTER TABLE `folders` ADD COLUMN icon TEXT NOT NULL DEFAULT ""');
}
if (targetVersion === 42) {
queries.push(this.addMigrationFile(42));
}
const updateVersionQuery = { sql: 'UPDATE version SET version = ?', params: [targetVersion] };
queries.push(updateVersionQuery);

View File

@ -5,6 +5,7 @@ const { FileApi } = require('./file-api.js');
const Synchronizer = require('./Synchronizer').default;
const WebDavApi = require('./WebDavApi');
const { FileApiDriverWebDav } = require('./file-api-driver-webdav');
const checkProviderIsSupported = require('./utils/webDAVUtils').default;
class SyncTargetWebDAV extends BaseSyncTarget {
static id() {
@ -56,6 +57,7 @@ class SyncTargetWebDAV extends BaseSyncTarget {
};
try {
checkProviderIsSupported(options.path());
const result = await fileApi.stat('');
if (!result) throw new Error(`WebDAV directory not found: ${options.path()}`);
output.ok = true;

View File

@ -1,6 +1,8 @@
const { basicDelta } = require('./file-api');
const { rtrimSlashes, ltrimSlashes } = require('./path-utils');
const JoplinError = require('./JoplinError').default;
const Setting = require('./models/Setting').default;
const checkProviderIsSupported = require('./utils/webDAVUtils').default;
class FileApiDriverWebDav {
constructor(api) {
@ -224,6 +226,10 @@ class FileApiDriverWebDav {
await this.delete('');
await this.mkdir('');
}
initialize() {
checkProviderIsSupported(Setting.value('sync.6.path'));
}
}
module.exports = { FileApiDriverWebDav };

View File

@ -0,0 +1,21 @@
import Setting from '../models/Setting';
import checkProviderIsSupported from '../utils/webDAVUtils';
interface Script {
exec: ()=> Promise<void>;
}
const script: Script = <Script>{};
script.exec = async () => {
try {
checkProviderIsSupported(Setting.value('sync.6.path'));
Setting.setValue('sync.allowUnsupportedProviders', 0);
} catch (error) {
Setting.setValue('sync.allowUnsupportedProviders', 1);
}
};
export default script;

View File

@ -1,10 +1,12 @@
import BaseModel from '../BaseModel';
import migration42 from '../migrations/42';
const migrationScripts: Record<number, any> = {
20: require('../migrations/20.js'),
27: require('../migrations/27.js'),
33: require('../migrations/33.js'),
35: require('../migrations/35.js'),
42: migration42,
};
export default class Migration extends BaseModel {

View File

@ -1671,6 +1671,12 @@ class Setting extends BaseModel {
// storage: SettingStorage.File,
// },
'sync.allowUnsupportedProviders': {
value: -1,
type: SettingItemType.Int,
public: false,
},
};
this.metadata_ = Object.assign(this.metadata_, this.customMetadata_);

View File

@ -0,0 +1,43 @@
import checkProviderIsSupported from './webDAVUtils';
import Setting from '../models/Setting';
describe('checkProviderIsSupported', () => {
describe('when no unsupported provider is already configured', () => {
beforeAll(() => {
Setting.setValue('sync.allowUnsupportedProviders', 0);
});
it('should not throw when no provider path is provided ', () => {
expect(() => checkProviderIsSupported('')).not.toThrow();
});
it('should not throw when a valid provider path is provided', () => {
expect(() => checkProviderIsSupported('https://good-webdav-provider.com')).not.toThrow();
});
it('should not throw when a valid provider path with a name that contains an unsupported provider is provided', () => {
expect(() => checkProviderIsSupported('https://hopcloudabc.com')).not.toThrow();
});
it('should throw an error with the name of the provider when an unsupported provider path is provided', () => {
expect(() => checkProviderIsSupported('https://pcloud.com')).toThrowError('The WebDAV implementation of pcloud is incompatible with Joplin, and as such is no longer supported. Please use a different sync method.');
expect(() => checkProviderIsSupported('https://api.pcloud.com')).toThrowError('The WebDAV implementation of pcloud is incompatible with Joplin, and as such is no longer supported. Please use a different sync method.');
expect(() => checkProviderIsSupported('https://api-pcloud-test.com')).toThrowError('The WebDAV implementation of pcloud is incompatible with Joplin, and as such is no longer supported. Please use a different sync method.');
});
expect(() => checkProviderIsSupported('?param=pcloud')).toThrowError('The WebDAV implementation of pcloud is incompatible with Joplin, and as such is no longer supported. Please use a different sync method.');
});
describe('when an unsupported provider is already configured', () => {
beforeAll(() => {
Setting.setValue('sync.allowUnsupportedProviders', 1);
});
it('should not throw when an unsupported provider is already configured', () => {
expect(() => checkProviderIsSupported('pcloud')).not.toThrow();
});
});
});

View File

@ -0,0 +1,21 @@
import { _ } from '../locale';
import Setting from '../models/Setting';
export const checkProviderIsSupported = (path: string): void => {
if (Setting.value('sync.allowUnsupportedProviders') === 1) return;
const unsupportedProviders = ['pcloud', 'jianguoyun'];
for (const p of unsupportedProviders) {
// For a provider named abc, this regex will match the provider's name if enclosed by either '/', '.', '-', '=' or end of string.
// E.g: https://abc.com, https://api.abc.com, https://api-abc-test.com, https://api/test?param=abc
//
// It will not match a provider which name happens to contain an unsupported provider (i.e a substring).
// E.g: https://fooabc.com
const pattern = `(?<=[-/.=])${p}(?=[-/.=]|$)`;
if (path.search(new RegExp(pattern)) !== -1) {
throw new Error(_('The WebDAV implementation of %s is incompatible with Joplin, and as such is no longer supported. Please use a different sync method.', p));
}
}
};
export default checkProviderIsSupported;