mpw 2.0.3 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6bb4b82dd0d113ea933f35498f0c06d204da9dd4
4
- data.tar.gz: 6e8e787417bab3e9e5a467af6f44f99569385c0b
3
+ metadata.gz: 4d0eff317597b9307b65264bd5c42547b32588d6
4
+ data.tar.gz: a374e4ec216d629846f5848e7648d606634eaf2f
5
5
  SHA512:
6
- metadata.gz: a64bfc419f4a5ff32bf19e4c187840a0ae5929695da310d9efa7fdbc7d3f1352e6fc11270a74b6b609996eda13079f946a6faf30342cb95529337847a4f0901a
7
- data.tar.gz: 6783a408ea98e5994845d552f5797a5cd3a30c7a921d4162ca03f46b5a2bb5bd8d9065df30a84fa8c2631b321d1e81ee9ea970ff00e062c739f9581894c823a3
6
+ metadata.gz: d4b873e23e0065cbe83eb0273e16186a721acfb162974f73036d8eee8f49588172e64cc4ef2ad859971989bf141a2253f7af3cf184a6e730b53d8f967454a7ed
7
+ data.tar.gz: 1d6c99d6e62f544139ffd11aa5185b99346f2e8b6c9777a32b42cd472be4db9f067a21a9a2fe9e11658c14649b8b997f08fa998c35fc78e88abdaf3137b6180e
data/Gemfile CHANGED
@@ -1,10 +1,8 @@
1
1
  source 'https://rubygems.org'
2
2
  gem 'highline'
3
- gem 'i18n', '0.6.9'
3
+ gem 'i18n'
4
4
  gem 'locale'
5
5
  gem 'gpgme'
6
6
  gem 'colorize'
7
-
8
- group :ssh do
9
- gem 'net-sftp'
10
- end
7
+ gem 'net-ssh'
8
+ gem 'net-scp'
data/README.md CHANGED
@@ -1,18 +1,127 @@
1
1
  # Manage your passwords!
2
2
 
3
3
  MPW is a little software which stores your passwords in an GPG encrypted file.
4
- MPW can synchronize your password with a MPW Server or via SSH or via FTP.
4
+ MPW can synchronize your password with via SSH or FTP.
5
5
 
6
6
  # Installation
7
7
 
8
- You must generate a GPG Key with GPG or with Seahorse (GUI on linux).
9
- This program work with ruby >= 1.9
8
+ This program work with ruby >= 2.0
10
9
 
11
10
  * install ruby and rubygems on your computer
12
11
  * gem install mpw
13
12
 
14
- If you want use mpw-ssh, you must install sshpass
15
-
16
13
  # How to use
17
14
 
