pairzone 0.0.1

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.
Files changed (46) hide show
  1. data/.gitignore +26 -0
  2. data/.rspec +1 -0
  3. data/.rvmrc +7 -0
  4. data/Gemfile +3 -0
  5. data/Gemfile.lock +76 -0
  6. data/README.md +44 -0
  7. data/Rakefile +14 -0
  8. data/bin/pairzone +83 -0
  9. data/config/cucumber.yml +4 -0
  10. data/features/collaborator_joins_pairzone.feature +20 -0
  11. data/features/developer_signs_in.feature +11 -0
  12. data/features/developer_starts_pairzone.feature +35 -0
  13. data/features/keys/bob.key +12 -0
  14. data/features/keys/bob.key.pub +1 -0
  15. data/features/keys/derek.key +27 -0
  16. data/features/keys/derek.key.pub +1 -0
  17. data/features/server/stub-pairzone-server.rb +76 -0
  18. data/features/step_definitions/authorisation_steps.rb +8 -0
  19. data/features/step_definitions/info_steps.rb +5 -0
  20. data/features/step_definitions/repository_steps.rb +6 -0
  21. data/features/step_definitions/running_steps.rb +32 -0
  22. data/features/step_definitions/starting_steps.rb +47 -0
  23. data/features/support/aruba.rb +1 -0
  24. data/features/support/env.rb +5 -0
  25. data/features/support/helpers/server_helper.rb +40 -0
  26. data/features/support/hooks.rb +24 -0
  27. data/features/support/pairzone-config.rb +13 -0
  28. data/lib/pairzone.rb +14 -0
  29. data/lib/pairzone/api/base.rb +27 -0
  30. data/lib/pairzone/api/pairzone.rb +25 -0
  31. data/lib/pairzone/api/pairzone_connection.rb +32 -0
  32. data/lib/pairzone/api/pairzone_lifecycle.rb +34 -0
  33. data/lib/pairzone/api/user.rb +16 -0
  34. data/lib/pairzone/authenticate.rb +51 -0
  35. data/lib/pairzone/commands/info.rb +25 -0
  36. data/lib/pairzone/commands/join.rb +21 -0
  37. data/lib/pairzone/commands/start.rb +29 -0
  38. data/lib/pairzone/logger.rb +33 -0
  39. data/lib/pairzone/shell.rb +38 -0
  40. data/lib/pairzone/version.rb +3 -0
  41. data/pairzone.gemspec +35 -0
  42. data/spec/pairzone/api/pairzone_lifecycle_spec.rb +26 -0
  43. data/spec/pairzone/authentication_spec.rb +44 -0
  44. data/spec/pairzone/logger_spec.rb +41 -0
  45. data/spec/spec_helper.rb +7 -0
  46. metadata +292 -0
