envkey 0.1.5 → 1.0.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9639909651631c693e951fb52590522d41d6223a
4
- data.tar.gz: fc7bccdbce41943690b9c0121d5fb5ffbbc824b9
3
+ metadata.gz: 0423eb22082c5f775c25c56686eb943f899e6aba
4
+ data.tar.gz: ac0d7784f49ac0ccc5688b0afa23e35dead9d829
5
5
  SHA512:
6
- metadata.gz: b8d70fc203bb8a3f77f35a57fa2fa14f9c80618727451b90c30c7663d634308eafcb631a1993564993c20455567cd30b47bd161b4557ab5b3225848191716d53
7
- data.tar.gz: 7ed86d1c7313536c9b3f5627936b9a00069af1b8f413415f9fbef6cdca605988a5d71b65ac1ec27a6369ee20bd14e0a270e4315fd011d8fc2e4835a09a53d1ec
6
+ metadata.gz: 8963f13406a5ac9fa0e66b924d4680ba4273d2b177b72b2aadf07f68e13b943a1d19633b3c82b6e6ba7deb3ee995fe636fa878f6e558e39749ad908edb5c7a74
7
+ data.tar.gz: a8a46cf837becd6f9bbd44126dff6b972b8d12ef72522aaeefd00f9128280ee14378a13ee904a251f134e09ed9fbf9683846e6302301c05266e37845993a6032
data/LICENSE.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2017 Dane Schneider
3
+ Copyright (c) 2017 Envkey Inc. <support@envkey.com>
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -1,41 +1,73 @@
1
- # Envkey
1
+ # envkey
2
2
 
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/envkey`. To experiment with that code, run `bin/console` for an interactive prompt.
4
-
5
- TODO: Delete this and the text above, and describe your gem
3
+ Integrate [EnvKey](https://www.envkey.com) with your Ruby or Ruby On Rails projects to keep api keys, credentials, and other configuration securely and automatically in sync for developers and servers.
6
4
 
7
5
  ## Installation
8
6
 
9
- Add this line to your application's Gemfile:
7
+ In your Gemfile:
10
8
 
11
9
  ```ruby