18
- mpw -h
15
+ * Show help
16
+ ```
17
+ mpw --help
18
+ ```
19
+
20
+ * Setup a new config file
21
+ ```
22
+ mpw --setup
23
+ mpw --setup --config /path/conf/file.cfg
24
+ ```
25
+
26
+ * Create and setup a new wallet
27
+ ```
28
+ mpw --setup-wallet --wallet new_wallet_name
29
+ mpw --setup-wallet --wallet new_wallet_name --config /path/conf/file.cfg
30
+ ```
31
+
32
+ * Add a GPG key in wallet
33
+ ```
34
+ mpw --add --key root@localhost.local
35
+ mpw --add --key root@localhost.local --config /path/conf/file.cfg
36
+ mpw --add --key root@localhost.local --wallet wallet_name
37
+ mpw --add --key root@localhost.local --config /path/conf/file.cfg --wallet wallet_name
38
+ ```
39
+
40
+ * Add a new GPG key in wallet
41
+ ```
42
+ mpw --add --key root@localhost.local --file /path/gpg/file.pub
43
+ mpw --add --key root@localhost.local --file /path/gpg/file.pub --config /path/conf/file.cfg
44
+ mpw --add --key root@localhost.local --file /path/gpg/file.pub --wallet wallet_name
45
+ mpw --add --key root@localhost.local --file /path/gpg/file.pub --config /path/conf/file.cfg --wallet wallet_name
46
+ ```
47
+
48
+ * Delete a GPG key in wallet
49
+ ```
50
+ mpw --delete --key root@localhost.local
51
+ mpw --delete --key root@localhost.local --wallet wallet_name
52
+ mpw --delete --key root@localhost.local --wallet wallet_name --config /path/conf/file.cfg
53
+ ```
54
+
55
+ * Add a new item in wallet
56
+ ```
57
+ mpw --add
58
+ mpw --add --config /path/conf/file.cfg
59
+ mpw --add --wallet wallet_name
60
+ mpw --add --config /path/conf/file.cfg --wallet wallet_name
61
+ ```
62
+
63
+ * Update an item
64
+ ```
65
+ mpw --update --id uniq_id
66
+ mpw --update --id uniq_id --config /path/conf/file.cfg
67
+ mpw --update --id uniq_id --wallet wallet_name
68
+ mpw --update --id uniq_id --config /path/conf/file.cfg --wallet wallet_name
69
+ ```
70
+
71
+ * Delete an item
72
+ ```
73
+ mpw --delete --id uniq_id
74
+ mpw --delete --id uniq_id --config /path/conf/file.cfg
75
+ mpw --delete --id uniq_id --wallet wallet_name
76
+ mpw --delete --id uniq_id --config /path/conf/file.cfg --wallet wallet_name
77
+ ```
78
+
79
+ * Show an item
80
+ ```
81
+ mpw --show 'string to search'
82
+ mpw --show 'string to search' --config /path/conf/file.cfg
83
+ mpw --show 'string to search' --wallet wallet_name
84
+ mpw --show 'string to search' --config /path/conf/file.cfg --wallet wallet_name
85
+ mpw --show 'string to search' --group group_name
86
+ mpw --show 'string to search' --group group_name --config /path/conf/file.cfg
87
+ mpw --show 'string to search' --group group_name --wallet wallet_name
88
+ mpw --show 'string to search' --group group_name --config /path/conf/file.cfg --wallet wallet_name
89
+ ```
90
+
91
+ * Export data in YAML file
92
+ ```
93
+ mpw --export --file /path/file/to/export.yml
94
+ mpw --export --file /path/file/to/export.yml --config /path/conf/file.cfg
95
+ mpw --export --file /path/file/to/export.yml --wallet wallet_name
96
+ mpw --export --file /path/file/to/export.yml --config /path/conf/file.cfg --wallet wallet_name
97
+ ```
98
+
99
+ * Import data from YAML file
100
+ ```
101
+ mpw --import --file /path/file/to/export.yml
102
+ mpw --import --file /path/file/to/export.yml --config /path/conf/file.cfg
103
+ mpw --import --file /path/file/to/export.yml --wallet wallet_name
104
+ mpw --import --file /path/file/to/export.yml --config /path/conf/file.cfg --wallet wallet_name
105
+ ```
106
+
107
+ Format file to import:
108
+ ```
109
+ 1:
110
+ name: Website perso
111
+ group: Perso
112
+ host: localhost.local
113
+ protocol: ftp
114
+ user: test
115
+ password: letoortue
116
+ port: 21
117
+ comment: Mysuper website
118
+ 2:
119
+ name: Linuxfr
120
+ group: Pro
121
+ host: Linuxfr.org
122
+ protocol: https
123
+ user: test
124
+ password: coucou
125
+ port:
126
+ comment:
127
+ ```
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.0.3
1
+ 3.0.0
data/bin/mpw CHANGED
@@ -1,17 +1,26 @@
1
1
  #!/usr/bin/ruby
2
- # author: nishiki
3
- # mail: nishiki@yaegashi.fr
4
- # info: a simple script who manage your passwords
2
+ # MPW is a software to crypt and manage your passwords
3
+ # Copyright (C) 2016 Adrien Waksberg <mpw@yae.im>
4
+ #
5
+ # This program is free software; you can redistribute it and/or
6
+ # modify it under the terms of the GNU General Public License
7
+ # as published by the Free Software Foundation; either version 2
8
+ # of the License, or (at your option) any later version.
9
+ #
10
+ # This program is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU General Public License
16
+ # along with this program; if not, write to the Free Software
17
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
5
18
 
6
- require 'rubygems'
7
19
  require 'optparse'
8
20
  require 'pathname'
9
21
  require 'locale'
10
22
  require 'set'