data/.gitignore ADDED
@@ -0,0 +1,26 @@
1
+ ## MAC OS
2
+ .DS_Store
3
+
4
+ ## TEXTMATE
5
+ *.tmproj
6
+ tmtags
7
+
8
+ ## EMACS
9
+ *~
10
+ \#*
11
+ .\#*
12
+
13
+ ## VIM
14
+ *.swp
15
+
16
+ ## PROJECT::GENERAL
17
+ coverage
18
+ rdoc
19
+ doc
20
+ .yardoc
21
+ pkg
22
+ .bundle
23
+
24
+ ## PROJECT::SPECIFIC
25
+ tmp/aruba*
26
+ tmp/foo*
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ -fs -c
data/.rvmrc ADDED
@@ -0,0 +1,7 @@
1
+
2
+ if [[ -d "${rvm_path:-$HOME/.rvm}/environments" \
3
+ && -s "${rvm_path:-$HOME/.rvm}/environments/ruby-1.9.2-p0@pairzone" ]] ; then
4
+ \. "${rvm_path:-$HOME/.rvm}/environments/ruby-1.9.2-p0@pairzone"
5
+ else
6
+ rvm --create "ruby-1.9.2-p0@pairzone"
7
+ fi
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source :rubygems
2
+
3
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,76 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ pairzone (0.0.1)
5
+ gli
6
+ highline
7
+ net-ssh
8
+ party_resource
9
+
10
+ GEM
11
+ remote: http://rubygems.org/
12
+ specs:
13
+ activesupport (3.2.6)
14
+ i18n (~> 0.6)
15
+ multi_json (~> 1.0)
16
+ aruba (0.4.11)
17
+ childprocess (>= 0.2.3)
18
+ cucumber (>= 1.1.1)
19
+ ffi (>= 1.0.11)
20
+ rspec (>= 2.7.0)
21
+ background_process (1.2)
22
+ builder (3.0.0)
23
+ childprocess (0.3.3)
24
+ ffi (~> 1.0.6)
25
+ cucumber (1.2.1)
26
+ builder (>= 2.1.2)
27
+ diff-lcs (>= 1.1.3)
28
+ gherkin (~> 2.11.0)
29
+ json (>= 1.4.6)
30
+ diff-lcs (1.1.3)
31
+ ffi (1.0.11)
32
+ gherkin (2.11.1)
33
+ json (>= 1.4.6)
34
+ gli (1.6.0)
35
+ highline (1.6.13)
36
+ httparty (0.8.3)
37
+ multi_json (~> 1.0)
38
+ multi_xml
39
+ i18n (0.6.0)
40
+ json (1.4.6)
41
+ multi_json (1.3.6)
42
+ multi_xml (0.5.1)
43
+ net-ssh (2.5.2)
44
+ party_resource (0.0.3)
45
+ activesupport (>= 2.3.5)
46
+ httparty (>= 0.5.2)
47
+ rack (1.2.1)
48
+ rack-contrib (1.1.0)
49
+ rack (>= 0.9.1)
50
+ rake (0.9.2.2)
51
+ rspec (2.10.0)
52
+ rspec-core (~> 2.10.0)
53
+ rspec-expectations (~> 2.10.0)
54
+ rspec-mocks (~> 2.10.0)
55
+ rspec-core (2.10.1)
56
+ rspec-expectations (2.10.0)
57
+ diff-lcs (~> 1.1.3)
58
+ rspec-mocks (2.10.1)
59
+ sinatra (1.1.0)
60
+ rack (~> 1.1)
61
+ tilt (~> 1.1)
62
+ tilt (1.1)
63
+
64
+ PLATFORMS
65
+ ruby
66
+
67
+ DEPENDENCIES
68
+ aruba (~> 0.4)
69
+ background_process
70
+ cucumber (~> 1.2)
71
+ json
72
+ pairzone!
73
+ rack-contrib
74
+ rake (~> 0.9.2.2)
75
+ rspec (~> 2.10.0)
76
+ sinatra
data/README.md ADDED
@@ -0,0 +1,44 @@
1
+ # Pairzone
2
+
3
+ This is the gem code for pairzone.
4
+
5
+ *THIS IS A WORK IN PROGRESS AND WILL NOT WORK AND IS NOT FINISHED!*
6
+
7
+ There's lots to do:
8
+
9
+ * Transfer the gem from using a server to using local ec2 keys (via fog?)
10
+ * Convert the cucumber tests to do everything locally
11
+ * Get the chef code into this repo and convert to chef-solo
12
+ * Make the pairzone gem:
13
+
14
+ ** Request ec2 credentials
15
+ ** Boot up an ec2 instance
16
+ ** Use chef to configure it
17
+ ** Upload your git repo (DONE)
18
+
19
+ ** Sign in
20
+
21
+ ## Working on the code
22
+
23
+ We're using github issues and pull requests. Usual score.
24
+
25
+ We hang out in #pairzone on Freenode.
26
+
27
+ ### Getting set up
28
+
29
+ In order to run the features you need a user account on your machine called pairzone-auth with the following in _~/.ssh/authorized_keys:_
30
+
31
+ <pre>
32
+ command="echo bob.key" ssh-dss AAAAB3NzaC1kc3MAAACBAPD5ncLLo+X1GIkOXY9VQ8fWeFqtd7xSQvLOfANYh3u55mrL4xVrBaU8wku3WBOF8hWqmXThNspWJ9J95lKT89lpmAD2cGqWul619VR97Q31ar/xy4C6FI3RCUe8QIRffbGG8fWPHkAHmMPNnM9i7fBt4O0uqbgQ2K0WiE5EFkO/AAAAFQDmMkzSFVsYIpaIyFdYGGsB4qxiuwAAAIBQ+uMl6dePFYKazCdqNbP4uRq8IO4dcAC7dfM1cE0KQFK/OLfM2mcI2OBZksL2BT30NOPlvxoFekTsXw0O3NU0ejA0Xfbg4/mH6klpN9+X8TkO5A9EGSyZ+8n9N0hSTtW7YxK/ADDudnn3fZnp2+qrEmXvkfOZFY7RFYzQn6P6dgAAAIEAvXmzl+P4SEcWH48BEsFWkAlb2iz7xYLYa1MVN/pwxyA5DMZ8VXkRk1z2QBU4TMkCOc/e8XAt0aBPlp/L00bQPC2xVwxic6cdEg50LYS+UQQnirlOs9+lref48ksIdSThuvnkIs+T9L7SAuj/zon4xuroLQWsKtgRRS6SN0Q62t0= bob.key.pub
33
+ command="echo derek.key" ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAvoEkswUJgBnwv0fH1LO4BXnN1zwC6ARLWvWmH7rhmRz0Y9YodEu7Kz7xYQUB5eWm1eOVTu+Bq6c29MzynTvRJi1WCumILDUQ29LciC9Y6A9VmVrHFoehtzqIpfsXpn1pTP+8RZCfS4Pt+yVyWzJKx1AkbT+cgi0wjAhQxnpdqMmp3kBfb1XZgi3qBz2Cm+Q8GRI3b0Xj7ahhYmMzJWS5qHn57jXsjxxYQuFMIScm2L6x+RhP1aE5Y/RBWW2xLQ3WCN252wWHFvWfKKCAMOXaSJKImdGwDnr0cIUbDyJhzbjPSPOjP1P0t05YK/cqK6t7BQBvcFPvXJCLBD7ZAO5t7w== derek.key.pub
34
+ </pre>
35
+
36
+ You will also need a 'pairzone' account to pretend to be the actual pairzone instance. This should have a similar file set up in _~/.ssh/authorized_keys:_
37
+
38
+ <pre>
39
+ ssh-dss AAAAB3NzaC1kc3MAAACBAPD5ncLLo+X1GIkOXY9VQ8fWeFqtd7xSQvLOfANYh3u55mrL4xVrBaU8wku3WBOF8hWqmXThNspWJ9J95lKT89lpmAD2cGqWul619VR97Q31ar/xy4C6FI3RCUe8QIRffbGG8fWPHkAHmMPNnM9i7fBt4O0uqbgQ2K0WiE5EFkO/AAAAFQDmMkzSFVsYIpaIyFdYGGsB4qxiuwAAAIBQ+uMl6dePFYKazCdqNbP4uRq8IO4dcAC7dfM1cE0KQFK/OLfM2mcI2OBZksL2BT30NOPlvxoFekTsXw0O3NU0ejA0Xfbg4/mH6klpN9+X8TkO5A9EGSyZ+8n9N0hSTtW7YxK/ADDudnn3fZnp2+qrEmXvkfOZFY7RFYzQn6P6dgAAAIEAvXmzl+P4SEcWH48BEsFWkAlb2iz7xYLYa1MVN/pwxyA5DMZ8VXkRk1z2QBU4TMkCOc/e8XAt0aBPlp/L00bQPC2xVwxic6cdEg50LYS+UQQnirlOs9+lref48ksIdSThuvnkIs+T9L7SAuj/zon4xuroLQWsKtgRRS6SN0Q62t0= bob.key.pub
40
+ ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAvoEkswUJgBnwv0fH1LO4BXnN1zwC6ARLWvWmH7rhmRz0Y9YodEu7Kz7xYQUB5eWm1eOVTu+Bq6c29MzynTvRJi1WCumILDUQ29LciC9Y6A9VmVrHFoehtzqIpfsXpn1pTP+8RZCfS4Pt+yVyWzJKx1AkbT+cgi0wjAhQxnpdqMmp3kBfb1XZgi3qBz2Cm+Q8GRI3b0Xj7ahhYmMzJWS5qHn57jXsjxxYQuFMIScm2L6x+RhP1aE5Y/RBWW2xLQ3WCN252wWHFvWfKKCAMOXaSJKImdGwDnr0cIUbDyJhzbjPSPOjP1P0t05YK/cqK6t7BQBvcFPvXJCLBD7ZAO5t7w== derek.key.pub
41
+ </pre>
42
+
43
+ On OSX you will also need to add the user account to the Sharing preference pane to allow them to log in
44
+
data/Rakefile ADDED
@@ -0,0 +1,14 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ require 'rspec/core/rake_task'
4
+ RSpec::Core::RakeTask.new(:spec) do |spec|
5
+ spec.pattern = 'spec/**/*_spec.rb'
6
+ end
7
+
8
+ RSpec::Core::RakeTask.new(:rcov) do |spec|
9
+ spec.pattern = 'spec/**/*_spec.rb'
10
+ spec.rcov = true
11
+ spec.rcov_opts = %q[--exclude "spec"]
12
+ end
13
+
14
+ task :default => :spec
data/bin/pairzone ADDED
@@ -0,0 +1,83 @@
1
+ #!/usr/bin/env ruby
2
+ $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib')
3
+
4
+ require 'rubygems'
5
+
6
+ require 'bundler/setup'
7
+
8
+ require 'pairzone'
9
+
10
+ require 'gli'
11
+
12
+ include GLI
13
+
14
+ config_file '.pairzone/config'
15
+
16
+ desc 'Show debug output'
17
+ switch [:d, :debug]
18
+
19
+ desc 'Specifies the pairzone web service to connect to'
20
+ arg_name 'host'
21
+ flag [:s, :server]
22
+
23
+ desc 'Specifies the pairzone config directory'
24
+ arg_name 'directory'
25
+ default_value "#{Dir.home}/.pairzone"
26
+ flag [:config]
27
+
28
+ desc 'Specifies the private key to use as your identity'
29
+ arg_name 'private key'
30
+ default_value "~/.ssh/id_rsa"
31
+ flag [:i, :identity]
32
+
33
+ pre do |globals, command, options, args|
34
+ Pairzone::Logger.configure_from(globals)
35
+ true
36
+ end
37
+
38
+ def local_project_name
39
+ File.basename(Dir.pwd)
40
+ end
41
+
42
+ def connect_with(globals)
43
+ key = Pairzone::Authenticate.retrieve_key(globals[:config], globals[:s])
44
+ Pairzone::Api::Base.connect_to(globals[:s], username: key, password: 'x', default: true)
45
+ end
46
+
47
+ desc 'Display Pairzone info'
48
+ long_desc 'Display information about the Pairzone for the current directory.'
49
+ command [:info] do |c|
50
+ c.action do |globals, options, args|
51
+ connect_with globals
52
+ Pairzone::Commands::Info.new(local_project_name).execute
53
+ end
54
+ end
55
+
56
+ desc 'Start a new Pairzone'
57
+ long_desc 'Start a new Pairzone for the current directory, or reconnect to a running one.'
58
+ command [:start] do |c|
59
+ c.desc 'Specify a comma seperated list of collaborators to add to this pairzone.'
60
+ c.arg_name 'collaborators'
61
+ c.flag [:c]
62
+
63
+ c.desc 'Do not connect to this pairzone, but leave it running in the background.'
64
+ c.switch [:b, :background]
65
+ c.action do |globals, options, args|
66
+ connect_with globals
67
+ Pairzone::Commands::Start.new(local_project_name, globals[:i], options).execute
68
+ end
69
+ end
70
+
71
+ desc 'Join an existing pairzone'
72
+ long_desc 'Allows an owner or collaborator to join a running pairzone instance.'
73
+ command [:join] do |c|
74
+ c.action do |globals, options, args|
75
+ connect_with globals
76
+ name = args[0]
77
+ identity = globals[:i]
78
+ Pairzone::Commands::Join.new(name, identity).execute
79
+ end
80
+ end
81
+
82
+ GLI.run(ARGV)
83
+
@@ -0,0 +1,4 @@
1
+ default: --format progress --strict --tags ~@wip features
2
+ wip: --drb --tags @wip:3 --wip features
3
+ autotest: --color --strict --drb --format pretty
4
+ 'autotest-all': --color --format progress --strict
@@ -0,0 +1,20 @@
1
+ @api_server
2
+ Feature: Collaborator joins pairzone
3
+ In order to pair on writing code
4
+ As a collaborator
5
+ I want to join existing pairzones that I am listed as a collaborator on
6
+
7
+ Scenario: Developer starts, then joins pairzone
8
+ Given "bob" has already started a pairzone
9
+ When "bob" runs "pairzone join bob-aruba" in test mode
10
+ Then "bob" should be connected to "bob-aruba"
11
+
12
+ Scenario: Collaborator joins pairzone
13
+ Given "bob" has already started a pairzone with "derek" as a collaborator
14
+ When "derek" runs "pairzone join bob-aruba" in test mode
15
+ Then "derek" should be connected to "bob-aruba"
16
+
17
+ Scenario: Collaborator cannot join pairzone where they're not listed
18
+ Given "bob" has already started a pairzone
19
+ When "derek" runs "pairzone join bob-aruba" in test mode
20
+ Then "derek" should not be able to connect
@@ -0,0 +1,11 @@
1
+ @api_server
2
+ Feature: Developer signs in
3
+ In order to be securely identified to pairzone
4
+ As a developer
5
+ I want the pairzone gem to use my public key to get an API key from pairzone
6
+
7
+ Scenario: Derek signs in for first time
8
+ When "derek" runs "pairzone info" in test mode with no api key
9
+ And "derek" supplies his credentials
10
+ Then his API key is saved
11
+ And he sees information about his pairzone account
@@ -0,0 +1,35 @@
1
+ @api_server @announce
2
+ Feature: Developer starts pairzone
3
+
4
+ Scenario:
5
+ Given I have a local git repository
6
+ When "bob" runs "pairzone start" in test mode
7
+ Then a new pairzone is started for "bob"
8
+ And the code in my current directory is pushed to the server
9
+ And an SSH connection is made to my new pairzone
10
+ And the code is downloaded to a "pairzone" branch when I quit the session
11
+
12
+ Scenario: Developer starts pairzone in the background
13
+ Given I have a local git repository
14
+ When "bob" runs "pairzone start --background" in test mode
15
+ Then a new pairzone is started for "bob" in the background
16
+
17
+ Scenario: Developer rejoins previously started pairzone
18
+ Given I have a local git repository
19
+ When "bob" runs "pairzone start --background" in test mode
20
+ And "bob" runs "pairzone start" in test mode
21
+ Then "bob" should be connected to "bob-aruba"
22
+
23
+ Scenario: Developer adds collaborator
24
+ Given I have a local git repository
25
+ When "bob" runs "pairzone start -c derek" in test mode
26
+ Then "derek" is added as a collaborator on my new pairzone
27
+ When "bob" runs "pairzone start -c derek,jim" in test mode
28
+ Then "derek" is added as a collaborator on my new pairzone
29
+ And "jim" is added as a collaborator on my new pairzone
30
+
31
+ Scenario: Developer adds non-existent collaborator
32
+ Given I have a local git repository
33
+ When "bob" runs "pairzone start -c derek,invalid_collaborator" in test mode
34
+ Then "derek" is added as a collaborator on my new pairzone
35
+ And "invalid_collaborator" is not added as a collaborator on my new pairzone
@@ -0,0 +1,12 @@
1
+ -----BEGIN DSA PRIVATE KEY-----
2
+ MIIBuwIBAAKBgQDw+Z3Cy6Pl9RiJDl2PVUPH1nharXe8UkLyznwDWId7ueZqy+MV
3
+ awWlPMJLt1gThfIVqpl04TbKVifSfeZSk/PZaZgA9nBqlrpetfVUfe0N9Wq/8cuA
4
+ uhSN0QlHvECEX32xhvH1jx5AB5jDzZzPYu3wbeDtLqm4ENitFohORBZDvwIVAOYy
5
+ TNIVWxgilojIV1gYawHirGK7AoGAUPrjJenXjxWCmswnajWz+LkavCDuHXAAu3Xz
6
+ NXBNCkBSvzi3zNpnCNjgWZLC9gU99DTj5b8aBXpE7F8NDtzVNHowNF324OP5h+pJ
7
+ aTffl/E5DuQPRBksmfvJ/TdIUk7Vu2MSvwAw7nZ5932Z6dvqqxJl75HzmRWO0RWM
8
+ 0J+j+nYCgYEAvXmzl+P4SEcWH48BEsFWkAlb2iz7xYLYa1MVN/pwxyA5DMZ8VXkR
9
+ k1z2QBU4TMkCOc/e8XAt0aBPlp/L00bQPC2xVwxic6cdEg50LYS+UQQnirlOs9+l
10
+ ref48ksIdSThuvnkIs+T9L7SAuj/zon4xuroLQWsKtgRRS6SN0Q62t0CFDkPP+4N
11
+ LQnLlRXEXzwqhFstlZPA
12
+ -----END DSA PRIVATE KEY-----
@@ -0,0 +1 @@
1
+ ssh-dss AAAAB3NzaC1kc3MAAACBAPD5ncLLo+X1GIkOXY9VQ8fWeFqtd7xSQvLOfANYh3u55mrL4xVrBaU8wku3WBOF8hWqmXThNspWJ9J95lKT89lpmAD2cGqWul619VR97Q31ar/xy4C6FI3RCUe8QIRffbGG8fWPHkAHmMPNnM9i7fBt4O0uqbgQ2K0WiE5EFkO/AAAAFQDmMkzSFVsYIpaIyFdYGGsB4qxiuwAAAIBQ+uMl6dePFYKazCdqNbP4uRq8IO4dcAC7dfM1cE0KQFK/OLfM2mcI2OBZksL2BT30NOPlvxoFekTsXw0O3NU0ejA0Xfbg4/mH6klpN9+X8TkO5A9EGSyZ+8n9N0hSTtW7YxK/ADDudnn3fZnp2+qrEmXvkfOZFY7RFYzQn6P6dgAAAIEAvXmzl+P4SEcWH48BEsFWkAlb2iz7xYLYa1MVN/pwxyA5DMZ8VXkRk1z2QBU4TMkCOc/e8XAt0aBPlp/L00bQPC2xVwxic6cdEg50LYS+UQQnirlOs9+lref48ksIdSThuvnkIs+T9L7SAuj/zon4xuroLQWsKtgRRS6SN0Q62t0= chris@chris3.local
@@ -0,0 +1,27 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ MIIEoQIBAAKCAQEAvoEkswUJgBnwv0fH1LO4BXnN1zwC6ARLWvWmH7rhmRz0Y9Yo
3
+ dEu7Kz7xYQUB5eWm1eOVTu+Bq6c29MzynTvRJi1WCumILDUQ29LciC9Y6A9VmVrH
4
+ FoehtzqIpfsXpn1pTP+8RZCfS4Pt+yVyWzJKx1AkbT+cgi0wjAhQxnpdqMmp3kBf
5
+ b1XZgi3qBz2Cm+Q8GRI3b0Xj7ahhYmMzJWS5qHn57jXsjxxYQuFMIScm2L6x+RhP
6
+ 1aE5Y/RBWW2xLQ3WCN252wWHFvWfKKCAMOXaSJKImdGwDnr0cIUbDyJhzbjPSPOj
7
+ P1P0t05YK/cqK6t7BQBvcFPvXJCLBD7ZAO5t7wIBIwKCAQAw/KMJdlLmbRIFTPje
8
+ 7GKFELFF+X0XFwwQE0f5h9OcZof8akTqtGNUQ2Kj61hCbkDX6hBzYiioe3SIF3GW
9
+ JVMJ0STA+jj1bLsxNji1TgDrNySjxuK8poirdXOYZSNWsojKqCkZM9EwrOVsd1fr
10
+ kJbiy3cUxzbfpThehcugwGE6B4bRED23C0Adc+XRHI2/idJkw5JqxWvzW2AutSBM
11
+ pbwMh8tD6BZEkFLDGb9zRMnlOh5qU3hA9lebOV37ezzj/deoMOzdkC6L/cwpwQ48
12
+ W1aZqeg+qDnDbkfYBncbvUX2wgk9op//doA26pkk97PwQ/JhBUkkW6YaHk3qt0Zh
13
+ 9CL7AoGBAOXRPwaDIREOFd3Ex68Usqg/yEAmuuHU2RuW3G/oNFDJ4d9yNDMczHxX
14
+ 8LBMyIinXc7rOiZf9NJc9UX2hiPpL6Ed2xl+2v/XSPVXI73GZoHgqJlAcanBGSL4
15
+ q5+aKl1lBsaoqA3w5ba3iIhQQzVGpSbN9LBi0279RgrZOV8Eq+55AoGBANQ1UGjr
16
+ es8eAABOIzqB4Lb8GIT+p7OfT3prOCkvj3EfpHXJQkZnrNL0NyUUGje18KWpRDlc
17
+ mRJWA3F0ehI/AwqyRFyMwO6tfFb2OKd/xs68/9nz7kIcfA9oo+UlibtwMToF75je
18
+ vdmb/Ji9t8dbGokvhWm4/6UWKfvTIEvUqYWnAoGAE7LZhDcgF2ebeWijZsdCg3Mu
19
+ a+YQBLp5Al1jWgyWxRieVPspC7IC5hYqksTAu0GLsqZystUGWyyKDU+lGQVb2pwo
20
+ uQrfkkWnKvjXLYYIyU3FTvblK865Av9fKu/1ALDjUttBmsuBZ27RMEFk2K5Iq43/
21
+ B8303aCuO3G0ddvUOQMCgYEAwgTbzaQYgtmZmeEKRB75Vtfb5086PdN73aPbk16v
22
+ CFdxysai/oqso510PyhSfBQPOGA+YFSpNVX0hPzHYSOrAncZ7jeL0ufCI59Jvban
23
+ I2r4jMHD5KxUK1hbVSmif3yEx1XiX+GXomK7D05e4idot/DvAZMy4BRDpGlCGXH6
24
+ E8sCgYAbq1U0rXrW8Ee3QGj+bV3sFNvFhfXEV6MRzymVqxoh4wCw8P0AJOwSqCog
25
+ 0HlSacRmN2fpWSX26gl16m1c5GycIDXBOLOgLuLJVOQudI5/VCCracsyOdJmRBTy
26
+ 08wyE+SjbWgY8hiEh2ICJLe5b5OlHEetCCFTh9CQJa0gHe+bUA==
27
+ -----END RSA PRIVATE KEY-----
@@ -0,0 +1 @@
1
+ ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAvoEkswUJgBnwv0fH1LO4BXnN1zwC6ARLWvWmH7rhmRz0Y9YodEu7Kz7xYQUB5eWm1eOVTu+Bq6c29MzynTvRJi1WCumILDUQ29LciC9Y6A9VmVrHFoehtzqIpfsXpn1pTP+8RZCfS4Pt+yVyWzJKx1AkbT+cgi0wjAhQxnpdqMmp3kBfb1XZgi3qBz2Cm+Q8GRI3b0Xj7ahhYmMzJWS5qHn57jXsjxxYQuFMIScm2L6x+RhP1aE5Y/RBWW2xLQ3WCN252wWHFvWfKKCAMOXaSJKImdGwDnr0cIUbDyJhzbjPSPOjP1P0t05YK/cqK6t7BQBvcFPvXJCLBD7ZAO5t7w== chris@chris3.local
@@ -0,0 +1,76 @@
1
+ require 'sinatra'
2
+ require 'json/add/rails'
3
+ require 'rack/contrib'
4
+
5
+ before do
6
+ if (request.env["PATH_INFO"] != '/users/find_key')
7
+ auth = Rack::Auth::Basic::Request.new(request.env)
8
+ @key = auth.credentials.first
9
+ halt 401 unless @key =~ /pairzone-test-api-key/
10
+ end
11
+ end
12
+
13
+ use Rack::NestedParams
14
+
15
+ PAIRZONES = {
16
+ 'derek-aruba' => {
17
+ :ip => '127.0.0.1',
18
+ :name => 'derek-aruba',
19
+ :owner => 'derek',
20
+ :collaborators => ['dave', 'edward']
21
+ }
22
+ }
23
+
24
+ USERS = {
25
+ 'pairzone-test-api-key-derek' => {
26
+ :username => 'derek',
27
+ :apikey => 'pairzone-test-api-key-derek'
28
+ },
29
+ 'pairzone-test-api-key-bob' => {
30
+ :username => 'bob',
31
+ :apikey => 'pairzone-test-api-key-bob'
32
+ }
33
+ }
34
+
35
+ def username
36
+ USERS[@key][:username]
37
+ end
38
+
39
+ get '/pairzones/:name.json' do |name|
40
+ pairzone = PAIRZONES[name]
41
+ halt 404 if pairzone.nil?
42
+ halt 404 unless pairzone[:owner] == username || pairzone[:collaborators].include?(username)
43
+ pairzone.to_json
44
+ end
45
+
46
+ post '/pairzones' do
47
+ params['pairzone']['collaborators'].delete('invalid_collaborator') if (params['pairzone']['collaborators'])
48
+ pairzone = params['pairzone']
49
+ pairzone['ip'] = '127.0.0.1'
50
+ pairzone['owner'] = username
51
+ pairzone['status'] = 'started'
52
+ pairzone['name'] = username + '-' + pairzone['project_name']
53
+ pairzone['collaborators'] ||= []
54
+ PAIRZONES[pairzone['name']] = pairzone
55
+ pairzone.to_json
56
+ end
57
+
58
+ get '/current_user' do
59
+ USERS[@key].to_json
60
+ end
61
+
62
+ post '/users/find_key' do
63
+ match = USERS.values.select do |user|
64
+ user[:username] == params[:username]
65
+ end
66
+ halt 404 if match.empty?
67
+ match.first.to_json
68
+ end
69
+
70
+ get /.*/ do
71
+ "RECEIVED GET: #{request.url.inspect}"
72
+ end
73
+
74
+ post /.*/ do
75
+ "RECEIVED POST: #{request.url.inspect} WITH: #{request.body.string}"
76
+ end