12
- gem 'envkey'
10
+ gem install 'envkey'
13
11
  ```
14
12
 
15
- And then execute:
13
+ If you're using Rails, that's all you need. In plain Ruby, you need to require envkey at the entry point of your application.
14
+
15
+ ```
16
+ require 'envkey'
17
+ ```
16
18
 
17
- $ bundle
19
+ ## Usage
18
20
 
19
- Or install it yourself as:
21
+ Generate an `ENVKEY` in the [EnvKey App](https://github.com/envkey/envkey-app). Then set `ENVKEY=...`, either in a gitignored `.env` file in the root of your project (in development) or in an environment variable (on servers).
20
22
 
21
- $ gem install envkey
23
+ Now all your EnvKey variables will be available on `ENV`.
22
24
 
23
- ## Usage
25
+ ### Errors
26
+
27
+ The gem will throw an error if an `ENVKEY` is missing or invalid.
28
+
29
+ ### Example
30
+
31
+ Assume you have `STRIPE_SECRET_KEY` set to `sk_test_2a33b045e998d2ef60c7861d2ac22ea8` for the `development` environment in the EnvKey App. You generate a local development `ENVKEY`.
32
+
33
+ In your project's **gitignored** `.env` file:
34
+
35
+ ```bash
36
+ # .env
37
+ ENVKEY=GsL8zC74DWchdpvssa9z-nk7humd7hJmAqNoA
38
+ ```
39
+
40
+ In `config/initializers/stripe.rb`:
41
+
42
+ ```ruby
43
+ Stripe.api_key = ENV.fetch("STRIPE_SECRET_KEY")
44
+ ```
45
+
46
+ Now `STRIPE_SECRET_KEY` will stay automatically in sync for all the developers on your team.
47
+
48
+ On your servers, set the `ENVKEY` as an environment variable instead of putting it in a `.env` file.
49
+
50
+ Now your servers will stay in sync as well. If you need to rotate your `STRIPE_SECRET_KEY` you can do it in a few seconds in the EnvKey App, restart your servers, and you're good to go. All your team's developers and all your servers will have the new value.
51
+
52
+ ### Overriding Vars
53
+
54
+ The envkey gem will not overwrite existing environment variables or additional variables set in a `.env` file. This can be convenient for customizing environments that otherwise share the same configuration. You can read more about this topic in the EnvKey [docs](https://docs.envkey.com/overriding-envkey-variables.html).
24
55
 
25
- TODO: Write usage instructions here
56
+ ### Working Offline
26
57
 
27
- ## Development
58
+ The envkey gem caches your encrypted config in development so that you can still use it while offline. Your config will still be available (though possibly not up-to-date) the next time you lose your internet connection. If you do have a connection available, envkey will always load the latest config. Your cached encrypted config is stored in `$HOME/.envkey/cache`
28
59
 
29
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
60
+ ## Further Reading
30
61
 
31
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
62
+ For more on EnvKey in general:
32
63
 
33
- ## Contributing
64
+ Read the [docs](https://docs.envkey.com).
34
65
 
35
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/envkey.
66
+ Read the [integration quickstart](https://docs.envkey.com/integration-quickstart.html).
36
67
 
68
+ Read the [security and cryptography overview](https://security.envkey.com).
37
69
 
38
- ## License
70
+ ## Need help? Have questions, feedback, or ideas?
39
71
 
40
- The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
72
+ Post an [issue](https://github.com/envkey/envkey-ruby/issues) or email us: [support@envkey.com](mailto:support@envkey.com).
41
73
 
data/envkey.gemspec CHANGED
@@ -9,8 +9,7 @@ Gem::Specification.new do |spec|
9
9
  spec.authors = ["Dane Schneider"]
10
10
  spec.email = ["dane@envkey.com"]
11
11
 
12
- spec.summary = "Envkey secures and simplifies app secrets and config by storing it in an encrypted vault and granting access to developers and servers."
13
- # spec.description = ""#%q{TODO: Write a longer description or delete this line.}
12
+ spec.summary = "Envkey secures and simplifies app secrets and config."
14
13
  spec.homepage = "https://www.envkey.com"
15
14
  spec.license = "MIT"
16
15
 
@@ -34,6 +33,5 @@ Gem::Specification.new do |spec|
34
33
  spec.add_development_dependency "rake", "~> 10.0"
35
34
  spec.add_development_dependency "rspec", "~> 3.0"
36
35
 
37
- spec.add_runtime_dependency "ffi", "~> 1.9"
38
36
  spec.add_runtime_dependency "dotenv", "~> 2.0"
39
37
  end
data/lib/envkey/core.rb CHANGED
@@ -1,11 +1,9 @@
1
- require 'ffi'
2
1
  require 'dotenv'
3
- require 'json'
4
2
  require 'set'
5
- require 'envkey/platform'
3
+ require 'json'
4
+ require 'envkey/fetch'
6
5
 
7
6
  module Envkey::Core
8
- extend FFI::Library
9
7
 
10
8
  def self.load_env spring_pre_fork_ts=nil,
11
9
  overload_dotenv_vars=[],
@@ -20,46 +18,26 @@ module Envkey::Core
20
18
  end
21
19
 
22
20
  if (key = ENV["ENVKEY"])
23
- reader, writer = IO.pipe
24
-
25
- fork do
26
- reader.close
27
-
28
- begin
29
- ffi_lib Envkey::Platform.lib_paths
30
- attach_function :EnvJson, [:pointer], :string
31
- rescue
32
- raise "There was a problem loading Envkey on your platform."
33
- end
34
-
35
- json = EnvJson(FFI::MemoryPointer.from_string(key))
36
-
37
- writer.puts json
38
- end
39
-
40
- writer.close
41
- while json = reader.gets
42
- if json && json.gsub("\n","").gsub("\r", "") != ""
43
- envs = JSON.parse(json)
44
- updated_envkey_vars = []
45
- envs.each do |k,v|
46
- var = k.upcase
47
- if !ENV[var] || overload_envkey_vars.include?(var)
48
- updated_envkey_vars << var
49
- ENV[var] = v
50
- end
51
- end
52
-
53
- # avoid printing success message twice in quick succession when using spring
54
- if !spring_pre_fork_ts || (Time.now - spring_pre_fork_ts) > 3
55
- puts "ENVKEY: vars loaded and decrypted - access with ENV['YOUR_VAR_NAME']"
21
+ res = Envkey::Fetch.fetch_env(key)
22
+ if res && res.gsub("\n","").gsub("\r", "") != "" && !res.start_with?("error:")
23
+ envs = JSON.parse(res)
24
+ updated_envkey_vars = []
25
+ envs.each do |k,v|
26
+ var = k.upcase
27
+ if !ENV[var] || overload_envkey_vars.include?(var)
28
+ updated_envkey_vars << var
29
+ ENV[var] = v
56
30
  end
57
- return [Set.new(updated_dotenv_vars), Set.new(updated_envkey_vars)]
58
- else
59
- raise "Envkey invalid. Couldn't load vars."
60
31
  end
32
+
33
+ return [Set.new(updated_dotenv_vars), Set.new(updated_envkey_vars)]
34
+ else
35
+ raise "ENVKEY invalid. Couldn't load vars."
61
36
  end
37
+ else
38
+ raise "ENVKEY missing - must be set as an environment variable or in a gitignored .env file in the root of your project. Go to https://www.envkey.com if you don't know what an ENVKEY is."
62
39
  end
63
40
  end
41
+
64
42
  end
65
43
 
@@ -0,0 +1,16 @@
1
+ require 'envkey/platform'
2
+
3
+ module Envkey::Fetch
4
+
5
+ def self.fetch_env key
6
+ fetch_env_path = Envkey::Platform.fetch_env_path
7
+ `#{fetch_env_path} #{key}#{is_dev ? ' --cache' : ''}`
8
+ end
9
+
10
+ def self.is_dev
11
+ dev_vals = %w(development test)
12
+ dev_vals.include?(ENV["RAILS_ENV"]) ||
13
+ dev_vals.include?(ENV["RACK_ENV"])
14
+ end
15
+
16
+ end
@@ -1,34 +1,55 @@
1
1
  module Envkey::Platform