11
23
  require 'i18n'
12
- require 'mpw/mpw'
13
- require 'mpw/config'
14
- require 'mpw/ui/cli'
15
24
 
16
25
  # --------------------------------------------------------- #
17
26
  # Set local
@@ -25,8 +34,13 @@ end
25
34
 
26
35
  APP_ROOT = File.dirname(Pathname.new(__FILE__).realpath)
27
36
 
37
+ # TODO
38
+ require "#{APP_ROOT}/../lib/mpw/mpw.rb"
39
+ require "#{APP_ROOT}/../lib/mpw/config.rb"
40
+ require "#{APP_ROOT}/../lib/mpw/ui/cli.rb"
41
+
28
42
  I18n::Backend::Simple.send(:include, I18n::Backend::Fallbacks)
29
- I18n.load_path = Dir["#{APP_ROOT}/../i18n/cli/*.yml"]
43
+ I18n.load_path = Dir["#{APP_ROOT}/../i18n/*.yml"]
30
44
  I18n.default_locale = :en
31
45
  I18n.locale = lang.to_sym
32
46
 
@@ -36,16 +50,16 @@ I18n.locale = lang.to_sym
36
50
 
37
51
  options = {}
38
52
  options[:force] = false
39
- options[:format] = false
40
53
  options[:sync] = true
41
54
  options[:group] = nil
42
55
  options[:config] = nil
56
+ options[:wallet] = nil
43
57
 
44
58
  OptionParser.new do |opts|
45
59
  opts.banner = "#{I18n.t('option.usage')}: mpw [options]"
46
60
 
47
- opts.on('-s', '--show [SEARCH]', I18n.t('option.show')) do |search|
48
- search.nil? ? (options[:show] = '') : (options[:show] = search)
61
+ opts.on('-a', '--add', I18n.t('option.add')) do
62
+ options[:add] = true
49
63
  end
50
64
 
51
65
  opts.on('-A', '--show-all', I18n.t('option.show_all')) do
@@ -53,64 +67,74 @@ OptionParser.new do |opts|
53
67
  options[:show] = ''
54
68
  end
55
69
 
56
- opts.on('-u', '--update ID', I18n.t('option.update')) do |id|
57
- options[:update] = id
70
+ opts.on('-c', '--config CONFIG', I18n.t('option.config')) do |config|
71
+ options[:config] = config
58
72
  end
59
73
 
60
- opts.on('-d', '--delete ID', I18n.t('option.remove')) do |id|
61
- options[:delete] = id
74
+ opts.on('-d', '--delete', I18n.t('option.remove')) do
75
+ options[:delete] = true
62
76
  end
63
77
 
64
- opts.on('-g', '--group GROUP', I18n.t('option.group')) do |group|
65
- options[:group] = group
78
+ opts.on('-e', '--export', I18n.t('option.export')) do
79
+ options[:export] = true
66
80
  end
67
81
 
68
- opts.on('-a', '--add', I18n.t('option.add')) do
69
- options[:add] = true
82
+ opts.on('-f', '--file FILE', I18n.t('option.file')) do |file|
83
+ options[:file] = file
70
84
  end
71
85
 
72
- opts.on('-c', '--config CONFIG', I18n.t('option.config')) do |config|
73
- options[:config] = config
86
+ opts.on('-F', '--force', I18n.t('option.force')) do
87
+ options[:force] = true
74
88
  end
75
89
 
76
- opts.on('-S', '--setup', I18n.t('option.setup')) do
77
- options[:setup] = true
90
+ opts.on('-g', '--group GROUP', I18n.t('option.group')) do |group|
91
+ options[:group] = group
78
92
  end
79
93
 
80
- opts.on('-p', '--protocol PROTOCOL', I18n.t('option.protocol')) do |protocol|
81
- options[:protocol] = protocol
94
+ opts.on('-G', '--generate-password [LENGTH]', I18n.t('option.generate_password')) do |length|
95
+ puts MPW::MPW::password(length)
96
+ exit 0
82
97
  end
83
98
 
84
- opts.on('-e', '--export FILE', I18n.t('option.export')) do |file|
85
- options[:export] = file
86
- options[:type] = :yaml
99
+ opts.on('-h', '--help', I18n.t('option.help')) do
100
+ puts opts
101
+ exit 0
87
102
  end
