From 5f2bc31d2cec22f62981fd0444e2339fdf7cfe44 Mon Sep 17 00:00:00 2001 From: David Disu Date: Wed, 16 Mar 2022 11:28:59 +0100 Subject: [PATCH] Prevent paste in within ancestor folder --- apps/remix-ide/src/app/files/fileManager.ts | 8 +++++++- apps/remix-ide/src/app/files/remixDProvider.js | 9 +++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/apps/remix-ide/src/app/files/fileManager.ts b/apps/remix-ide/src/app/files/fileManager.ts index 2ad2ea4aa9..da8f97c8b0 100644 --- a/apps/remix-ide/src/app/files/fileManager.ts +++ b/apps/remix-ide/src/app/files/fileManager.ts @@ -272,7 +272,13 @@ class FileManager extends Plugin { await this._handleIsDir(src, `Cannot copy from ${src}. Path is not a directory.`) await this._handleExists(dest, `Cannot paste content into ${dest}. Path does not exist.`) await this._handleIsDir(dest, `Cannot paste content into ${dest}. Path is not directory.`) - await this.inDepthCopy(src, dest) + + const provider = this.fileProviderOf(src) + if (provider.isSubDirectory(src, dest)) { + this.call('notification', 'toast', 'File(s) to paste is an ancestor of the destination folder') + } else { + await this.inDepthCopy(src, dest) + } } catch (e) { throw new Error(e) } diff --git a/apps/remix-ide/src/app/files/remixDProvider.js b/apps/remix-ide/src/app/files/remixDProvider.js index c52055e04f..27e4534263 100644 --- a/apps/remix-ide/src/app/files/remixDProvider.js +++ b/apps/remix-ide/src/app/files/remixDProvider.js @@ -1,5 +1,6 @@ 'use strict' const FileProvider = require('./fileProvider') +const pathModule = require('path') module.exports = class RemixDProvider extends FileProvider { constructor (appManager) { @@ -207,4 +208,12 @@ module.exports = class RemixDProvider extends FileProvider { if (!this._isReady) throw new Error('provider not ready') return await this._appManager.call('remixd', 'isFile', { path: unprefixedpath }) } + + isSubDirectory (parent, child) { + if (!parent) return false + if (parent === child) return true + const relative = pathModule.relative(parent, child) + + return !!relative && relative.split(pathModule.sep)[0] !== '..' + } }