pairzone 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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