2
-
3
- def self.lib_paths
4
- lib_filenames.map do |fn|
5
- File.expand_path("../../ext/#{fn}", File.dirname(__FILE__))
6
- end
2
+ # Normalize the platform OS
3
+ OS = case os = RbConfig::CONFIG['host_os'].downcase
4
+ when /linux/
5
+ "linux"
6
+ when /darwin/
7
+ "darwin"
8
+ when /bsd/
9
+ "freebsd"
10
+ when /mingw|mswin/
11
+ "windows"
12
+ else
13
+ "linux"
7
14
  end
8
15
 
9
- def self.lib_filenames
10
- is_unix, os, arch, extension = [FFI::Platform.unix?, FFI::Platform::OS, FFI::Platform::ARCH, FFI::Platform::LIBSUFFIX]
16
+ # Normalize the platform CPU
17
+ ARCH = case cpu = RbConfig::CONFIG['host_cpu'].downcase
18
+ when /amd64|x86_64/
19
+ "x86_64"
20
+ when /i?86|x86|i86pc/
21
+ "x86"
22
+ when /ppc|powerpc/
23
+ "powerpc"
24
+ when /^arm/
25
+ "arm"
26
+ else
27
+ cpu
28
+ end
11
29
 
12
- platform_parts =
13
- if !is_unix
14
- raise "Envkey currently only supports unix and OSX platforms"
15
- elsif os == "darwin"
16
- if arch == "x86_64"
17
- ["darwin-10.6-amd64"]
18
- else
19
- ["darwin-10.6-386"]
20
- end
30
+ def self.platform_part
31
+ case OS
32
+ when "darwin", "linux", "windows", "freebsd"
33
+ OS
21
34
  else
22
- if arch == "x86_64"
23
- ["linux-amd64", "linux-arm64"]
24
- elsif arch == "i386"
25
- ["linux-386"]
26
- else
27
- %w(arm64 arm-7 arm-6 arm-5).map {|s| "linux-#{s}"}
28
- end
35
+ "linux"
29
36
  end
37
+ end
38
+
39
+ def self.arch_part
40
+ ARCH == "x86_64" ? "amd64" : "386"
41
+ end
42
+
43
+ def self.ext
44
+ platform_part == "windows" ? ".exe" : ""
45
+ end
46
+
47
+ def self.fetch_env_path
48
+ File.expand_path("../../ext/#{lib_file_dir}/envkey-fetch#{ext}", File.dirname(__FILE__))
49
+ end
30
50
 
31
- platform_parts.map {|part| "envkey-#{part}.#{extension}"}
51
+ def self.lib_file_dir
52
+ ["envkey-fetch", Envkey::ENVKEY_FETCH_VERSION.to_s, platform_part, arch_part].join("_")
32
53
  end
33
54
 
34
55
  end
@@ -1,3 +1,4 @@
1
1
  module Envkey
2
- VERSION = "0.1.5"
2
+ VERSION = "1.0.0"
3
+ ENVKEY_FETCH_VERSION="1.0.0"
3
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: envkey
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dane Schneider
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-06-13 00:00:00.000000000 Z
11
+ date: 2017-09-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,20 +52,6 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3.0'
55
- - !ruby/object:Gem::Dependency
56
- name: ffi
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: '1.9'
62
- type: :runtime
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: '1.9'
69
55
  - !ruby/object:Gem::Dependency