88
103
 
89
- opts.on('-t', '--type TYPE', I18n.t('option.type')) do |type|
90
- options[:type] = type.to_sym
104
+ opts.on('-i', '--id ID', I18n.t('option.id')) do |id|
105
+ options[:id] = id
91
106
  end
92
107
 
93
- opts.on('-i', '--import FILE', I18n.t('option.import')) do |file|
94
- options[:import] = file
95
- options[:type] = :yaml
108
+ opts.on('-I', '--import', I18n.t('option.import')) do
109
+ options[:import] = true
96
110
  end
97
111
 
98
- opts.on('-f', '--force', I18n.t('option.force')) do
99
- options[:force] = true
112
+ opts.on('-k', '--key KEY', I18n.t('option.key')) do |key|
113
+ options[:key] = key
100
114
  end
101
115
 
102
116
  opts.on('-N', '--no-sync', I18n.t('option.no_sync')) do
103
117
  options[:sync] = false
104
118
  end
105
119
 
106
- opts.on('-G', '--generate-password [LENGTH]', I18n.t('option.generate_password')) do |length|
107
- puts MPW::MPW::password(length)
108
- exit 0
120
+ opts.on('-s', '--show [SEARCH]', I18n.t('option.show')) do |search|
121
+ search.nil? ? (options[:show] = '') : (options[:show] = search)
109
122
  end
110
123
 
111
- opts.on('-h', '--help', I18n.t('option.help')) do
112
- puts opts
113
- exit 0
124
+ opts.on('-S', '--setup', I18n.t('option.setup')) do
125
+ options[:setup] = true
126
+ end
127
+
128
+ opts.on('-u', '--update', I18n.t('option.update')) do
129
+ options[:update] = true
130
+ end
131
+
132
+ opts.on('-w', '--wallet WALLET', I18n.t('option.wallet')) do |wallet|
133
+ options[:wallet] = wallet
134
+ end
135
+
136
+ opts.on('-W', '--setup-wallet', I18n.t('option.setup_wallet')) do
137
+ options[:setup_wallet] = true
114
138
  end
115
139
  end.parse!
116
140
 
@@ -118,51 +142,59 @@ end.parse!
118
142
  # Main
119
143
  # --------------------------------------------------------- #
120
144
 
121
- config = MPW::Config.new(options[:config])
122
- check_error = config.checkconfig
123
-
124
- cli = Cli.new(config)
145
+ config = MPW::Config.new(options[:config])
146
+ cli = MPW::Cli.new(config, options[:sync])
125
147
 
126
148
  # Setup a new config
127
- if not check_error or not options[:setup].nil?
149
+ if not config.is_valid? or not options[:setup].nil?
128
150
  cli.setup(lang)
129
151
  elsif not config.check_gpg_key?
130
152
  cli.setup_gpg_key
131
153
  end
132
154
 
155
+ cli.get_wallet(options[:wallet])
133
156
  cli.decrypt
134
- cli.sync(options[:sync])
135
157
 
136
158
  # Display the item's informations
137
159
  if not options[:show].nil?
138
160
  opts = {search: options[:show],
139
161
  group: options[:group],
140
- protocol: options[:protocol],
141
162
  }
142
163
 
143
164
  cli.display(opts)
144
165
 
145
166
  # Remove an item
146
- elsif not options[:delete].nil?
147
- cli.delete(options[:delete], options[:force])
167
+ elsif not options[:delete].nil? and not options[:id].nil?
168
+ cli.delete(options[:id], options[:force])
148
169
 
149
170
  # Update an item
150
- elsif not options[:update].nil?
151
- cli.update(options[:update])
171
+ elsif not options[:update].nil? and not options[:id].nil?
172
+ cli.update(options[:id])
152
173
 
153
174
  # Add a new item
154
- elsif not options[:add].nil?
175
+ elsif not options[:add].nil? and options[:key].nil?
155
176
  cli.add
156
177
 
178
+ # Add a new public key in wallet
179
+ elsif not options[:add].nil? and not options[:key].nil?
180
+ cli.add_key(options[:key], options[:file])
181
+
182
+ # Delete a public key in wallet
183
+ elsif not options[:delete].nil? and not options[:key].nil?
184
+ cli.delete_key(options[:key])
185
+
157
186
  # Export
