From a4fa670dc5c4443d9a90e84d4caa1c7a7170785d Mon Sep 17 00:00:00 2001 From: Fabrice Marsaud Date: Tue, 26 Jan 2016 16:01:03 +0100 Subject: [PATCH 01/32] Initial commit --- packages/xo-remote-parser/.babelrc | 11 ++++ packages/xo-remote-parser/.editorconfig | 65 +++++++++++++++++++++ packages/xo-remote-parser/.gitignore | 9 +++ packages/xo-remote-parser/.mocha.js | 5 ++ packages/xo-remote-parser/.mocha.opts | 1 + packages/xo-remote-parser/.npmignore | 10 ++++ packages/xo-remote-parser/.travis.yml | 9 +++ packages/xo-remote-parser/README.md | 52 +++++++++++++++++ packages/xo-remote-parser/package.json | 64 ++++++++++++++++++++ packages/xo-remote-parser/src/index.js | 50 ++++++++++++++++ packages/xo-remote-parser/src/index.spec.js | 13 +++++ 11 files changed, 289 insertions(+) create mode 100644 packages/xo-remote-parser/.babelrc create mode 100644 packages/xo-remote-parser/.editorconfig create mode 100644 packages/xo-remote-parser/.gitignore create mode 100644 packages/xo-remote-parser/.mocha.js create mode 100644 packages/xo-remote-parser/.mocha.opts create mode 100644 packages/xo-remote-parser/.npmignore create mode 100644 packages/xo-remote-parser/.travis.yml create mode 100644 packages/xo-remote-parser/README.md create mode 100644 packages/xo-remote-parser/package.json create mode 100644 packages/xo-remote-parser/src/index.js create mode 100644 packages/xo-remote-parser/src/index.spec.js diff --git a/packages/xo-remote-parser/.babelrc b/packages/xo-remote-parser/.babelrc new file mode 100644 index 000000000..df6800285 --- /dev/null +++ b/packages/xo-remote-parser/.babelrc @@ -0,0 +1,11 @@ +{ + "comments": false, + "compact": true, + "plugins": [ + "transform-runtime" + ], + "presets": [ + "stage-0", + "es2015" + ] +} diff --git a/packages/xo-remote-parser/.editorconfig b/packages/xo-remote-parser/.editorconfig new file mode 100644 index 000000000..da21ef4c5 --- /dev/null +++ b/packages/xo-remote-parser/.editorconfig @@ -0,0 +1,65 @@ +# http://EditorConfig.org +# +# Julien Fontanet's configuration +# https://gist.github.com/julien-f/8096213 + +# Top-most EditorConfig file. +root = true + +# Common config. +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespaces = true + +# CoffeeScript +# +# https://github.com/polarmobile/coffeescript-style-guide/blob/master/README.md +[*.{,lit}coffee] +indent_size = 2 +indent_style = space + +# Markdown +[*.{md,mdwn,mdown,markdown}] +indent_size = 4 +indent_style = space + +# Package.json +# +# This indentation style is the one used by npm. +[/package.json] +indent_size = 2 +indent_style = space + +# Jade +[*.jade] +indent_size = 2 +indent_style = space + +# JavaScript +# +# Two spaces seems to be the standard most common style, at least in +# Node.js (http://nodeguide.com/style.html#tabs-vs-spaces). +[*.js] +indent_size = 2 +indent_style = space + +# Less +[*.less] +indent_size = 2 +indent_style = space + +# Sass +# +# Style used for http://libsass.com +[*.s[ac]ss] +indent_size = 2 +indent_style = space + +# YAML +# +# Only spaces are allowed. +[*.yaml] +indent_size = 2 +indent_style = space diff --git a/packages/xo-remote-parser/.gitignore b/packages/xo-remote-parser/.gitignore new file mode 100644 index 000000000..6959be1cf --- /dev/null +++ b/packages/xo-remote-parser/.gitignore @@ -0,0 +1,9 @@ +/.nyc_output/ +/bower_components/ +/dist/ + +npm-debug.log +npm-debug.log.* + +!node_modules/* +node_modules/*/ diff --git a/packages/xo-remote-parser/.mocha.js b/packages/xo-remote-parser/.mocha.js new file mode 100644 index 000000000..e6d84e403 --- /dev/null +++ b/packages/xo-remote-parser/.mocha.js @@ -0,0 +1,5 @@ +Error.stackTraceLimit = 100 + +try { require('trace') } catch (_) {} +try { require('clarify') } catch (_) {} +try { require('source-map-support/register') } catch (_) {} diff --git a/packages/xo-remote-parser/.mocha.opts b/packages/xo-remote-parser/.mocha.opts new file mode 100644 index 000000000..6cfd94898 --- /dev/null +++ b/packages/xo-remote-parser/.mocha.opts @@ -0,0 +1 @@ +--require ./.mocha.js diff --git a/packages/xo-remote-parser/.npmignore b/packages/xo-remote-parser/.npmignore new file mode 100644 index 000000000..c31ee82cb --- /dev/null +++ b/packages/xo-remote-parser/.npmignore @@ -0,0 +1,10 @@ +/examples/ +example.js +example.js.map +*.example.js +*.example.js.map + +/test/ +/tests/ +*.spec.js +*.spec.js.map diff --git a/packages/xo-remote-parser/.travis.yml b/packages/xo-remote-parser/.travis.yml new file mode 100644 index 000000000..a9b136ea6 --- /dev/null +++ b/packages/xo-remote-parser/.travis.yml @@ -0,0 +1,9 @@ +language: node_js +node_js: + - 'stable' + - '4' + - '0.12' + +# Use containers. +# http://docs.travis-ci.com/user/workers/container-based-infrastructure/ +sudo: false diff --git a/packages/xo-remote-parser/README.md b/packages/xo-remote-parser/README.md new file mode 100644 index 000000000..d811985b1 --- /dev/null +++ b/packages/xo-remote-parser/README.md @@ -0,0 +1,52 @@ +# ${pkg.name} [![Build Status](https://travis-ci.org/${pkg.shortGitHubPath}.png?branch=master)](https://travis-ci.org/${pkg.shortGitHubPath}) + +> ${pkg.description} + +## Install + +Installation of the [npm package](https://npmjs.org/package/${pkg.name}): + +``` +> npm install --save ${pkg.name} +``` + +## Usage + +**TODO** + +## Development + +### Installing dependencies + +``` +> npm install +``` + +### Compilation + +The sources files are watched and automatically recompiled on changes. + +``` +> npm run dev +``` + +### Tests + +``` +> npm run test-dev +``` + +## Contributions + +Contributions are *very* welcomed, either on the documentation or on +the code. + +You may: + +- report any [issue](${pkg.bugs}) + you've encountered; +- fork and create a pull request. + +## License + +${pkg.license} © [${pkg.author.name}](${pkg.author.url}) diff --git a/packages/xo-remote-parser/package.json b/packages/xo-remote-parser/package.json new file mode 100644 index 000000000..50c38bb29 --- /dev/null +++ b/packages/xo-remote-parser/package.json @@ -0,0 +1,64 @@ +{ + "private": true, + "name": "", + "version": "0.0.0", + "license": "ISC", + "description": "", + "keywords": [], + "homepage": "", + "bugs": "", + "repository": { + "type": "git", + "url": "" + }, + "author": { + "name": "Julien Fontanet", + "email": "julien.fontanet@isonoe.net" + }, + "preferGlobal": false, + "main": "dist/", + "bin": {}, + "files": [ + "dist/" + ], + "engines": { + "node": ">=0.12" + }, + "dependencies": { + "babel-runtime": "^6.3.19" + }, + "devDependencies": { + "babel-cli": "^6.3.17", + "babel-eslint": "^5.0.0-beta6", + "babel-plugin-transform-runtime": "^6.3.13", + "babel-preset-es2015": "^6.3.13", + "babel-preset-stage-0": "^6.3.13", + "clarify": "^1.0.5", + "dependency-check": "^2.5.1", + "lodash.filter": "^4.0.1", + "lodash.map": "^4.0.1", + "lodash.trim": "^4.0.1", + "mocha": "^2.3.4", + "must": "^0.13.1", + "nyc": "^5.0.1", + "source-map-support": "^0.4.0", + "standard": "^5.4.1", + "trace": "^2.1.0" + }, + "scripts": { + "build": "babel --source-maps --out-dir=dist/ src/", + "dev": "babel --watch --source-maps --out-dir=dist/ src/", + "dev-test": "mocha --opts .mocha.opts --watch --reporter=min \"dist/**/*.spec.js\"", + "lint": "standard", + "depcheck": "dependency-check ./package.json", + "posttest": "npm run lint && npm run depcheck", + "prepublish": "npm run build", + "test": "nyc mocha --opts .mocha.opts \"dist/**/*.spec.js\"" + }, + "standard": { + "ignore": [ + "dist/**" + ], + "parser": "babel-eslint" + } +} diff --git a/packages/xo-remote-parser/src/index.js b/packages/xo-remote-parser/src/index.js new file mode 100644 index 000000000..51dcbdb05 --- /dev/null +++ b/packages/xo-remote-parser/src/index.js @@ -0,0 +1,50 @@ +import filter from 'lodash.filter' +import map from 'lodash.map' +import trim from 'lodash.trim' + +const sanitizePath = (...paths) => filter(map(paths, s => s && filter(map(s.split('/'), trim)).join('/'))).join('/') + +export const parse = (remote) => { + const [type, rest] = remote.url.split('://') + if (type === 'file') { + remote.type = 'local' + remote.path = `/${rest}` // FIXME the heading slash has been forgotten on client side first implementation + } else if (type === 'nfs') { + remote.type = 'nfs' + const [host, share] = rest.split(':') + remote.path = `/tmp/xo-server/mounts/${remote.id}` + remote.host = host + remote.share = share + } else if (type === 'smb') { + remote.type = 'smb' + const [auth, smb] = rest.split('@') + const [username, password] = auth.split(':') + const [domain, sh] = smb.split('\\\\') + const [host, path] = sh.split('\0') + remote.host = host + remote.path = path + remote.domain = domain + remote.username = username + remote.password = password + } + return remote +} + +export const compose = ({type, host, path, username, password, domain}) => { + let url = `${type}://` + if (type === 'nfs') { + url += `${host}:` + } + if (type === 'smb') { + url += `${username}:${password}@${domain}\\\\${host}` + } + path = sanitizePath(path) + if (type === 'smb') { + path = path.split('/') + path = '\0' + path.join('\\') // FIXME saving with the windows fashion \ was a bad idea :,( + } else { + type === 'smb' && (path = `/${path}`) // FIXME file type should have a / too, but it has been forgotten on client side first implementation... + } + url += path + return url +} diff --git a/packages/xo-remote-parser/src/index.spec.js b/packages/xo-remote-parser/src/index.spec.js new file mode 100644 index 000000000..6e9c776d2 --- /dev/null +++ b/packages/xo-remote-parser/src/index.spec.js @@ -0,0 +1,13 @@ +/* eslint-env mocha */ + +import expect from 'must' + +// =================================================================== + +import myLib from './' + +// =================================================================== + +describe('myLib', () => { + // TODO +}) From ea605383d52f273959a5b21c805e37cd9b48e0fd Mon Sep 17 00:00:00 2001 From: Fabrice Marsaud Date: Tue, 26 Jan 2016 16:08:40 +0100 Subject: [PATCH 02/32] Various info --- packages/xo-remote-parser/package.json | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/packages/xo-remote-parser/package.json b/packages/xo-remote-parser/package.json index 50c38bb29..432a41f1d 100644 --- a/packages/xo-remote-parser/package.json +++ b/packages/xo-remote-parser/package.json @@ -1,19 +1,18 @@ { - "private": true, - "name": "", + "name": "xo-remote-parser", "version": "0.0.0", - "license": "ISC", + "license": "AGPL-3.0", "description": "", "keywords": [], "homepage": "", "bugs": "", "repository": { "type": "git", - "url": "" + "url": "https://github.com/vatesfr/xo-remote-parser" }, "author": { - "name": "Julien Fontanet", - "email": "julien.fontanet@isonoe.net" + "name": "Fabrice Marsaud", + "email": "fabrice.marsaud@vates.fr" }, "preferGlobal": false, "main": "dist/", From 3fd637b3c76d03af4e08bf8525d5483f6d748b51 Mon Sep 17 00:00:00 2001 From: Fabrice Marsaud Date: Tue, 26 Jan 2016 17:32:35 +0100 Subject: [PATCH 03/32] method rename --- packages/xo-remote-parser/src/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/xo-remote-parser/src/index.js b/packages/xo-remote-parser/src/index.js index 51dcbdb05..33fa0d246 100644 --- a/packages/xo-remote-parser/src/index.js +++ b/packages/xo-remote-parser/src/index.js @@ -30,7 +30,7 @@ export const parse = (remote) => { return remote } -export const compose = ({type, host, path, username, password, domain}) => { +export const format = ({type, host, path, username, password, domain}) => { let url = `${type}://` if (type === 'nfs') { url += `${host}:` From f26fc9a0f0b98a9fa4e254e9c20e95463c8b249f Mon Sep 17 00:00:00 2001 From: Fabrice Marsaud Date: Tue, 26 Jan 2016 17:32:49 +0100 Subject: [PATCH 04/32] 0.1.0 --- packages/xo-remote-parser/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/xo-remote-parser/package.json b/packages/xo-remote-parser/package.json index 432a41f1d..aa85ac1b0 100644 --- a/packages/xo-remote-parser/package.json +++ b/packages/xo-remote-parser/package.json @@ -1,6 +1,6 @@ { "name": "xo-remote-parser", - "version": "0.0.0", + "version": "0.1.0", "license": "AGPL-3.0", "description": "", "keywords": [], From 2f95da18925c7928863b0a65d2452080d93b8930 Mon Sep 17 00:00:00 2001 From: ABHAMON Ronan Date: Wed, 11 May 2016 12:08:34 +0200 Subject: [PATCH 05/32] fix(package): lodash.xxx are prod dependencies (#2) --- packages/xo-remote-parser/package.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/xo-remote-parser/package.json b/packages/xo-remote-parser/package.json index aa85ac1b0..9e8450c40 100644 --- a/packages/xo-remote-parser/package.json +++ b/packages/xo-remote-parser/package.json @@ -24,7 +24,10 @@ "node": ">=0.12" }, "dependencies": { - "babel-runtime": "^6.3.19" + "babel-runtime": "^6.3.19", + "lodash.filter": "^4.0.1", + "lodash.map": "^4.0.1", + "lodash.trim": "^4.0.1" }, "devDependencies": { "babel-cli": "^6.3.17", @@ -34,9 +37,6 @@ "babel-preset-stage-0": "^6.3.13", "clarify": "^1.0.5", "dependency-check": "^2.5.1", - "lodash.filter": "^4.0.1", - "lodash.map": "^4.0.1", - "lodash.trim": "^4.0.1", "mocha": "^2.3.4", "must": "^0.13.1", "nyc": "^5.0.1", From 89b2156f614916e3de2ebae374c01b83d6469f7d Mon Sep 17 00:00:00 2001 From: ABHAMON Ronan Date: Wed, 11 May 2016 12:19:09 +0200 Subject: [PATCH 06/32] chore(package): remove unused babel-runtime (#3) --- packages/xo-remote-parser/.babelrc | 3 --- packages/xo-remote-parser/package.json | 2 -- 2 files changed, 5 deletions(-) diff --git a/packages/xo-remote-parser/.babelrc b/packages/xo-remote-parser/.babelrc index df6800285..0a89ba36d 100644 --- a/packages/xo-remote-parser/.babelrc +++ b/packages/xo-remote-parser/.babelrc @@ -1,9 +1,6 @@ { "comments": false, "compact": true, - "plugins": [ - "transform-runtime" - ], "presets": [ "stage-0", "es2015" diff --git a/packages/xo-remote-parser/package.json b/packages/xo-remote-parser/package.json index 9e8450c40..642b48e9f 100644 --- a/packages/xo-remote-parser/package.json +++ b/packages/xo-remote-parser/package.json @@ -24,7 +24,6 @@ "node": ">=0.12" }, "dependencies": { - "babel-runtime": "^6.3.19", "lodash.filter": "^4.0.1", "lodash.map": "^4.0.1", "lodash.trim": "^4.0.1" @@ -32,7 +31,6 @@ "devDependencies": { "babel-cli": "^6.3.17", "babel-eslint": "^5.0.0-beta6", - "babel-plugin-transform-runtime": "^6.3.13", "babel-preset-es2015": "^6.3.13", "babel-preset-stage-0": "^6.3.13", "clarify": "^1.0.5", From ab3d3073931861b1e025b2e1c3a1be05358aa179 Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Wed, 11 May 2016 12:21:05 +0200 Subject: [PATCH 07/32] chore(package): update all dependencies --- packages/xo-remote-parser/.babelrc | 8 -------- packages/xo-remote-parser/package.json | 24 ++++++++++++++++++------ 2 files changed, 18 insertions(+), 14 deletions(-) delete mode 100644 packages/xo-remote-parser/.babelrc diff --git a/packages/xo-remote-parser/.babelrc b/packages/xo-remote-parser/.babelrc deleted file mode 100644 index 0a89ba36d..000000000 --- a/packages/xo-remote-parser/.babelrc +++ /dev/null @@ -1,8 +0,0 @@ -{ - "comments": false, - "compact": true, - "presets": [ - "stage-0", - "es2015" - ] -} diff --git a/packages/xo-remote-parser/package.json b/packages/xo-remote-parser/package.json index 642b48e9f..5d451623d 100644 --- a/packages/xo-remote-parser/package.json +++ b/packages/xo-remote-parser/package.json @@ -30,32 +30,44 @@ }, "devDependencies": { "babel-cli": "^6.3.17", - "babel-eslint": "^5.0.0-beta6", + "babel-eslint": "^6.0.4", "babel-preset-es2015": "^6.3.13", "babel-preset-stage-0": "^6.3.13", "clarify": "^1.0.5", "dependency-check": "^2.5.1", + "ghooks": "^1.2.1", "mocha": "^2.3.4", "must": "^0.13.1", - "nyc": "^5.0.1", + "nyc": "^6.4.4", "source-map-support": "^0.4.0", - "standard": "^5.4.1", + "standard": "^7.0.1", "trace": "^2.1.0" }, "scripts": { - "build": "babel --source-maps --out-dir=dist/ src/", + "build": "NODE_ENV=production babel --source-maps --out-dir=dist/ src/", + "depcheck": "dependency-check ./package.json", "dev": "babel --watch --source-maps --out-dir=dist/ src/", "dev-test": "mocha --opts .mocha.opts --watch --reporter=min \"dist/**/*.spec.js\"", "lint": "standard", - "depcheck": "dependency-check ./package.json", "posttest": "npm run lint && npm run depcheck", "prepublish": "npm run build", "test": "nyc mocha --opts .mocha.opts \"dist/**/*.spec.js\"" }, + "babel": { + "presets": [ + "stage-0", + "es2015" + ] + }, "standard": { "ignore": [ - "dist/**" + "dist" ], "parser": "babel-eslint" + }, + "config": { + "ghooks": { + "commit-msg": "npm test" + } } } From 6d18420a5dbfe3abda38842dfc895dc28e5e018d Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Wed, 11 May 2016 12:21:22 +0200 Subject: [PATCH 08/32] fix(tests): make them pass --- packages/xo-remote-parser/src/index.spec.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/xo-remote-parser/src/index.spec.js b/packages/xo-remote-parser/src/index.spec.js index 6e9c776d2..2319bd7d5 100644 --- a/packages/xo-remote-parser/src/index.spec.js +++ b/packages/xo-remote-parser/src/index.spec.js @@ -8,6 +8,10 @@ import myLib from './' // =================================================================== -describe('myLib', () => { - // TODO +describe.skip('myLib', () => { + it('does something', () => { + // TODO: some real tests. + + expect(myLib).to.exists() + }) }) From 189900549a33d099d1e7a374d40e0e742d487ddd Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Wed, 11 May 2016 12:49:06 +0200 Subject: [PATCH 09/32] feat(tests): basic tests for local and smb types --- packages/xo-remote-parser/src/index.spec.js | 41 ++++++++++++++++++--- 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/packages/xo-remote-parser/src/index.spec.js b/packages/xo-remote-parser/src/index.spec.js index 2319bd7d5..145ab9536 100644 --- a/packages/xo-remote-parser/src/index.spec.js +++ b/packages/xo-remote-parser/src/index.spec.js @@ -4,14 +4,43 @@ import expect from 'must' // =================================================================== -import myLib from './' +import { parse, format } from './' // =================================================================== -describe.skip('myLib', () => { - it('does something', () => { - // TODO: some real tests. +const data = { + file: { + url: 'file://var/lib/xoa/backup', + type: 'local', + path: '/var/lib/xoa/backup' + }, + smb: { + url: 'smb://Administrator:password@toto\\\\192.168.100.225\\smb\0', + type: 'smb', + host: '192.168.100.225\\smb', + path: undefined, + domain: 'toto', + username: 'Administrator', + password: 'password' + } +} - expect(myLib).to.exists() - }) +// ------------------------------------------------------------------- + +describe('format', () => { + for (const name in data) { + const datum = data[name] + it(name, () => { + expect(format(datum)).to.equal(datum.url) + }) + } +}) + +describe('parse', () => { + for (const name in data) { + const datum = data[name] + it(name, () => { + expect(parse(datum)).to.eql(datum) + }) + } }) From 4c96e44b9bf7e6ff553125269261cd04b85d2984 Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Wed, 11 May 2016 12:49:29 +0200 Subject: [PATCH 10/32] fix(format): use correct type for local --- packages/xo-remote-parser/src/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/xo-remote-parser/src/index.js b/packages/xo-remote-parser/src/index.js index 33fa0d246..623575322 100644 --- a/packages/xo-remote-parser/src/index.js +++ b/packages/xo-remote-parser/src/index.js @@ -31,7 +31,7 @@ export const parse = (remote) => { } export const format = ({type, host, path, username, password, domain}) => { - let url = `${type}://` + let url = `${type === 'local' ? 'file' : type}://` if (type === 'nfs') { url += `${host}:` } From cd73c8f82f1e6989f9f29c28d8204f3f3553fe94 Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Wed, 11 May 2016 12:58:59 +0200 Subject: [PATCH 11/32] 0.2.0 --- packages/xo-remote-parser/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/xo-remote-parser/package.json b/packages/xo-remote-parser/package.json index 5d451623d..5ff49dfa8 100644 --- a/packages/xo-remote-parser/package.json +++ b/packages/xo-remote-parser/package.json @@ -1,6 +1,6 @@ { "name": "xo-remote-parser", - "version": "0.1.0", + "version": "0.2.0", "license": "AGPL-3.0", "description": "", "keywords": [], From 808cc5d8d01785cc5aed50780b5f58728e0e785a Mon Sep 17 00:00:00 2001 From: Fabrice Marsaud Date: Mon, 6 Jun 2016 10:57:27 +0200 Subject: [PATCH 12/32] fix: file protocol starts with 3 / (#6) Fixes #7 --- packages/xo-remote-parser/package.json | 4 +- packages/xo-remote-parser/src/index.js | 14 +++--- packages/xo-remote-parser/src/index.spec.js | 49 ++++++++++++++------- 3 files changed, 43 insertions(+), 24 deletions(-) diff --git a/packages/xo-remote-parser/package.json b/packages/xo-remote-parser/package.json index 5ff49dfa8..c1b3f352d 100644 --- a/packages/xo-remote-parser/package.json +++ b/packages/xo-remote-parser/package.json @@ -24,9 +24,7 @@ "node": ">=0.12" }, "dependencies": { - "lodash.filter": "^4.0.1", - "lodash.map": "^4.0.1", - "lodash.trim": "^4.0.1" + "lodash": "^4.13.1" }, "devDependencies": { "babel-cli": "^6.3.17", diff --git a/packages/xo-remote-parser/src/index.js b/packages/xo-remote-parser/src/index.js index 623575322..de2098afb 100644 --- a/packages/xo-remote-parser/src/index.js +++ b/packages/xo-remote-parser/src/index.js @@ -1,6 +1,7 @@ -import filter from 'lodash.filter' -import map from 'lodash.map' -import trim from 'lodash.trim' +import filter from 'lodash/filter' +import map from 'lodash/map' +import trim from 'lodash/trim' +import trimStart from 'lodash/trimStart' const sanitizePath = (...paths) => filter(map(paths, s => s && filter(map(s.split('/'), trim)).join('/'))).join('/') @@ -8,7 +9,7 @@ export const parse = (remote) => { const [type, rest] = remote.url.split('://') if (type === 'file') { remote.type = 'local' - remote.path = `/${rest}` // FIXME the heading slash has been forgotten on client side first implementation + remote.path = `/${trimStart(rest, '/')}` // the leading slash has been forgotten on client side first implementation } else if (type === 'nfs') { remote.type = 'nfs' const [host, share] = rest.split(':') @@ -31,7 +32,8 @@ export const parse = (remote) => { } export const format = ({type, host, path, username, password, domain}) => { - let url = `${type === 'local' ? 'file' : type}://` + type === 'local' && (type = 'file') + let url = `${type}://` if (type === 'nfs') { url += `${host}:` } @@ -43,7 +45,7 @@ export const format = ({type, host, path, username, password, domain}) => { path = path.split('/') path = '\0' + path.join('\\') // FIXME saving with the windows fashion \ was a bad idea :,( } else { - type === 'smb' && (path = `/${path}`) // FIXME file type should have a / too, but it has been forgotten on client side first implementation... + type === 'file' && (path = `/${path}`) } url += path return url diff --git a/packages/xo-remote-parser/src/index.spec.js b/packages/xo-remote-parser/src/index.spec.js index 145ab9536..2d4b56074 100644 --- a/packages/xo-remote-parser/src/index.spec.js +++ b/packages/xo-remote-parser/src/index.spec.js @@ -8,28 +8,47 @@ import { parse, format } from './' // =================================================================== -const data = { +const FILE_FIXED = { + url: 'file:///var/lib/xoa/backup', + type: 'local', + path: '/var/lib/xoa/backup' +} + +const SMB = { + url: 'smb://Administrator:password@toto\\\\192.168.100.225\\smb\0', + type: 'smb', + host: '192.168.100.225\\smb', + path: undefined, + domain: 'toto', + username: 'Administrator', + password: 'password' +} + +const parseData = { file: { - url: 'file://var/lib/xoa/backup', + url: 'file://var/lib/xoa/backup', // Remotes formatted before fixing #7 will not break when reparses type: 'local', path: '/var/lib/xoa/backup' }, - smb: { - url: 'smb://Administrator:password@toto\\\\192.168.100.225\\smb\0', - type: 'smb', - host: '192.168.100.225\\smb', - path: undefined, - domain: 'toto', - username: 'Administrator', - password: 'password' - } + fileFixed: FILE_FIXED, + smb: SMB +} + +const formatData = { + file: { + url: 'file:///var/lib/xoa/backup', + type: 'local', + path: '/var/lib/xoa/backup' + }, + fileFixed: FILE_FIXED, + smb: SMB } // ------------------------------------------------------------------- describe('format', () => { - for (const name in data) { - const datum = data[name] + for (const name in formatData) { + const datum = formatData[name] it(name, () => { expect(format(datum)).to.equal(datum.url) }) @@ -37,8 +56,8 @@ describe('format', () => { }) describe('parse', () => { - for (const name in data) { - const datum = data[name] + for (const name in parseData) { + const datum = parseData[name] it(name, () => { expect(parse(datum)).to.eql(datum) }) From 220750f8870a9e99bf08be40b9b8ac3aa5b02f17 Mon Sep 17 00:00:00 2001 From: Fabrice Marsaud Date: Mon, 6 Jun 2016 12:11:29 +0200 Subject: [PATCH 13/32] fix(SMB): use of `@` and `:` chars in passwords (#8) Fixes #4. --- packages/xo-remote-parser/src/index.js | 8 ++++-- packages/xo-remote-parser/src/index.spec.js | 28 +++++++++++++++++++-- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/packages/xo-remote-parser/src/index.js b/packages/xo-remote-parser/src/index.js index de2098afb..bc323e821 100644 --- a/packages/xo-remote-parser/src/index.js +++ b/packages/xo-remote-parser/src/index.js @@ -18,8 +18,12 @@ export const parse = (remote) => { remote.share = share } else if (type === 'smb') { remote.type = 'smb' - const [auth, smb] = rest.split('@') - const [username, password] = auth.split(':') + const lastArobas = rest.lastIndexOf('@') + const smb = rest.slice(lastArobas) + const auth = rest.slice(0, lastArobas) + const firstColon = auth.indexOf(':') + const username = auth.slice(0, firstColon) + const password = auth.slice(firstColon) const [domain, sh] = smb.split('\\\\') const [host, path] = sh.split('\0') remote.host = host diff --git a/packages/xo-remote-parser/src/index.spec.js b/packages/xo-remote-parser/src/index.spec.js index 2d4b56074..8e1cf5815 100644 --- a/packages/xo-remote-parser/src/index.spec.js +++ b/packages/xo-remote-parser/src/index.spec.js @@ -24,6 +24,26 @@ const SMB = { password: 'password' } +const SMB_AROBAS = { + url: 'smb://Administrator:pass@word@toto\\\\192.168.100.225\\smb\0', + type: 'smb', + host: '192.168.100.225\\smb', + path: undefined, + domain: 'toto', + username: 'Administrator', + password: 'pass@word' +} + +const SMB_COLON = { + url: 'smb://Administrator:pass:word@toto\\\\192.168.100.225\\smb\0', + type: 'smb', + host: '192.168.100.225\\smb', + path: undefined, + domain: 'toto', + username: 'Administrator', + password: 'pass:word' +} + const parseData = { file: { url: 'file://var/lib/xoa/backup', // Remotes formatted before fixing #7 will not break when reparses @@ -31,7 +51,9 @@ const parseData = { path: '/var/lib/xoa/backup' }, fileFixed: FILE_FIXED, - smb: SMB + smb: SMB, + 'smb@inPassword': SMB_AROBAS, + 'smb:inPassword': SMB_COLON } const formatData = { @@ -41,7 +63,9 @@ const formatData = { path: '/var/lib/xoa/backup' }, fileFixed: FILE_FIXED, - smb: SMB + smb: SMB, + 'smb@inPassword': SMB_AROBAS, + 'smb:inPassword': SMB_COLON } // ------------------------------------------------------------------- From aa448e7a41d6bf758aa52cc0ab61ecc273f47b68 Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Mon, 6 Jun 2016 13:33:33 +0200 Subject: [PATCH 14/32] 0.2.1 --- packages/xo-remote-parser/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/xo-remote-parser/package.json b/packages/xo-remote-parser/package.json index c1b3f352d..55dff0cf4 100644 --- a/packages/xo-remote-parser/package.json +++ b/packages/xo-remote-parser/package.json @@ -1,6 +1,6 @@ { "name": "xo-remote-parser", - "version": "0.2.0", + "version": "0.2.1", "license": "AGPL-3.0", "description": "", "keywords": [], From b140a2ca3e67f28efb7810a85c0cb28e3b75fd3f Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Mon, 6 Jun 2016 17:17:19 +0200 Subject: [PATCH 15/32] chore(tests): refactor data --- packages/xo-remote-parser/src/index.spec.js | 94 +++++++++------------ 1 file changed, 41 insertions(+), 53 deletions(-) diff --git a/packages/xo-remote-parser/src/index.spec.js b/packages/xo-remote-parser/src/index.spec.js index 8e1cf5815..c396be6cf 100644 --- a/packages/xo-remote-parser/src/index.spec.js +++ b/packages/xo-remote-parser/src/index.spec.js @@ -8,66 +8,54 @@ import { parse, format } from './' // =================================================================== -const FILE_FIXED = { - url: 'file:///var/lib/xoa/backup', - type: 'local', - path: '/var/lib/xoa/backup' -} - -const SMB = { - url: 'smb://Administrator:password@toto\\\\192.168.100.225\\smb\0', - type: 'smb', - host: '192.168.100.225\\smb', - path: undefined, - domain: 'toto', - username: 'Administrator', - password: 'password' -} - -const SMB_AROBAS = { - url: 'smb://Administrator:pass@word@toto\\\\192.168.100.225\\smb\0', - type: 'smb', - host: '192.168.100.225\\smb', - path: undefined, - domain: 'toto', - username: 'Administrator', - password: 'pass@word' -} - -const SMB_COLON = { - url: 'smb://Administrator:pass:word@toto\\\\192.168.100.225\\smb\0', - type: 'smb', - host: '192.168.100.225\\smb', - path: undefined, - domain: 'toto', - username: 'Administrator', - password: 'pass:word' -} - -const parseData = { - file: { - url: 'file://var/lib/xoa/backup', // Remotes formatted before fixing #7 will not break when reparses - type: 'local', - path: '/var/lib/xoa/backup' - }, - fileFixed: FILE_FIXED, - smb: SMB, - 'smb@inPassword': SMB_AROBAS, - 'smb:inPassword': SMB_COLON -} - -const formatData = { +// Data used for both parse and format (i.e. correctly formatted). +const data = { file: { url: 'file:///var/lib/xoa/backup', type: 'local', path: '/var/lib/xoa/backup' }, - fileFixed: FILE_FIXED, - smb: SMB, - 'smb@inPassword': SMB_AROBAS, - 'smb:inPassword': SMB_COLON + SMB: { + url: 'smb://Administrator:password@toto\\\\192.168.100.225\\smb\0', + type: 'smb', + host: '192.168.100.225\\smb', + path: undefined, + domain: 'toto', + username: 'Administrator', + password: 'password' + }, + 'SMB with @ sign in password': { + url: 'smb://Administrator:pass@word@toto\\\\192.168.100.225\\smb\0', + type: 'smb', + host: '192.168.100.225\\smb', + path: undefined, + domain: 'toto', + username: 'Administrator', + password: 'pass@word' + }, + 'SMB with colon in password': { + url: 'smb://Administrator:pass:word@toto\\\\192.168.100.225\\smb\0', + type: 'smb', + host: '192.168.100.225\\smb', + path: undefined, + domain: 'toto', + username: 'Administrator', + password: 'pass:word' + } } +const parseData = { + ...data, + + 'file with missing leading slash (#7)': { + url: 'file://var/lib/xoa/backup', + type: 'local', + path: '/var/lib/xoa/backup' + } +} + +const formatData = data + // ------------------------------------------------------------------- describe('format', () => { From c639cfcfd975f029dd510605a1361fb01a96d688 Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Mon, 6 Jun 2016 17:17:57 +0200 Subject: [PATCH 16/32] fix(parse): do not edit the remote object inplace --- packages/xo-remote-parser/src/index.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/xo-remote-parser/src/index.js b/packages/xo-remote-parser/src/index.js index bc323e821..ea1f21c1f 100644 --- a/packages/xo-remote-parser/src/index.js +++ b/packages/xo-remote-parser/src/index.js @@ -5,8 +5,14 @@ import trimStart from 'lodash/trimStart' const sanitizePath = (...paths) => filter(map(paths, s => s && filter(map(s.split('/'), trim)).join('/'))).join('/') -export const parse = (remote) => { - const [type, rest] = remote.url.split('://') +export const parse = url => { + if (typeof url === 'object') { + url = url.url + } + + const remote = {} + + const [type, rest] = url.split('://') if (type === 'file') { remote.type = 'local' remote.path = `/${trimStart(rest, '/')}` // the leading slash has been forgotten on client side first implementation From 509e99913ab232ca62a187e683b0031fa186f804 Mon Sep 17 00:00:00 2001 From: Fabrice Marsaud Date: Mon, 6 Jun 2016 17:56:59 +0200 Subject: [PATCH 17/32] fix(parse): fix tests and many issues (#9) --- packages/xo-remote-parser/src/index.js | 10 +++++----- packages/xo-remote-parser/src/index.spec.js | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/xo-remote-parser/src/index.js b/packages/xo-remote-parser/src/index.js index ea1f21c1f..7bbc3a52e 100644 --- a/packages/xo-remote-parser/src/index.js +++ b/packages/xo-remote-parser/src/index.js @@ -10,7 +10,7 @@ export const parse = url => { url = url.url } - const remote = {} + const remote = {url} const [type, rest] = url.split('://') if (type === 'file') { @@ -24,12 +24,12 @@ export const parse = url => { remote.share = share } else if (type === 'smb') { remote.type = 'smb' - const lastArobas = rest.lastIndexOf('@') - const smb = rest.slice(lastArobas) - const auth = rest.slice(0, lastArobas) + const lastAtSign = rest.lastIndexOf('@') + const smb = rest.slice(lastAtSign + 1) + const auth = rest.slice(0, lastAtSign) const firstColon = auth.indexOf(':') const username = auth.slice(0, firstColon) - const password = auth.slice(firstColon) + const password = auth.slice(firstColon + 1) const [domain, sh] = smb.split('\\\\') const [host, path] = sh.split('\0') remote.host = host diff --git a/packages/xo-remote-parser/src/index.spec.js b/packages/xo-remote-parser/src/index.spec.js index c396be6cf..7ca45d0dd 100644 --- a/packages/xo-remote-parser/src/index.spec.js +++ b/packages/xo-remote-parser/src/index.spec.js @@ -19,7 +19,7 @@ const data = { url: 'smb://Administrator:password@toto\\\\192.168.100.225\\smb\0', type: 'smb', host: '192.168.100.225\\smb', - path: undefined, + path: '', domain: 'toto', username: 'Administrator', password: 'password' @@ -28,7 +28,7 @@ const data = { url: 'smb://Administrator:pass@word@toto\\\\192.168.100.225\\smb\0', type: 'smb', host: '192.168.100.225\\smb', - path: undefined, + path: '', domain: 'toto', username: 'Administrator', password: 'pass@word' @@ -37,7 +37,7 @@ const data = { url: 'smb://Administrator:pass:word@toto\\\\192.168.100.225\\smb\0', type: 'smb', host: '192.168.100.225\\smb', - path: undefined, + path: '', domain: 'toto', username: 'Administrator', password: 'pass:word' From 0031c2a9b7ca661fd092562024c11babac2bc5e2 Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Mon, 6 Jun 2016 17:57:22 +0200 Subject: [PATCH 18/32] 0.2.2 --- packages/xo-remote-parser/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/xo-remote-parser/package.json b/packages/xo-remote-parser/package.json index 55dff0cf4..6c37fcaad 100644 --- a/packages/xo-remote-parser/package.json +++ b/packages/xo-remote-parser/package.json @@ -1,6 +1,6 @@ { "name": "xo-remote-parser", - "version": "0.2.1", + "version": "0.2.2", "license": "AGPL-3.0", "description": "", "keywords": [], From 32f4d42e593953404c9f7bd2a7657a251b3cfaf6 Mon Sep 17 00:00:00 2001 From: Fabrice Marsaud Date: Tue, 7 Jun 2016 10:10:20 +0200 Subject: [PATCH 19/32] fix(parse): revert to 0.2 API (#10) --- packages/xo-remote-parser/src/index.js | 10 +-- packages/xo-remote-parser/src/index.spec.js | 72 +++++++++++---------- 2 files changed, 41 insertions(+), 41 deletions(-) diff --git a/packages/xo-remote-parser/src/index.js b/packages/xo-remote-parser/src/index.js index 7bbc3a52e..1c5ff10fc 100644 --- a/packages/xo-remote-parser/src/index.js +++ b/packages/xo-remote-parser/src/index.js @@ -5,14 +5,8 @@ import trimStart from 'lodash/trimStart' const sanitizePath = (...paths) => filter(map(paths, s => s && filter(map(s.split('/'), trim)).join('/'))).join('/') -export const parse = url => { - if (typeof url === 'object') { - url = url.url - } - - const remote = {url} - - const [type, rest] = url.split('://') +export const parse = remote => { + const [type, rest] = remote.url.split('://') if (type === 'file') { remote.type = 'local' remote.path = `/${trimStart(rest, '/')}` // the leading slash has been forgotten on client side first implementation diff --git a/packages/xo-remote-parser/src/index.spec.js b/packages/xo-remote-parser/src/index.spec.js index 7ca45d0dd..698ff2ef4 100644 --- a/packages/xo-remote-parser/src/index.spec.js +++ b/packages/xo-remote-parser/src/index.spec.js @@ -11,36 +11,34 @@ import { parse, format } from './' // Data used for both parse and format (i.e. correctly formatted). const data = { file: { - url: 'file:///var/lib/xoa/backup', - type: 'local', - path: '/var/lib/xoa/backup' + in: { + url: 'file:///var/lib/xoa/backup', + name: 'fileRemote' + }, + out: { + url: 'file:///var/lib/xoa/backup', + type: 'local', + path: '/var/lib/xoa/backup', + name: 'fileRemote' + }, + url: 'file:///var/lib/xoa/backup' }, SMB: { - url: 'smb://Administrator:password@toto\\\\192.168.100.225\\smb\0', - type: 'smb', - host: '192.168.100.225\\smb', - path: '', - domain: 'toto', - username: 'Administrator', - password: 'password' - }, - 'SMB with @ sign in password': { - url: 'smb://Administrator:pass@word@toto\\\\192.168.100.225\\smb\0', - type: 'smb', - host: '192.168.100.225\\smb', - path: '', - domain: 'toto', - username: 'Administrator', - password: 'pass@word' - }, - 'SMB with colon in password': { - url: 'smb://Administrator:pass:word@toto\\\\192.168.100.225\\smb\0', - type: 'smb', - host: '192.168.100.225\\smb', - path: '', - domain: 'toto', - username: 'Administrator', - password: 'pass:word' + in: { + url: 'smb://Administrator:pas:sw@ord@toto\\\\192.168.100.225\\smb\0', + name: 'smbRemote' + }, + out: { + url: 'smb://Administrator:pas:sw@ord@toto\\\\192.168.100.225\\smb\0', + type: 'smb', + host: '192.168.100.225\\smb', + path: '', + domain: 'toto', + username: 'Administrator', + password: 'pas:sw@ord', + name: 'smbRemote' + }, + url: 'smb://Administrator:pas:sw@ord@toto\\\\192.168.100.225\\smb\0' } } @@ -48,9 +46,17 @@ const parseData = { ...data, 'file with missing leading slash (#7)': { - url: 'file://var/lib/xoa/backup', - type: 'local', - path: '/var/lib/xoa/backup' + in: { + url: 'file://var/lib/xoa/backup', + name: 'fileRemote' + }, + out: { + url: 'file://var/lib/xoa/backup', + type: 'local', + path: '/var/lib/xoa/backup', + name: 'fileRemote' + }, + url: 'file:///var/lib/xoa/backup' } } @@ -62,7 +68,7 @@ describe('format', () => { for (const name in formatData) { const datum = formatData[name] it(name, () => { - expect(format(datum)).to.equal(datum.url) + expect(format({...datum.out})).to.equal(datum.url) }) } }) @@ -71,7 +77,7 @@ describe('parse', () => { for (const name in parseData) { const datum = parseData[name] it(name, () => { - expect(parse(datum)).to.eql(datum) + expect(parse({...datum.in})).to.eql(datum.out) }) } }) From fb17de79885d10258c4ed63cb1ac4727ea590271 Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Tue, 7 Jun 2016 10:10:51 +0200 Subject: [PATCH 20/32] 0.2.3 --- packages/xo-remote-parser/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/xo-remote-parser/package.json b/packages/xo-remote-parser/package.json index 6c37fcaad..4d1ec33d9 100644 --- a/packages/xo-remote-parser/package.json +++ b/packages/xo-remote-parser/package.json @@ -1,6 +1,6 @@ { "name": "xo-remote-parser", - "version": "0.2.2", + "version": "0.2.3", "license": "AGPL-3.0", "description": "", "keywords": [], From 45a94fe73dc60cb73bb9b9c482d69daa49718f9c Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Wed, 8 Jun 2016 14:36:10 +0200 Subject: [PATCH 21/32] feat(parse): only accepts a string --- packages/xo-remote-parser/package.json | 1 + packages/xo-remote-parser/src/index.js | 42 ++++++++-------- packages/xo-remote-parser/src/index.spec.js | 55 +++++++-------------- 3 files changed, 42 insertions(+), 56 deletions(-) diff --git a/packages/xo-remote-parser/package.json b/packages/xo-remote-parser/package.json index 4d1ec33d9..fa8f3a5a2 100644 --- a/packages/xo-remote-parser/package.json +++ b/packages/xo-remote-parser/package.json @@ -32,6 +32,7 @@ "babel-preset-es2015": "^6.3.13", "babel-preset-stage-0": "^6.3.13", "clarify": "^1.0.5", + "deep-freeze": "0.0.1", "dependency-check": "^2.5.1", "ghooks": "^1.2.1", "mocha": "^2.3.4", diff --git a/packages/xo-remote-parser/src/index.js b/packages/xo-remote-parser/src/index.js index 1c5ff10fc..f3abe614c 100644 --- a/packages/xo-remote-parser/src/index.js +++ b/packages/xo-remote-parser/src/index.js @@ -5,19 +5,21 @@ import trimStart from 'lodash/trimStart' const sanitizePath = (...paths) => filter(map(paths, s => s && filter(map(s.split('/'), trim)).join('/'))).join('/') -export const parse = remote => { - const [type, rest] = remote.url.split('://') +export const parse = string => { + const object = { } + + const [type, rest] = string.split('://') if (type === 'file') { - remote.type = 'local' - remote.path = `/${trimStart(rest, '/')}` // the leading slash has been forgotten on client side first implementation + object.type = 'local' + object.path = `/${trimStart(rest, '/')}` // the leading slash has been forgotten on client side first implementation } else if (type === 'nfs') { - remote.type = 'nfs' + object.type = 'nfs' const [host, share] = rest.split(':') - remote.path = `/tmp/xo-server/mounts/${remote.id}` - remote.host = host - remote.share = share + object.path = `/tmp/xo-server/mounts/${object.id}` + object.host = host + object.share = share } else if (type === 'smb') { - remote.type = 'smb' + object.type = 'smb' const lastAtSign = rest.lastIndexOf('@') const smb = rest.slice(lastAtSign + 1) const auth = rest.slice(0, lastAtSign) @@ -26,23 +28,23 @@ export const parse = remote => { const password = auth.slice(firstColon + 1) const [domain, sh] = smb.split('\\\\') const [host, path] = sh.split('\0') - remote.host = host - remote.path = path - remote.domain = domain - remote.username = username - remote.password = password + object.host = host + object.path = path + object.domain = domain + object.username = username + object.password = password } - return remote + return object } export const format = ({type, host, path, username, password, domain}) => { type === 'local' && (type = 'file') - let url = `${type}://` + let string = `${type}://` if (type === 'nfs') { - url += `${host}:` + string += `${host}:` } if (type === 'smb') { - url += `${username}:${password}@${domain}\\\\${host}` + string += `${username}:${password}@${domain}\\\\${host}` } path = sanitizePath(path) if (type === 'smb') { @@ -51,6 +53,6 @@ export const format = ({type, host, path, username, password, domain}) => { } else { type === 'file' && (path = `/${path}`) } - url += path - return url + string += path + return string } diff --git a/packages/xo-remote-parser/src/index.spec.js b/packages/xo-remote-parser/src/index.spec.js index 698ff2ef4..057f4286a 100644 --- a/packages/xo-remote-parser/src/index.spec.js +++ b/packages/xo-remote-parser/src/index.spec.js @@ -1,5 +1,6 @@ /* eslint-env mocha */ +import deepFreeze from 'deep-freeze' import expect from 'must' // =================================================================== @@ -9,56 +10,38 @@ import { parse, format } from './' // =================================================================== // Data used for both parse and format (i.e. correctly formatted). -const data = { +const data = deepFreeze({ file: { - in: { - url: 'file:///var/lib/xoa/backup', - name: 'fileRemote' - }, - out: { - url: 'file:///var/lib/xoa/backup', + string: 'file:///var/lib/xoa/backup', + object: { type: 'local', - path: '/var/lib/xoa/backup', - name: 'fileRemote' - }, - url: 'file:///var/lib/xoa/backup' + path: '/var/lib/xoa/backup' + } }, SMB: { - in: { - url: 'smb://Administrator:pas:sw@ord@toto\\\\192.168.100.225\\smb\0', - name: 'smbRemote' - }, - out: { - url: 'smb://Administrator:pas:sw@ord@toto\\\\192.168.100.225\\smb\0', + string: 'smb://Administrator:pas:sw@ord@toto\\\\192.168.100.225\\smb\0', + object: { type: 'smb', host: '192.168.100.225\\smb', path: '', domain: 'toto', username: 'Administrator', - password: 'pas:sw@ord', - name: 'smbRemote' - }, - url: 'smb://Administrator:pas:sw@ord@toto\\\\192.168.100.225\\smb\0' + password: 'pas:sw@ord' + } } -} +}) -const parseData = { +const parseData = deepFreeze({ ...data, 'file with missing leading slash (#7)': { - in: { - url: 'file://var/lib/xoa/backup', - name: 'fileRemote' - }, - out: { - url: 'file://var/lib/xoa/backup', + string: 'file://var/lib/xoa/backup', + object: { type: 'local', - path: '/var/lib/xoa/backup', - name: 'fileRemote' - }, - url: 'file:///var/lib/xoa/backup' + path: '/var/lib/xoa/backup' + } } -} +}) const formatData = data @@ -68,7 +51,7 @@ describe('format', () => { for (const name in formatData) { const datum = formatData[name] it(name, () => { - expect(format({...datum.out})).to.equal(datum.url) + expect(format(datum.object)).to.equal(datum.string) }) } }) @@ -77,7 +60,7 @@ describe('parse', () => { for (const name in parseData) { const datum = parseData[name] it(name, () => { - expect(parse({...datum.in})).to.eql(datum.out) + expect(parse(datum.string)).to.eql(datum.object) }) } }) From 2451ac3ade21fa0af8fe976cd14466c583188d5c Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Wed, 8 Jun 2016 14:38:31 +0200 Subject: [PATCH 22/32] feat(parse): local type is now file --- packages/xo-remote-parser/src/index.js | 2 +- packages/xo-remote-parser/src/index.spec.js | 16 +++++++++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/packages/xo-remote-parser/src/index.js b/packages/xo-remote-parser/src/index.js index f3abe614c..7fe07e7cd 100644 --- a/packages/xo-remote-parser/src/index.js +++ b/packages/xo-remote-parser/src/index.js @@ -10,7 +10,7 @@ export const parse = string => { const [type, rest] = string.split('://') if (type === 'file') { - object.type = 'local' + object.type = 'file' object.path = `/${trimStart(rest, '/')}` // the leading slash has been forgotten on client side first implementation } else if (type === 'nfs') { object.type = 'nfs' diff --git a/packages/xo-remote-parser/src/index.spec.js b/packages/xo-remote-parser/src/index.spec.js index 057f4286a..836d0115a 100644 --- a/packages/xo-remote-parser/src/index.spec.js +++ b/packages/xo-remote-parser/src/index.spec.js @@ -14,7 +14,7 @@ const data = deepFreeze({ file: { string: 'file:///var/lib/xoa/backup', object: { - type: 'local', + type: 'file', path: '/var/lib/xoa/backup' } }, @@ -37,13 +37,23 @@ const parseData = deepFreeze({ 'file with missing leading slash (#7)': { string: 'file://var/lib/xoa/backup', object: { - type: 'local', + type: 'file', path: '/var/lib/xoa/backup' } } }) -const formatData = data +const formatData = deepFreeze({ + ...data, + + 'file with local type': { + string: 'file:///var/lib/xoa/backup', + object: { + type: 'local', + path: '/var/lib/xoa/backup' + } + } +}) // ------------------------------------------------------------------- From 45ec0b9b016f8904e0eedc05c5e65fad247166d3 Mon Sep 17 00:00:00 2001 From: Fabrice Marsaud Date: Wed, 8 Jun 2016 15:05:09 +0200 Subject: [PATCH 23/32] No more mount matters in nfs remotes + tests --- packages/xo-remote-parser/src/index.js | 5 ++--- packages/xo-remote-parser/src/index.spec.js | 8 ++++++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/packages/xo-remote-parser/src/index.js b/packages/xo-remote-parser/src/index.js index 7fe07e7cd..f381efe17 100644 --- a/packages/xo-remote-parser/src/index.js +++ b/packages/xo-remote-parser/src/index.js @@ -14,10 +14,9 @@ export const parse = string => { object.path = `/${trimStart(rest, '/')}` // the leading slash has been forgotten on client side first implementation } else if (type === 'nfs') { object.type = 'nfs' - const [host, share] = rest.split(':') - object.path = `/tmp/xo-server/mounts/${object.id}` + const [host, path] = rest.split(':') object.host = host - object.share = share + object.path = path } else if (type === 'smb') { object.type = 'smb' const lastAtSign = rest.lastIndexOf('@') diff --git a/packages/xo-remote-parser/src/index.spec.js b/packages/xo-remote-parser/src/index.spec.js index 836d0115a..14dd823fa 100644 --- a/packages/xo-remote-parser/src/index.spec.js +++ b/packages/xo-remote-parser/src/index.spec.js @@ -28,6 +28,14 @@ const data = deepFreeze({ username: 'Administrator', password: 'pas:sw@ord' } + }, + NFS: { + string: 'nfs://192.168.100.225:media/nfs', + object: { + type: 'nfs', + host: '192.168.100.225', + path: 'media/nfs' + } } }) From 6cced719dc8c8e4ef646861635ba41a4848446c7 Mon Sep 17 00:00:00 2001 From: Fabrice Marsaud Date: Wed, 8 Jun 2016 17:08:54 +0200 Subject: [PATCH 24/32] Handling a missing leading slash in nfs path --- packages/xo-remote-parser/src/index.js | 4 ++-- packages/xo-remote-parser/src/index.spec.js | 12 ++++++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/packages/xo-remote-parser/src/index.js b/packages/xo-remote-parser/src/index.js index f381efe17..68993294d 100644 --- a/packages/xo-remote-parser/src/index.js +++ b/packages/xo-remote-parser/src/index.js @@ -16,7 +16,7 @@ export const parse = string => { object.type = 'nfs' const [host, path] = rest.split(':') object.host = host - object.path = path + object.path = `/${trimStart(path, '/')}` // takes care of a missing leading slash coming from previous version format } else if (type === 'smb') { object.type = 'smb' const lastAtSign = rest.lastIndexOf('@') @@ -50,7 +50,7 @@ export const format = ({type, host, path, username, password, domain}) => { path = path.split('/') path = '\0' + path.join('\\') // FIXME saving with the windows fashion \ was a bad idea :,( } else { - type === 'file' && (path = `/${path}`) + path = `/${path}` } string += path return string diff --git a/packages/xo-remote-parser/src/index.spec.js b/packages/xo-remote-parser/src/index.spec.js index 14dd823fa..d6f925f55 100644 --- a/packages/xo-remote-parser/src/index.spec.js +++ b/packages/xo-remote-parser/src/index.spec.js @@ -30,11 +30,11 @@ const data = deepFreeze({ } }, NFS: { - string: 'nfs://192.168.100.225:media/nfs', + string: 'nfs://192.168.100.225:/media/nfs', object: { type: 'nfs', host: '192.168.100.225', - path: 'media/nfs' + path: '/media/nfs' } } }) @@ -48,6 +48,14 @@ const parseData = deepFreeze({ type: 'file', path: '/var/lib/xoa/backup' } + }, + 'nfs with missing leading slash': { + string: 'nfs://192.168.100.225:media/nfs', + object: { + type: 'nfs', + host: '192.168.100.225', + path: '/media/nfs' + } } }) From 02f75fb2e15e62dc95d0da1c8d1afbd599ba0b90 Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Wed, 8 Jun 2016 17:17:45 +0200 Subject: [PATCH 25/32] 0.3.0 --- packages/xo-remote-parser/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/xo-remote-parser/package.json b/packages/xo-remote-parser/package.json index fa8f3a5a2..4256e239f 100644 --- a/packages/xo-remote-parser/package.json +++ b/packages/xo-remote-parser/package.json @@ -1,6 +1,6 @@ { "name": "xo-remote-parser", - "version": "0.2.3", + "version": "0.3.0", "license": "AGPL-3.0", "description": "", "keywords": [], From 11bde53069ad27a2173ef023d5b87b6fd7838cd1 Mon Sep 17 00:00:00 2001 From: Greenkeeper Date: Fri, 15 Jul 2016 11:27:31 +0200 Subject: [PATCH 26/32] chore(package): update nyc to version 7.0.0 (#16) https://greenkeeper.io/ --- packages/xo-remote-parser/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/xo-remote-parser/package.json b/packages/xo-remote-parser/package.json index 4256e239f..17e2ebb79 100644 --- a/packages/xo-remote-parser/package.json +++ b/packages/xo-remote-parser/package.json @@ -37,7 +37,7 @@ "ghooks": "^1.2.1", "mocha": "^2.3.4", "must": "^0.13.1", - "nyc": "^6.4.4", + "nyc": "^7.0.0", "source-map-support": "^0.4.0", "standard": "^7.0.1", "trace": "^2.1.0" From 398db72b442a9cc67715f54f3bc73fd3e4f40d73 Mon Sep 17 00:00:00 2001 From: Greenkeeper Date: Tue, 2 Aug 2016 19:21:01 +0200 Subject: [PATCH 27/32] chore(package): update mocha to version 3.0.0 (#17) https://greenkeeper.io/ --- packages/xo-remote-parser/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/xo-remote-parser/package.json b/packages/xo-remote-parser/package.json index 17e2ebb79..0bdb65d79 100644 --- a/packages/xo-remote-parser/package.json +++ b/packages/xo-remote-parser/package.json @@ -35,7 +35,7 @@ "deep-freeze": "0.0.1", "dependency-check": "^2.5.1", "ghooks": "^1.2.1", - "mocha": "^2.3.4", + "mocha": "^3.0.0", "must": "^0.13.1", "nyc": "^7.0.0", "source-map-support": "^0.4.0", From df3ec9a6293b26e8eff48e6e73992346bd2ddf1f Mon Sep 17 00:00:00 2001 From: Greenkeeper Date: Sun, 14 Aug 2016 19:06:15 +0200 Subject: [PATCH 28/32] chore(package): update nyc to version 8.1.0 (#21) https://greenkeeper.io/ --- packages/xo-remote-parser/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/xo-remote-parser/package.json b/packages/xo-remote-parser/package.json index 0bdb65d79..7f5ae5446 100644 --- a/packages/xo-remote-parser/package.json +++ b/packages/xo-remote-parser/package.json @@ -37,7 +37,7 @@ "ghooks": "^1.2.1", "mocha": "^3.0.0", "must": "^0.13.1", - "nyc": "^7.0.0", + "nyc": "^8.1.0", "source-map-support": "^0.4.0", "standard": "^7.0.1", "trace": "^2.1.0" From 02a4161ecba193398fc52ee12061fa3a086510cd Mon Sep 17 00:00:00 2001 From: Greenkeeper Date: Wed, 24 Aug 2016 17:33:05 +0200 Subject: [PATCH 29/32] chore(package): update standard to version 8.0.0 (#22) https://greenkeeper.io/ --- packages/xo-remote-parser/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/xo-remote-parser/package.json b/packages/xo-remote-parser/package.json index 7f5ae5446..5af85c48e 100644 --- a/packages/xo-remote-parser/package.json +++ b/packages/xo-remote-parser/package.json @@ -39,7 +39,7 @@ "must": "^0.13.1", "nyc": "^8.1.0", "source-map-support": "^0.4.0", - "standard": "^7.0.1", + "standard": "^8.0.0", "trace": "^2.1.0" }, "scripts": { From 2d14fde6711f575dd20bb89204720cad678de88c Mon Sep 17 00:00:00 2001 From: Greenkeeper Date: Tue, 27 Sep 2016 23:39:57 +0200 Subject: [PATCH 30/32] chore(package): update babel-eslint to version 7.0.0 (#23) https://greenkeeper.io/ --- packages/xo-remote-parser/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/xo-remote-parser/package.json b/packages/xo-remote-parser/package.json index 5af85c48e..d93d1d669 100644 --- a/packages/xo-remote-parser/package.json +++ b/packages/xo-remote-parser/package.json @@ -28,7 +28,7 @@ }, "devDependencies": { "babel-cli": "^6.3.17", - "babel-eslint": "^6.0.4", + "babel-eslint": "^7.0.0", "babel-preset-es2015": "^6.3.13", "babel-preset-stage-0": "^6.3.13", "clarify": "^1.0.5", From 990c5e9f08d7964ba8856dad5f2ab0bd05d12492 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Tue, 1 Nov 2016 22:01:31 +0100 Subject: [PATCH 31/32] chore(package): update dependencies (#25) https://greenkeeper.io/ --- packages/xo-remote-parser/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/xo-remote-parser/package.json b/packages/xo-remote-parser/package.json index d93d1d669..c4fb386f3 100644 --- a/packages/xo-remote-parser/package.json +++ b/packages/xo-remote-parser/package.json @@ -31,7 +31,7 @@ "babel-eslint": "^7.0.0", "babel-preset-es2015": "^6.3.13", "babel-preset-stage-0": "^6.3.13", - "clarify": "^1.0.5", + "clarify": "^2.0.0", "deep-freeze": "0.0.1", "dependency-check": "^2.5.1", "ghooks": "^1.2.1", From 985a4780f5980f2db59b84fffc6e3b4e80a3e0db Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Tue, 29 Nov 2016 13:41:04 +0100 Subject: [PATCH 32/32] chore(package): update dependencies (#26) https://greenkeeper.io/ --- packages/xo-remote-parser/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/xo-remote-parser/package.json b/packages/xo-remote-parser/package.json index c4fb386f3..6adfde682 100644 --- a/packages/xo-remote-parser/package.json +++ b/packages/xo-remote-parser/package.json @@ -37,7 +37,7 @@ "ghooks": "^1.2.1", "mocha": "^3.0.0", "must": "^0.13.1", - "nyc": "^8.1.0", + "nyc": "^10.0.0", "source-map-support": "^0.4.0", "standard": "^8.0.0", "trace": "^2.1.0"