70
56
  name: dotenv
71
57
  requirement: !ruby/object:Gem::Requirement
@@ -97,25 +83,17 @@ files:
97
83
  - bin/console
98
84
  - bin/setup
99
85
  - envkey.gemspec
100
- - ext/envkey-darwin-10.6-386.dylib
101
- - ext/envkey-darwin-10.6-386.h
102
- - ext/envkey-darwin-10.6-amd64.dylib
103
- - ext/envkey-darwin-10.6-amd64.h
104
- - ext/envkey-linux-386.h
105
- - ext/envkey-linux-386.so
106
- - ext/envkey-linux-amd64.h
107
- - ext/envkey-linux-amd64.so
108
- - ext/envkey-linux-arm-5.h
109
- - ext/envkey-linux-arm-5.so
110
- - ext/envkey-linux-arm-6.h
111
- - ext/envkey-linux-arm-6.so
112
- - ext/envkey-linux-arm-7.h
113
- - ext/envkey-linux-arm-7.so
114
- - ext/envkey-linux-arm64.h
115
- - ext/envkey-linux-arm64.so
116
- - ext/envkey.go
86
+ - ext/envkey-fetch_1.0.0_darwin_386/envkey-fetch
87
+ - ext/envkey-fetch_1.0.0_darwin_amd64/envkey-fetch
88
+ - ext/envkey-fetch_1.0.0_freebsd_386/envkey-fetch
89
+ - ext/envkey-fetch_1.0.0_freebsd_amd64/envkey-fetch
90
+ - ext/envkey-fetch_1.0.0_linux_386/envkey-fetch
91
+ - ext/envkey-fetch_1.0.0_linux_amd64/envkey-fetch
92
+ - ext/envkey-fetch_1.0.0_windows_386/envkey-fetch.exe
93
+ - ext/envkey-fetch_1.0.0_windows_amd64/envkey-fetch.exe
117
94
  - lib/envkey.rb
118
95
  - lib/envkey/core.rb
96
+ - lib/envkey/fetch.rb
119
97
  - lib/envkey/platform.rb
120
98
  - lib/envkey/rails.rb
121
99
  - lib/envkey/version.rb
@@ -143,6 +121,5 @@ rubyforge_project:
143
121
  rubygems_version: 2.5.1
144
122
  signing_key:
145
123
  specification_version: 4
146
- summary: Envkey secures and simplifies app secrets and config by storing it in an
147
- encrypted vault and granting access to developers and servers.
124
+ summary: Envkey secures and simplifies app secrets and config.
148
125
  test_files: []