158
- elsif not options[:export].nil?
159
- cli.export(options[:export], options[:type])
187
+ elsif not options[:export].nil? and not options[:file].nil?
188
+ cli.export(options[:file])
160
189
 
161
190
  # Add a new item
162
- elsif not options[:import].nil?
163
- cli.import(options[:import], options[:type], options[:force])
191
+ elsif not options[:import].nil? and not options[:file].nil?
192
+ cli.import(options[:file])
193
+
194
+ # Setup wallet config
195
+ elsif not options[:setup_wallet].nil?
196
+ cli.setup_wallet_config
164
197
 
165
- # Interactive mode
166
198
  end
167
199
 
168
200
  cli = nil
@@ -1,8 +1,6 @@
1
1
  ---
2
2
  en:
3
3
  error:
4
- client:
5
- no_authorized: "You aren't authorized."
6
4
  config:
7
5
  write: "Can't write the config file!"
8
6
  check: "Checkconfig failed!"
@@ -14,52 +12,56 @@ en:
14
12
  password: "You must define a password for your GPG key!"
15
13
  delete:
16
14
  id_no_exist: "Can't delete the item %{id}, it doesn't exist!"
17
- export:
18
- unknown_type: "The data type %{type} is unknown!"
19
- write: "Can't export, unable to write in %{file}!"
15
+ export: "Can't export, unable to write in %{file}!"
20
16
  gpg_file:
21
17
  decrypt: "Can't decrypt file!"
22
18
  encrypt: "Can't encrypt the GPG file!"
23
- import:
24
- bad_format: "Can't import, the file is badly formated!"
25
- read: "Can't import, unable to read %{file}!"
19
+ mpw_file:
20
+ read_data: "Can't to read the MPW file!"
21
+ write_data: "Can't to write the MPW file!"
22
+ import: "Can't import, unable to read %{file}!"
26
23
  update:
27
24
  name_empty: "You must define a name!"
28
25
  sync:
26
+ general: "An error is appeared durint the sync"
29
27
  connection: "Connection fail!"
30
28
  communication: "A communication problem with the server is appeared!"
31
29
  download: "Can't download the file!"
32
30
  not_authorized: "You haven't the access to remote file!"
33
31
  upload: "Can't upload the file on the server!"
34
- unknown: "An unknown error is occured!"
35
- unknown_type: "The sync type is unknown"
32
+ unknown: "An unknown error is occured!"
33
+ unknown_type: "The sync type is unknown"
36
34
 
37
35
  warning:
38
36
  select: 'Your choice is not a valid element!'
39
37
 
40
38
  option:
41
- usage: "Usage"
42
- show: "Search and show the items"
43
- show_all: "Show all items"
44
- update: "Update an item"
45
- remove: "Delete an item"
46
- group: "Search the items with specified group"
47
- add: "Add an item"
39
+ add: "Add an item or key"
48
40
  config: "Specify the configuration file to use"
49
- setup: "Create a new configuration file"
50
- protocol: "Select the items with the specified protocol"
51
- export: "Export all items in a file"
52
- type: "Data's type export file [csv|yaml]"
53
- import: "Import item since a yaml or csv file"
54
- force: "Force an action"
55
- no_sync: "Disable synchronization with the server"
56
- format: "Change the display items format by an alternative format"
41
+ export: "Export a wallet in an yaml file"
42
+ file: "Specify a file, to use with the options [--import | --export | --add]"
43
+ force: "No ask to confirm when you delete an item"
57
44
  generate_password: "Generate a random password (default 8 characters)"
45
+ group: "Search the items with specified group"
58
46
  help: "Show this help message"
47
+ id: "Specify an id, to use with the options [--delete | --update]"
48
+ import: "Import item since a yaml file"
49
+ key: "Specify the key name, to use with the options [--add | --delete | --update]"
50
+ no_sync: "Disable synchronization with the server"
51
+ setup: "Create a new configuration file"
52
+ setup_wallet: "Create a new configuration file for a wallet"
53
+ show: "Search and show the items"
54
+ show_all: "Show all items"
55
+ remove: "Delete an item"
56
+ update: "Update an item"
57
+ usage: "Usage"
58
+ wallet: "Specify a wallet to use"
59
59
 
