fspath: allow unicode numbers and letters in remote names
Previously it was limited to plain ASCII (0-9, A-Z, a-z). Implemented by adding \p{L}\p{N} alongside the \w in the regex, even though these overlap it means we can be sure it is 100% backwards compatible. Fixes #6618
This commit is contained in:
parent
f650a543ef
commit
8e6a469f98
4 changed files with 18 additions and 4 deletions
|
@ -3431,7 +3431,7 @@ func (f *Fs) Command(ctx context.Context, name string, arg []string, opt map[str
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
re := regexp.MustCompile(`[^\w_. -]+`)
|
re := regexp.MustCompile(`[^\w\p{L}\p{N}. -]+`)
|
||||||
if _, ok := opt["config"]; ok {
|
if _, ok := opt["config"]; ok {
|
||||||
lines := []string{}
|
lines := []string{}
|
||||||
upstreams := []string{}
|
upstreams := []string{}
|
||||||
|
|
|
@ -338,10 +338,18 @@ Will get their own names
|
||||||
### Valid remote names
|
### Valid remote names
|
||||||
|
|
||||||
Remote names are case sensitive, and must adhere to the following rules:
|
Remote names are case sensitive, and must adhere to the following rules:
|
||||||
- May only contain `0`-`9`, `A`-`Z`, `a`-`z`, `_`, `-`, `.` and space.
|
- May contain number, letter, `_`, `-`, `.` and space.
|
||||||
- May not start with `-` or space.
|
- May not start with `-` or space.
|
||||||
- May not end with space.
|
- May not end with space.
|
||||||
|
|
||||||
|
Starting with rclone version 1.61, any Unicode numbers and letters are allowed,
|
||||||
|
while in older versions it was limited to plain ASCII (0-9, A-Z, a-z). If you use
|
||||||
|
the same rclone configuration from different shells, which may be configured with
|
||||||
|
different character encoding, you must be cautious to use characters that are
|
||||||
|
possible to write in all of them. This is mostly a problem on Windows, where
|
||||||
|
the console traditionally uses a non-Unicode character set - defined
|
||||||
|
by the so-called "code page".
|
||||||
|
|
||||||
Quoting and the shell
|
Quoting and the shell
|
||||||
---------------------
|
---------------------
|
||||||
|
|
||||||
|
|
|
@ -13,11 +13,11 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
configNameRe = `[\w.-]+(?: +[\w.-]+)*`
|
configNameRe = `[\w\p{L}\p{N}.-]+(?: +[\w\p{L}\p{N}.-]+)*`
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
errInvalidCharacters = errors.New("config name contains invalid characters - may only contain `0-9`, `A-Z`, `a-z`, `_`, `-`, `.` and space, while not start or end with space")
|
errInvalidCharacters = errors.New("config name contains invalid characters - may only contain numbers, letters, `_`, `-`, `.` and space, while not start or end with space")
|
||||||
errCantBeEmpty = errors.New("can't use empty string as a path")
|
errCantBeEmpty = errors.New("can't use empty string as a path")
|
||||||
errCantStartWithDash = errors.New("config name starts with `-`")
|
errCantStartWithDash = errors.New("config name starts with `-`")
|
||||||
errBadConfigParam = errors.New("config parameters may only contain `0-9`, `A-Z`, `a-z` and `_`")
|
errBadConfigParam = errors.New("config parameters may only contain `0-9`, `A-Z`, `a-z` and `_`")
|
||||||
|
|
|
@ -23,6 +23,7 @@ func TestCheckConfigName(t *testing.T) {
|
||||||
want error
|
want error
|
||||||
}{
|
}{
|
||||||
{"remote", nil},
|
{"remote", nil},
|
||||||
|
{"REMOTE", nil},
|
||||||
{"", errInvalidCharacters},
|
{"", errInvalidCharacters},
|
||||||
{":remote:", errInvalidCharacters},
|
{":remote:", errInvalidCharacters},
|
||||||
{"remote:", errInvalidCharacters},
|
{"remote:", errInvalidCharacters},
|
||||||
|
@ -38,6 +39,8 @@ func TestCheckConfigName(t *testing.T) {
|
||||||
{"..", nil},
|
{"..", nil},
|
||||||
{".r.e.m.o.t.e.", nil},
|
{".r.e.m.o.t.e.", nil},
|
||||||
{"rem ote", nil},
|
{"rem ote", nil},
|
||||||
|
{"blåbær", nil},
|
||||||
|
{"chữ Quốc ngữ", nil},
|
||||||
{"remote ", errInvalidCharacters},
|
{"remote ", errInvalidCharacters},
|
||||||
{" remote", errInvalidCharacters},
|
{" remote", errInvalidCharacters},
|
||||||
{" remote ", errInvalidCharacters},
|
{" remote ", errInvalidCharacters},
|
||||||
|
@ -53,6 +56,7 @@ func TestCheckRemoteName(t *testing.T) {
|
||||||
want error
|
want error
|
||||||
}{
|
}{
|
||||||
{":remote:", nil},
|
{":remote:", nil},
|
||||||
|
{":REMOTE:", nil},
|
||||||
{":s3:", nil},
|
{":s3:", nil},
|
||||||
{"remote:", nil},
|
{"remote:", nil},
|
||||||
{".:", nil},
|
{".:", nil},
|
||||||
|
@ -60,6 +64,8 @@ func TestCheckRemoteName(t *testing.T) {
|
||||||
{".r.e.m.o.t.e.:", nil},
|
{".r.e.m.o.t.e.:", nil},
|
||||||
{"-r-emote-:", nil},
|
{"-r-emote-:", nil},
|
||||||
{"rem ote:", nil},
|
{"rem ote:", nil},
|
||||||
|
{"blåbær:", nil},
|
||||||
|
{"chữ Quốc ngữ:", nil},
|
||||||
{"remote :", errInvalidCharacters},
|
{"remote :", errInvalidCharacters},
|
||||||
{" remote:", errInvalidCharacters},
|
{" remote:", errInvalidCharacters},
|
||||||
{" remote :", errInvalidCharacters},
|
{" remote :", errInvalidCharacters},
|
||||||
|
|
Loading…
Reference in a new issue