Binary file
@@ -1,60 +0,0 @@
1
- /* Created by "go tool cgo" - DO NOT EDIT. */
2
-
3
- /* package envkey/envkey-go-shared */
4
-
5
- /* Start of preamble from import "C" comments. */
6
-
7
-
8
-
9
-
10
- /* End of preamble from import "C" comments. */
11
-
12
-
13
- /* Start of boilerplate cgo prologue. */
14
- #line 1 "cgo-gcc-export-header-prolog"
15
-
16
- #ifndef GO_CGO_PROLOGUE_H
17
- #define GO_CGO_PROLOGUE_H
18
-
19
- typedef signed char GoInt8;
20
- typedef unsigned char GoUint8;
21
- typedef short GoInt16;
22
- typedef unsigned short GoUint16;
23
- typedef int GoInt32;
24
- typedef unsigned int GoUint32;
25
- typedef long long GoInt64;
26
- typedef unsigned long long GoUint64;
27
- typedef GoInt32 GoInt;
28
- typedef GoUint32 GoUint;
29
- typedef __SIZE_TYPE__ GoUintptr;
30
- typedef float GoFloat32;
31
- typedef double GoFloat64;
32
- typedef float _Complex GoComplex64;
33
- typedef double _Complex GoComplex128;
34
-
35
- /*
36
- static assertion to make sure the file is being used on architecture
37
- at least with matching size of GoInt.
38
- */
39
- typedef char _check_for_32_bit_pointer_matching_GoInt[sizeof(void*)==32/8 ? 1:-1];
40
-
41
- typedef struct { const char *p; GoInt n; } GoString;
42
- typedef void *GoMap;
43
- typedef void *GoChan;
44
- typedef struct { void *t; void *v; } GoInterface;
45
- typedef struct { void *data; GoInt len; GoInt cap; } GoSlice;
46
-
47
- #endif
48
-
49
- /* End of boilerplate cgo prologue. */
50
-
51
- #ifdef __cplusplus
52
- extern "C" {
53
- #endif
54
-
55
-
56
- extern char* EnvJson(char* p0);
57
-
58
- #ifdef __cplusplus
59
- }
60
- #endif
Binary file
@@ -1,60 +0,0 @@
1
- /* Created by "go tool cgo" - DO NOT EDIT. */
2
-
3
- /* package envkey/envkey-go-shared */
4
-
5
- /* Start of preamble from import "C" comments. */
6
-
7
-
8
-
9
-
10
- /* End of preamble from import "C" comments. */
11
-
12
-
13
- /* Start of boilerplate cgo prologue. */
14
- #line 1 "cgo-gcc-export-header-prolog"
15
-
16
- #ifndef GO_CGO_PROLOGUE_H
17
- #define GO_CGO_PROLOGUE_H
18
-
19
- typedef signed char GoInt8;
20
- typedef unsigned char GoUint8;
21
- typedef short GoInt16;
22
- typedef unsigned short GoUint16;
23
- typedef int GoInt32;
24
- typedef unsigned int GoUint32;
25
- typedef long long GoInt64;
26
- typedef unsigned long long GoUint64;
27
- typedef GoInt64 GoInt;
28
- typedef GoUint64 GoUint;
29
- typedef __SIZE_TYPE__ GoUintptr;
30
- typedef float GoFloat32;
31
- typedef double GoFloat64;
32
- typedef float _Complex GoComplex64;
33
- typedef double _Complex GoComplex128;
34
-
35
- /*
36
- static assertion to make sure the file is being used on architecture
37
- at least with matching size of GoInt.
38
- */
39
- typedef char _check_for_64_bit_pointer_matching_GoInt[sizeof(void*)==64/8 ? 1:-1];
40
-
41
- typedef struct { const char *p; GoInt n; } GoString;
42
- typedef void *GoMap;
43
- typedef void *GoChan;
44
- typedef struct { void *t; void *v; } GoInterface;
45
- typedef struct { void *data; GoInt len; GoInt cap; } GoSlice;
46
-
47
- #endif
48
-
49
- /* End of boilerplate cgo prologue. */
50
-
51
- #ifdef __cplusplus
52
- extern "C" {
53
- #endif
54
-
55
-
56
- extern char* EnvJson(char* p0);
57
-
58
- #ifdef __cplusplus
59
- }
60
- #endif
@@ -1,60 +0,0 @@
1
- /* Created by "go tool cgo" - DO NOT EDIT. */
2
-
3
- /* package envkey/envkey-go-shared */
4
-
5
- /* Start of preamble from import "C" comments. */
6
-
7
-
8
-
9
-
10
- /* End of preamble from import "C" comments. */
11
-
12
-
13
- /* Start of boilerplate cgo prologue. */
14
- #line 1 "cgo-gcc-export-header-prolog"
15
-
16
- #ifndef GO_CGO_PROLOGUE_H
17
- #define GO_CGO_PROLOGUE_H
18
-
19
- typedef signed char GoInt8;
20
- typedef unsigned char GoUint8;
21
- typedef short GoInt16;
22
- typedef unsigned short GoUint16;
23
- typedef int GoInt32;
24
- typedef unsigned int GoUint32;
25
- typedef long long GoInt64;
26
- typedef unsigned long long GoUint64;
27
- typedef GoInt32 GoInt;
28
- typedef GoUint32 GoUint;
29
- typedef __SIZE_TYPE__ GoUintptr;
30
- typedef float GoFloat32;
31
- typedef double GoFloat64;
32
- typedef float _Complex GoComplex64;
33
- typedef double _Complex GoComplex128;
34
-
35
- /*
36
- static assertion to make sure the file is being used on architecture
37
- at least with matching size of GoInt.
38
- */
39
- typedef char _check_for_32_bit_pointer_matching_GoInt[sizeof(void*)==32/8 ? 1:-1];
40
-
41
- typedef struct { const char *p; GoInt n; } GoString;
42
- typedef void *GoMap;
43
- typedef void *GoChan;
44
- typedef struct { void *t; void *v; } GoInterface;
45
- typedef struct { void *data; GoInt len; GoInt cap; } GoSlice;
46
-
47
- #endif
48
-
49
- /* End of boilerplate cgo prologue. */
50
-
51
- #ifdef __cplusplus
52
- extern "C" {
53
- #endif
54
-
55
-
56
- extern char* EnvJson(char* p0);
57
-
58
- #ifdef __cplusplus
59
- }
60
- #endif
Binary file
@@ -1,60 +0,0 @@
1
- /* Created by "go tool cgo" - DO NOT EDIT. */
2
-
3
- /* package envkey/envkey-go-shared */
4
-
5
- /* Start of preamble from import "C" comments. */
6
-
7
-
8
-
9
-
10
- /* End of preamble from import "C" comments. */
11
-
12
-
13
- /* Start of boilerplate cgo prologue. */
14
- #line 1 "cgo-gcc-export-header-prolog"
15
-
16
- #ifndef GO_CGO_PROLOGUE_H
17
- #define GO_CGO_PROLOGUE_H
18
-
19
- typedef signed char GoInt8;
20
- typedef unsigned char GoUint8;
21
- typedef short GoInt16;
22
- typedef unsigned short GoUint16;
23
- typedef int GoInt32;
24
- typedef unsigned int GoUint32;
25
- typedef long long GoInt64;
26
- typedef unsigned long long GoUint64;
27
- typedef GoInt64 GoInt;
28
- typedef GoUint64 GoUint;
29
- typedef __SIZE_TYPE__ GoUintptr;
30
- typedef float GoFloat32;
31
- typedef double GoFloat64;
32
- typedef float _Complex GoComplex64;
33
- typedef double _Complex GoComplex128;
34
-
35
- /*
36
- static assertion to make sure the file is being used on architecture
37
- at least with matching size of GoInt.
38
- */
39
- typedef char _check_for_64_bit_pointer_matching_GoInt[sizeof(void*)==64/8 ? 1:-1];
40
-
41
- typedef struct { const char *p; GoInt n; } GoString;
42
- typedef void *GoMap;
43
- typedef void *GoChan;
44
- typedef struct { void *t; void *v; } GoInterface;
45
- typedef struct { void *data; GoInt len; GoInt cap; } GoSlice;
46
-
47
- #endif
48
-
49
- /* End of boilerplate cgo prologue. */
50
-
51
- #ifdef __cplusplus
52
- extern "C" {
53
- #endif
54
-
55
-
56
- extern char* EnvJson(char* p0);
57
-
58
- #ifdef __cplusplus
59
- }
60
- #endif
Binary file
@@ -1,60 +0,0 @@
1
- /* Created by "go tool cgo" - DO NOT EDIT. */
2
-
3
- /* package envkey/envkey-go-shared */
4
-
5
- /* Start of preamble from import "C" comments. */
6
-
7
-
8
-
9
-
10
- /* End of preamble from import "C" comments. */
11
-
12
-
13
- /* Start of boilerplate cgo prologue. */
14
- #line 1 "cgo-gcc-export-header-prolog"
15
-
16
- #ifndef GO_CGO_PROLOGUE_H
17
- #define GO_CGO_PROLOGUE_H
18
-
19
- typedef signed char GoInt8;
20
- typedef unsigned char GoUint8;
21
- typedef short GoInt16;
22
- typedef unsigned short GoUint16;
23
- typedef int GoInt32;
24
- typedef unsigned int GoUint32;
25
- typedef long long GoInt64;
26
- typedef unsigned long long GoUint64;
27
- typedef GoInt32 GoInt;
28
- typedef GoUint32 GoUint;
29
- typedef __SIZE_TYPE__ GoUintptr;
30
- typedef float GoFloat32;
31
- typedef double GoFloat64;
32
- typedef float _Complex GoComplex64;
33
- typedef double _Complex GoComplex128;
34
-
35
- /*
36
- static assertion to make sure the file is being used on architecture
37
- at least with matching size of GoInt.
38
- */
39
- typedef char _check_for_32_bit_pointer_matching_GoInt[sizeof(void*)==32/8 ? 1:-1];
40
-
41
- typedef struct { const char *p; GoInt n; } GoString;
42
- typedef void *GoMap;
43
- typedef void *GoChan;
44
- typedef struct { void *t; void *v; } GoInterface;
45
- typedef struct { void *data; GoInt len; GoInt cap; } GoSlice;
46
-
47
- #endif
48
-
49
- /* End of boilerplate cgo prologue. */
50
-
51
- #ifdef __cplusplus
52
- extern "C" {
53
- #endif
54
-
55
-
56
- extern char* EnvJson(char* p0);
57
-
58
- #ifdef __cplusplus
59
- }
60
- #endif
Binary file
@@ -1,60 +0,0 @@
1
- /* Created by "go tool cgo" - DO NOT EDIT. */
2
-
3
- /* package envkey/envkey-go-shared */
4
-
5
- /* Start of preamble from import "C" comments. */
6
-
7
-
8
-
9
-
10
- /* End of preamble from import "C" comments. */
11
-
12
-
13
- /* Start of boilerplate cgo prologue. */
14
- #line 1 "cgo-gcc-export-header-prolog"
15
-
16
- #ifndef GO_CGO_PROLOGUE_H
17
- #define GO_CGO_PROLOGUE_H
18
-
19
- typedef signed char GoInt8;
20
- typedef unsigned char GoUint8;
21
- typedef short GoInt16;
22
- typedef unsigned short GoUint16;
23
- typedef int GoInt32;
24
- typedef unsigned int GoUint32;
25
- typedef long long GoInt64;
26
- typedef unsigned long long GoUint64;
27
- typedef GoInt32 GoInt;
28
- typedef GoUint32 GoUint;
29
- typedef __SIZE_TYPE__ GoUintptr;
30
- typedef float GoFloat32;
31
- typedef double GoFloat64;
32
- typedef float _Complex GoComplex64;
33
- typedef double _Complex GoComplex128;
34
-
35
- /*
36
- static assertion to make sure the file is being used on architecture
37
- at least with matching size of GoInt.
38
- */
39
- typedef char _check_for_32_bit_pointer_matching_GoInt[sizeof(void*)==32/8 ? 1:-1];
40
-
41
- typedef struct { const char *p; GoInt n; } GoString;
42
- typedef void *GoMap;
43
- typedef void *GoChan;
44
- typedef struct { void *t; void *v; } GoInterface;
45
- typedef struct { void *data; GoInt len; GoInt cap; } GoSlice;
46
-
47
- #endif
48
-
49
- /* End of boilerplate cgo prologue. */
50
-
51
- #ifdef __cplusplus
52
- extern "C" {
53
- #endif
54
-
55
-
56
- extern char* EnvJson(char* p0);
57
-
58
- #ifdef __cplusplus
59
- }
60
- #endif
Binary file
@@ -1,60 +0,0 @@
1
- /* Created by "go tool cgo" - DO NOT EDIT. */
2
-
3
- /* package envkey/envkey-go-shared */
4
-
5
- /* Start of preamble from import "C" comments. */
6
-
7
-
8
-
9
-
10
- /* End of preamble from import "C" comments. */
11
-
12
-
13
- /* Start of boilerplate cgo prologue. */
14
- #line 1 "cgo-gcc-export-header-prolog"
15
-
16
- #ifndef GO_CGO_PROLOGUE_H
17
- #define GO_CGO_PROLOGUE_H
18
-
19
- typedef signed char GoInt8;
20
- typedef unsigned char GoUint8;
21
- typedef short GoInt16;
22
- typedef unsigned short GoUint16;
23
- typedef int GoInt32;
24
- typedef unsigned int GoUint32;
25
- typedef long long GoInt64;
26
- typedef unsigned long long GoUint64;
27
- typedef GoInt32 GoInt;
28
- typedef GoUint32 GoUint;
29
- typedef __SIZE_TYPE__ GoUintptr;
30
- typedef float GoFloat32;
31
- typedef double GoFloat64;
32
- typedef float _Complex GoComplex64;
33
- typedef double _Complex GoComplex128;
34
-
35
- /*
36
- static assertion to make sure the file is being used on architecture
37
- at least with matching size of GoInt.
38
- */
39
- typedef char _check_for_32_bit_pointer_matching_GoInt[sizeof(void*)==32/8 ? 1:-1];
40
-
41
- typedef struct { const char *p; GoInt n; } GoString;
42
- typedef void *GoMap;
43
- typedef void *GoChan;
44
- typedef struct { void *t; void *v; } GoInterface;
45
- typedef struct { void *data; GoInt len; GoInt cap; } GoSlice;
46
-
47
- #endif
48
-
49
- /* End of boilerplate cgo prologue. */
50
-
51
- #ifdef __cplusplus
52
- extern "C" {
53
- #endif
54
-
55
-
56
- extern char* EnvJson(char* p0);
57
-
58
- #ifdef __cplusplus
59
- }
60
- #endif
Binary file
@@ -1,60 +0,0 @@
1
- /* Created by "go tool cgo" - DO NOT EDIT. */
2
-
3
- /* package envkey/envkey-go-shared */
4
-
5
- /* Start of preamble from import "C" comments. */
6
-
7
-
8
-
9
-
10
- /* End of preamble from import "C" comments. */
11
-
12
-
13
- /* Start of boilerplate cgo prologue. */
14
- #line 1 "cgo-gcc-export-header-prolog"
15
-
16
- #ifndef GO_CGO_PROLOGUE_H
17
- #define GO_CGO_PROLOGUE_H
18
-
19
- typedef signed char GoInt8;
20
- typedef unsigned char GoUint8;
21
- typedef short GoInt16;
22
- typedef unsigned short GoUint16;
23
- typedef int GoInt32;
24
- typedef unsigned int GoUint32;
25
- typedef long long GoInt64;
26
- typedef unsigned long long GoUint64;
27
- typedef GoInt64 GoInt;
28
- typedef GoUint64 GoUint;
29
- typedef __SIZE_TYPE__ GoUintptr;
30
- typedef float GoFloat32;
31
- typedef double GoFloat64;
32
- typedef float _Complex GoComplex64;
33
- typedef double _Complex GoComplex128;
34
-
35
- /*
36
- static assertion to make sure the file is being used on architecture
37
- at least with matching size of GoInt.
38
- */
39
- typedef char _check_for_64_bit_pointer_matching_GoInt[sizeof(void*)==64/8 ? 1:-1];
40
-
41
- typedef struct { const char *p; GoInt n; } GoString;
42
- typedef void *GoMap;
43
- typedef void *GoChan;
44
- typedef struct { void *t; void *v; } GoInterface;
45
- typedef struct { void *data; GoInt len; GoInt cap; } GoSlice;
46
-
47
- #endif
48
-
49
- /* End of boilerplate cgo prologue. */
50
-
51
- #ifdef __cplusplus
52
- extern "C" {
53
- #endif
54
-
55
-
56
- extern char* EnvJson(char* p0);
57
-
58
- #ifdef __cplusplus
59
- }
60
- #endif
Binary file
data/ext/envkey.go DELETED
@@ -1,90 +0,0 @@
1
- package main
2
-
3
- import (
4
- "C"
5
- "bytes"
6
- "strings"
7
- "net/http"
8
- "encoding/json"
9
- "io/ioutil"
10
- "log"
11
- "golang.org/x/crypto/openpgp"
12
- "golang.org/x/crypto/openpgp/armor"
13
- )
14
-
15
- const urlBase = "https://env-service.herokuapp.com/"
16
-
17
- type EnvResponse struct {
18
- Env string `json:"env"`
19
- EncryptedPrivkey string `json:"encrypted_privkey"`
20
- }
21
-
22
- //export EnvJson
23
- func EnvJson(envkey *C.char) *C.char {
24
- split := strings.Split(C.GoString(envkey), "-")
25
- envkeyParam, pw := split[0], split[1]
26
- envResponse := new(EnvResponse)
27
- var err error
28
- err = getJson(urlBase + envkeyParam, envResponse)
29
- if (err != nil){
30
- return C.CString("")
31
- }
32
- var decrypted string
33
- decrypted, err = decrypt(envResponse.Env, envResponse.EncryptedPrivkey, pw)
34
- if (err != nil){
35
- return C.CString("")
36
- }
37
-
38
- return C.CString(decrypted)
39
- }
40
-
41
- func getJson(url string, target interface{}) error {
42
- r, err := http.Get(url)
43
- if err != nil {
44
- log.Fatal(err)
45
- return err
46
- }
47
- defer r.Body.Close()
48
-
49
- return json.NewDecoder(r.Body).Decode(target)
50
- }
51
-
52
- func decrypt(cipher, privkey, pw string) (string, error) {
53
- // Open the private key file
54
- keyringFileBuffer := bytes.NewBufferString(privkey)
55
- entityList, err := openpgp.ReadArmoredKeyRing(keyringFileBuffer)
56
- if (err != nil){
57
- log.Fatal(err)
58
- return "", err
59
- }
60
- entity := entityList[0]
61
-
62
- // Get the passphrase and read the private key.
63
- passphraseByte := []byte(pw)
64
- entity.PrivateKey.Decrypt(passphraseByte)
65
- for _, subkey := range entity.Subkeys {
66
- subkey.PrivateKey.Decrypt(passphraseByte)
67
- }
68
-
69
- // Decode armored message
70
- decbuf := bytes.NewBufferString(cipher)
71
- result, err := armor.Decode(decbuf)
72
- if err != nil {
73
- return "", err
74
- }
75
-
76
- // Decrypt it with the contents of the private key
77
- md, err := openpgp.ReadMessage(result.Body, entityList, nil, nil)
78
- if err != nil {
79
- return "", err
80
- }
81
-
82
- bytes, err := ioutil.ReadAll(md.UnverifiedBody)
83
- if err != nil {
84
- return "", err
85
- }
86
-
87
- return string(bytes), nil
88
- }
89
-
90
- func main() {}