60
60
  form:
61
61
  select: "Select the item: "
62
- add:
62
+ add_key:
63
+ valid: "Key has been added!"
64
+ add_item:
63
65
  title: "Add a new item"
64
66
  name: "Enter the name: "
65
67
  group: "Enter the group (optional): "
@@ -70,7 +72,9 @@ en:
70
72
  port: "Enter the connection port (optional): "
71
73
  comment: "Enter a comment (optional): "
72
74
  valid: "Item has been added!"
73
- delete:
75
+ delete_key:
76
+ valid: "Key has been deleted!"
77
+ delete_item:
74
78
  ask: "Are you sure you want to remove the item %{id} ?"
75
79
  valid: "The item %{id} has been removed!"
76
80
  not_valid: "The item %{id} hasn't been removed, because it doesn't exist!"
@@ -78,20 +82,21 @@ en:
78
82
  ask: "Are you sure you want to import this file %{file} ?"
79
83
  valid: "The import is succesfull!"
80
84
  not_valid: "No data to import!"
81
- setup:
85
+ setup_config:
82
86
  title: "Setup a new config file"
83
- lang: "Choose your language (en, fr, ...): "
84
- gpg_key: "Enter the GPG key: "
85
- share_gpg_keys: "Enter the GPG keys with who you want to share the passwords: "
86
- gpg_file: "Enter the path to encrypt file [default=%{home}/db/default.gpg]: "
87
- timeout: "Enter the timeout (in seconde) to GPG password [default=60]: "
88
- sync_type: "Synchronization type (mpw, ssh, ftp, or nil): "
87
+ lang: "Choose your language (en, fr, ...) [default=%{lang}]: "
88
+ gpg_key: "Enter the GPG key [ex: test@host.local]: "
89
+ wallet_dir: "Enter the wallets's folder path [default=%{home}/wallets]: "
90
+ valid: "The config file has been created!"
91
+ setup_wallet:
92
+ title: "Wallet setup"
93
+ sync_type: "Synchronization type (ssh, ftp, or nil): "
89
94
  sync_host: "Synchronization server: "
90
95
  sync_port: "Port of the synchronization server: "
91
96
  sync_user: "Username for the synchronization: "
92
97
  sync_pwd: "Password for the synchronization: "
93
98
  sync_path: "File path for the synchronization : "
94
- valid: "The config file has been created!"
99
+ valid: "The wallet config file has been created!"
95
100
  setup_gpg_key:
96
101
  title: "Setup a GPG key"
97
102
  ask: "Do you want create your GPG key ? (Y/n)"
@@ -104,7 +109,7 @@ en:
104
109
  expire: "Expire time of the GPG key [default=0 (unlimited)]: "
105
110
  wait: "Please waiting during the GPG key generate, this process can take few minutes."
106
111
  valid: "Your GPG key has been created ;-)"
107
- update:
112
+ update_item:
108
113
  title: "Update an item"
109
114
  name: "Enter the name [%{name}]: "
110
115
  group: "Enter the group [%{group}]: "
@@ -121,28 +126,17 @@ en:
121
126
  display:
122
127
  comment: "Comment"
123
128
  error: "ERROR"
124
- gpg_password: "Password GPG: "
129
+ gpg_password: "GPG passphrase: "
125
130
  group: "Group"
126
131
  login: "Login"
127
132
  name: "Name"
128
- nothing: "Nothing result!"
133
+ nothing: "No matches!"
129
134
  password: "Password"
130
135
  port: "Port"
131
136
  protocol: "Protocol"
132
137
  server: "Server"
133
138
  warning: "Warning"
134
139
 
135
- ssh:
136
- option:
137
- usage: "Usage"
138
- login: "Change the login"
139
- server: "Change the host or the ip"
140
- port: "Change the port"
141
- help: "Show this help message"
142
- display:
143
- connect: "Connection to:"
144
- nothing: "Nothing result!"
145
-
146
140
  formats:
147
141
  default: ! '%Y-%m-%d'
148
142
  long: ! '%B %d, %Y'