chupacabra 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/bin/chupacabra +29 -0
- data/lib/chupacabra/storage.rb +2 -10
- data/lib/chupacabra/system.rb +106 -9
- data/lib/chupacabra/version.rb +1 -1
- data/lib/chupacabra.rb +15 -2
- data/osx/Chupacabra.workflow/Contents/Info.plist +18 -0
- data/osx/Chupacabra.workflow/Contents/document.wflow +203 -0
- metadata +11 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: db7a66ca88de111dd84901ecdab5769515b6e043
|
4
|
+
data.tar.gz: f2a0dc74dc23193a7c4e081db08e7158feeac75b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bdc590c9e5825d6dc5e1d85e67e5551e73eed25e4d7a16e84a6f75de7d59003683dea3031f2d9e7a52be35c559ce4d8eba954df4f5ce925e2b5ae1624300c2ca
|
7
|
+
data.tar.gz: 047356004cbeb3a60912cbff5c5af45c8a4dd4a1738daafa02f86f7a0d48c10220a3e158e262ef43f54eee083e00663a8943028180801d0d37a471a50edeed3a
|
data/bin/chupacabra
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
lib = File.expand_path('../../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
2
4
|
require 'chupacabra'
|
3
5
|
require 'optparse'
|
4
6
|
require 'ostruct'
|
@@ -12,6 +14,33 @@ options.verbose = false
|
|
12
14
|
OptionParser.new do |opts|
|
13
15
|
opts.banner = "Usage: chupacabra [options]"
|
14
16
|
|
17
|
+
opts.on("-c", "--clear", "Wipe out all your chupacabra passwords") do |port|
|
18
|
+
Chupacabra::Storage.clear
|
19
|
+
puts "Your chupacabra is a virgin now."
|
20
|
+
exit
|
21
|
+
end
|
22
|
+
|
23
|
+
opts.on("-i", "--install", "Install Apple service") do |port|
|
24
|
+
Chupacabra::System.install
|
25
|
+
puts "Service installed in #{Chupacabra::System.user_service_path}"
|
26
|
+
puts ""
|
27
|
+
puts "You can create keyboard shortcut with:"
|
28
|
+
puts "System Preferences -> Keyboard -> Keyboard Shortcuts -> Services -> Chupacabra"
|
29
|
+
puts ''
|
30
|
+
exit
|
31
|
+
end
|
32
|
+
|
33
|
+
opts.on("-l", "--log", "Turns on logging to #{Chupacabra::System.log_path}") do |port|
|
34
|
+
Chupacabra.log = true
|
35
|
+
puts "Logging into #{Chupacabra::System.log_path}"
|
36
|
+
end
|
37
|
+
|
38
|
+
opts.on("-u", "--uninstall", "Uninstall Apple service") do |port|
|
39
|
+
Chupacabra::System.uninstall
|
40
|
+
puts "Service removed from #{Chupacabra::System.user_service_path}"
|
41
|
+
exit
|
42
|
+
end
|
43
|
+
|
15
44
|
opts.on("-v", "--verbose", "Prints password") do |port|
|
16
45
|
options.verbose = true
|
17
46
|
end
|
data/lib/chupacabra/storage.rb
CHANGED
@@ -16,11 +16,11 @@ module Chupacabra
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def [](key)
|
19
|
-
data[
|
19
|
+
data[key]
|
20
20
|
end
|
21
21
|
|
22
22
|
def []=(key, value)
|
23
|
-
data[
|
23
|
+
data[key] = value
|
24
24
|
save
|
25
25
|
end
|
26
26
|
|
@@ -48,13 +48,5 @@ module Chupacabra
|
|
48
48
|
file << Crypto.encrypt(Marshal.dump(@data), @password)
|
49
49
|
end
|
50
50
|
end
|
51
|
-
|
52
|
-
def extract(key)
|
53
|
-
if key =~ /https?\:\/\/(?:www.)?([^\/\?]+)/
|
54
|
-
$1
|
55
|
-
else
|
56
|
-
raise ArgumentError, "#{key} doesn't look like url"
|
57
|
-
end
|
58
|
-
end
|
59
51
|
end
|
60
52
|
end
|
data/lib/chupacabra/system.rb
CHANGED
@@ -1,12 +1,15 @@
|
|
1
1
|
require 'base64'
|
2
|
+
require 'digest'
|
3
|
+
require 'pathname'
|
4
|
+
require 'fileutils'
|
2
5
|
|
3
6
|
module Chupacabra
|
4
7
|
module System
|
5
8
|
extend self
|
6
9
|
|
7
10
|
def get_password
|
8
|
-
return get_env_password
|
9
|
-
password = get_password_from_dialog
|
11
|
+
return get_env_password unless get_env_password.empty?
|
12
|
+
password = Digest::SHA1.hexdigest(get_password_from_dialog)
|
10
13
|
raise "Password can't be empty" if !password || password.empty?
|
11
14
|
set_env_password(password)
|
12
15
|
password
|
@@ -33,10 +36,99 @@ module Chupacabra
|
|
33
36
|
`uname`.strip == 'Linux'
|
34
37
|
end
|
35
38
|
|
39
|
+
def front_app
|
40
|
+
run_script(
|
41
|
+
<<-EOS
|
42
|
+
tell application "System Events"
|
43
|
+
return name of first application process whose frontmost is true
|
44
|
+
end tell
|
45
|
+
EOS
|
46
|
+
)
|
47
|
+
end
|
48
|
+
|
49
|
+
def get_browser_url
|
50
|
+
app = front_app
|
51
|
+
run_script(
|
52
|
+
case app
|
53
|
+
when 'Google Chrome', 'Google Chrome Canary'
|
54
|
+
%Q(tell application "#{app}" to return URL of active tab of front window)
|
55
|
+
when 'Camino'
|
56
|
+
%Q(tell application "#{app}" to return URL of current tab of front browser window)
|
57
|
+
when 'Safari', 'Webkit', 'Opera'
|
58
|
+
%Q(tell application "#{app}" to return URL of front document)
|
59
|
+
when 'firefox'
|
60
|
+
<<-EOS
|
61
|
+
tell application "System Events"
|
62
|
+
keystroke "l" using command down
|
63
|
+
keystroke "c" using command down
|
64
|
+
end tell
|
65
|
+
delay 0.1
|
66
|
+
return the clipboard
|
67
|
+
EOS
|
68
|
+
end
|
69
|
+
)
|
70
|
+
end
|
71
|
+
|
72
|
+
def alert(message)
|
73
|
+
run_script(
|
74
|
+
<<-EOS
|
75
|
+
tell application "#{front_app}"
|
76
|
+
activate
|
77
|
+
display alert "#{message}" as warning
|
78
|
+
end tell
|
79
|
+
EOS
|
80
|
+
)
|
81
|
+
end
|
82
|
+
|
83
|
+
def install
|
84
|
+
user_service_contents = user_service_path + 'Contents'
|
85
|
+
user_service_contents.mkpath unless user_service_contents.exist?
|
86
|
+
chupacabra_service_contents = Pathname.new(
|
87
|
+
File.expand_path('../../../osx/Chupacabra.workflow/Contents', __FILE__)
|
88
|
+
)
|
89
|
+
|
90
|
+
%w(document.wflow Info.plist).each do |filename|
|
91
|
+
(user_service_contents + filename).open('w') do |file|
|
92
|
+
file << (chupacabra_service_contents + filename).read
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def uninstall
|
98
|
+
FileUtils.rm_rf user_service_path
|
99
|
+
end
|
100
|
+
|
101
|
+
def user_service_path
|
102
|
+
if Chupacabra.test?
|
103
|
+
Pathname.new(ENV['HOME']) + 'Library/Services/Chupacabra_test.workflow'
|
104
|
+
else
|
105
|
+
Pathname.new(ENV['HOME']) + 'Library/Services/Chupacabra.workflow'
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def log(message)
|
110
|
+
return unless Chupacabra.log
|
111
|
+
log_path.open('a') do |file|
|
112
|
+
file << message
|
113
|
+
file << "\n"
|
114
|
+
end
|
115
|
+
message
|
116
|
+
end
|
117
|
+
|
118
|
+
def log_path
|
119
|
+
(Pathname.new(ENV['HOME']) + 'chupacabra.log')
|
120
|
+
end
|
121
|
+
|
36
122
|
private
|
37
123
|
|
124
|
+
def run_script(script)
|
125
|
+
return unless script
|
126
|
+
raise ArgumentError, "Script can't contain single quotes" if script =~ /'/
|
127
|
+
`osascript #{script.split("\n").collect{|line| " -e '#{line.strip}'"}.join}`.strip
|
128
|
+
end
|
129
|
+
|
38
130
|
def password_variable
|
39
|
-
Chupacabra.test? ? '
|
131
|
+
Chupacabra.test? ? 'CHUPACABRA_TEST' : 'CHUPACABRA'
|
40
132
|
end
|
41
133
|
|
42
134
|
def get_password_from_dialog
|
@@ -53,17 +145,22 @@ module Chupacabra
|
|
53
145
|
'with title "Chupacabra"' +
|
54
146
|
'with icon caution with hidden answer'
|
55
147
|
|
56
|
-
|
148
|
+
script = <<-EOS
|
149
|
+
tell application "#{front_app}"
|
150
|
+
activate
|
151
|
+
#{dialog}
|
152
|
+
end tell
|
153
|
+
EOS
|
154
|
+
|
155
|
+
run_script(script)
|
57
156
|
end
|
58
157
|
|
59
158
|
def get_env_password
|
60
|
-
|
61
|
-
|
62
|
-
Base64.decode64(password64).strip
|
63
|
-
end
|
159
|
+
`launchctl getenv #{password_variable}`.strip
|
160
|
+
end
|
64
161
|
|
65
162
|
def set_env_password(password)
|
66
|
-
`launchctl setenv #{password_variable} '#{
|
163
|
+
`launchctl setenv #{password_variable} '#{password}'`
|
67
164
|
end
|
68
165
|
end
|
69
166
|
end
|
data/lib/chupacabra/version.rb
CHANGED
data/lib/chupacabra.rb
CHANGED
@@ -6,16 +6,24 @@ require 'chupacabra/version'
|
|
6
6
|
module Chupacabra
|
7
7
|
extend self
|
8
8
|
attr_accessor :env
|
9
|
+
attr_accessor :log
|
9
10
|
|
10
11
|
def get_password
|
12
|
+
Chupacabra::System.set_clipboard('')
|
11
13
|
data = Storage.new(System.get_password)
|
12
|
-
key = System.
|
14
|
+
key = extract_url(System.get_browser_url) || "app: #{System.front_app}"
|
15
|
+
System.log(key)
|
13
16
|
if data[key]
|
14
17
|
output(data[key])
|
15
18
|
else
|
16
19
|
data[key] = Crypto.generate_password
|
17
20
|
output(data[key])
|
18
21
|
end
|
22
|
+
|
23
|
+
rescue Chupacabra::Crypto::WrongPassword
|
24
|
+
System.clear
|
25
|
+
System.alert('Wrong password!')
|
26
|
+
'Wrong password'
|
19
27
|
end
|
20
28
|
|
21
29
|
def test?
|
@@ -25,7 +33,12 @@ module Chupacabra
|
|
25
33
|
private
|
26
34
|
|
27
35
|
def output(text)
|
28
|
-
System.set_clipboard(text)
|
36
|
+
System.set_clipboard(text) if System.osx?
|
29
37
|
text
|
30
38
|
end
|
39
|
+
|
40
|
+
def extract_url(key)
|
41
|
+
return unless key
|
42
|
+
"web: #{$1}" if key =~ /https?\:\/\/(?:www.)?([^\/\?]+)/
|
43
|
+
end
|
31
44
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
3
|
+
<plist version="1.0">
|
4
|
+
<dict>
|
5
|
+
<key>NSServices</key>
|
6
|
+
<array>
|
7
|
+
<dict>
|
8
|
+
<key>NSMenuItem</key>
|
9
|
+
<dict>
|
10
|
+
<key>default</key>
|
11
|
+
<string>Chupacabra</string>
|
12
|
+
</dict>
|
13
|
+
<key>NSMessage</key>
|
14
|
+
<string>runWorkflowAsService</string>
|
15
|
+
</dict>
|
16
|
+
</array>
|
17
|
+
</dict>
|
18
|
+
</plist>
|
@@ -0,0 +1,203 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
3
|
+
<plist version="1.0">
|
4
|
+
<dict>
|
5
|
+
<key>AMApplicationBuild</key>
|
6
|
+
<string>339.2</string>
|
7
|
+
<key>AMApplicationVersion</key>
|
8
|
+
<string>2.2.4</string>
|
9
|
+
<key>AMDocumentVersion</key>
|
10
|
+
<string>2</string>
|
11
|
+
<key>actions</key>
|
12
|
+
<array>
|
13
|
+
<dict>
|
14
|
+
<key>action</key>
|
15
|
+
<dict>
|
16
|
+
<key>AMAccepts</key>
|
17
|
+
<dict>
|
18
|
+
<key>Container</key>
|
19
|
+
<string>List</string>
|
20
|
+
<key>Optional</key>
|
21
|
+
<true/>
|
22
|
+
<key>Types</key>
|
23
|
+
<array>
|
24
|
+
<string>com.apple.cocoa.string</string>
|
25
|
+
</array>
|
26
|
+
</dict>
|
27
|
+
<key>AMActionVersion</key>
|
28
|
+
<string>2.0.2</string>
|
29
|
+
<key>AMApplication</key>
|
30
|
+
<array>
|
31
|
+
<string>Automator</string>
|
32
|
+
</array>
|
33
|
+
<key>AMParameterProperties</key>
|
34
|
+
<dict>
|
35
|
+
<key>COMMAND_STRING</key>
|
36
|
+
<dict/>
|
37
|
+
<key>CheckedForUserDefaultShell</key>
|
38
|
+
<dict/>
|
39
|
+
<key>inputMethod</key>
|
40
|
+
<dict/>
|
41
|
+
<key>shell</key>
|
42
|
+
<dict/>
|
43
|
+
<key>source</key>
|
44
|
+
<dict/>
|
45
|
+
</dict>
|
46
|
+
<key>AMProvides</key>
|
47
|
+
<dict>
|
48
|
+
<key>Container</key>
|
49
|
+
<string>List</string>
|
50
|
+
<key>Types</key>
|
51
|
+
<array>
|
52
|
+
<string>com.apple.cocoa.string</string>
|
53
|
+
</array>
|
54
|
+
</dict>
|
55
|
+
<key>ActionBundlePath</key>
|
56
|
+
<string>/System/Library/Automator/Run Shell Script.action</string>
|
57
|
+
<key>ActionName</key>
|
58
|
+
<string>Run Shell Script</string>
|
59
|
+
<key>ActionParameters</key>
|
60
|
+
<dict>
|
61
|
+
<key>COMMAND_STRING</key>
|
62
|
+
<string>chupacabra</string>
|
63
|
+
<key>CheckedForUserDefaultShell</key>
|
64
|
+
<true/>
|
65
|
+
<key>inputMethod</key>
|
66
|
+
<integer>0</integer>
|
67
|
+
<key>shell</key>
|
68
|
+
<string>/bin/bash</string>
|
69
|
+
<key>source</key>
|
70
|
+
<string></string>
|
71
|
+
</dict>
|
72
|
+
<key>BundleIdentifier</key>
|
73
|
+
<string>com.apple.RunShellScript</string>
|
74
|
+
<key>CFBundleVersion</key>
|
75
|
+
<string>2.0.2</string>
|
76
|
+
<key>CanShowSelectedItemsWhenRun</key>
|
77
|
+
<false/>
|
78
|
+
<key>CanShowWhenRun</key>
|
79
|
+
<true/>
|
80
|
+
<key>Category</key>
|
81
|
+
<array>
|
82
|
+
<string>AMCategoryUtilities</string>
|
83
|
+
</array>
|
84
|
+
<key>Class Name</key>
|
85
|
+
<string>RunShellScriptAction</string>
|
86
|
+
<key>InputUUID</key>
|
87
|
+
<string>C2E1151F-70F9-45DA-A66F-E5821E7D65CE</string>
|
88
|
+
<key>Keywords</key>
|
89
|
+
<array>
|
90
|
+
<string>Shell</string>
|
91
|
+
<string>Script</string>
|
92
|
+
<string>Command</string>
|
93
|
+
<string>Run</string>
|
94
|
+
<string>Unix</string>
|
95
|
+
</array>
|
96
|
+
<key>OutputUUID</key>
|
97
|
+
<string>02C1B9C8-898D-4995-967A-73E7E47A97C2</string>
|
98
|
+
<key>UUID</key>
|
99
|
+
<string>4E665380-85F1-457E-B9A0-E49253C1AB30</string>
|
100
|
+
<key>UnlocalizedApplications</key>
|
101
|
+
<array>
|
102
|
+
<string>Automator</string>
|
103
|
+
</array>
|
104
|
+
<key>arguments</key>
|
105
|
+
<dict>
|
106
|
+
<key>0</key>
|
107
|
+
<dict>
|
108
|
+
<key>default value</key>
|
109
|
+
<integer>0</integer>
|
110
|
+
<key>name</key>
|
111
|
+
<string>inputMethod</string>
|
112
|
+
<key>required</key>
|
113
|
+
<string>0</string>
|
114
|
+
<key>type</key>
|
115
|
+
<string>0</string>
|
116
|
+
<key>uuid</key>
|
117
|
+
<string>0</string>
|
118
|
+
</dict>
|
119
|
+
<key>1</key>
|
120
|
+
<dict>
|
121
|
+
<key>default value</key>
|
122
|
+
<string></string>
|
123
|
+
<key>name</key>
|
124
|
+
<string>source</string>
|
125
|
+
<key>required</key>
|
126
|
+
<string>0</string>
|
127
|
+
<key>type</key>
|
128
|
+
<string>0</string>
|
129
|
+
<key>uuid</key>
|
130
|
+
<string>1</string>
|
131
|
+
</dict>
|
132
|
+
<key>2</key>
|
133
|
+
<dict>
|
134
|
+
<key>default value</key>
|
135
|
+
<false/>
|
136
|
+
<key>name</key>
|
137
|
+
<string>CheckedForUserDefaultShell</string>
|
138
|
+
<key>required</key>
|
139
|
+
<string>0</string>
|
140
|
+
<key>type</key>
|
141
|
+
<string>0</string>
|
142
|
+
<key>uuid</key>
|
143
|
+
<string>2</string>
|
144
|
+
</dict>
|
145
|
+
<key>3</key>
|
146
|
+
<dict>
|
147
|
+
<key>default value</key>
|
148
|
+
<string></string>
|
149
|
+
<key>name</key>
|
150
|
+
<string>COMMAND_STRING</string>
|
151
|
+
<key>required</key>
|
152
|
+
<string>0</string>
|
153
|
+
<key>type</key>
|
154
|
+
<string>0</string>
|
155
|
+
<key>uuid</key>
|
156
|
+
<string>3</string>
|
157
|
+
</dict>
|
158
|
+
<key>4</key>
|
159
|
+
<dict>
|
160
|
+
<key>default value</key>
|
161
|
+
<string>/bin/sh</string>
|
162
|
+
<key>name</key>
|
163
|
+
<string>shell</string>
|
164
|
+
<key>required</key>
|
165
|
+
<string>0</string>
|
166
|
+
<key>type</key>
|
167
|
+
<string>0</string>
|
168
|
+
<key>uuid</key>
|
169
|
+
<string>4</string>
|
170
|
+
</dict>
|
171
|
+
</dict>
|
172
|
+
<key>conversionLabel</key>
|
173
|
+
<integer>0</integer>
|
174
|
+
<key>isViewVisible</key>
|
175
|
+
<true/>
|
176
|
+
<key>location</key>
|
177
|
+
<string>423.000000:670.000000</string>
|
178
|
+
<key>nibPath</key>
|
179
|
+
<string>/System/Library/Automator/Run Shell Script.action/Contents/Resources/English.lproj/main.nib</string>
|
180
|
+
</dict>
|
181
|
+
<key>isViewVisible</key>
|
182
|
+
<true/>
|
183
|
+
</dict>
|
184
|
+
</array>
|
185
|
+
<key>connectors</key>
|
186
|
+
<dict/>
|
187
|
+
<key>workflowMetaData</key>
|
188
|
+
<dict>
|
189
|
+
<key>serviceApplicationBundleID</key>
|
190
|
+
<string></string>
|
191
|
+
<key>serviceApplicationPath</key>
|
192
|
+
<string></string>
|
193
|
+
<key>serviceInputTypeIdentifier</key>
|
194
|
+
<string>com.apple.Automator.nothing</string>
|
195
|
+
<key>serviceOutputTypeIdentifier</key>
|
196
|
+
<string>com.apple.Automator.nothing</string>
|
197
|
+
<key>serviceProcessesInput</key>
|
198
|
+
<integer>0</integer>
|
199
|
+
<key>workflowTypeIdentifier</key>
|
200
|
+
<string>com.apple.Automator.servicesMenu</string>
|
201
|
+
</dict>
|
202
|
+
</dict>
|
203
|
+
</plist>
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chupacabra
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dawid Sklodowski
|
@@ -65,11 +65,20 @@ files:
|
|
65
65
|
- lib/chupacabra/system.rb
|
66
66
|
- lib/chupacabra/version.rb
|
67
67
|
- lib/chupacabra.rb
|
68
|
+
- osx/Chupacabra.workflow/Contents/document.wflow
|
69
|
+
- osx/Chupacabra.workflow/Contents/Info.plist
|
68
70
|
homepage: http://github.com/dawid-sklodowski/chupacabra
|
69
71
|
licenses:
|
70
72
|
- MIT
|
71
73
|
metadata: {}
|
72
|
-
post_install_message:
|
74
|
+
post_install_message: |2+
|
75
|
+
Thank you for installing chupacabra.
|
76
|
+
|
77
|
+
To hook chupacabra into your MacOS please issue command:
|
78
|
+
|
79
|
+
chupacabra --install
|
80
|
+
--------------------
|
81
|
+
|
73
82
|
rdoc_options: []
|
74
83
|
require_paths:
|
75
84
|
- lib
|