ruby-safenet 0.2.4 → 0.5.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ca8bf637841001a2a3edffcdaf9f7604f50e5714
4
- data.tar.gz: 9595c12476853bd050a3a0caa576b018a2892bfc
3
+ metadata.gz: d19872be0e8e5b424ad1d294cb7e1995ef94e5fb
4
+ data.tar.gz: ee22a0a1939f51c5f5cca9286432511c5bb51035
5
5
  SHA512:
6
- metadata.gz: 8c68964dfc3c4e5ce2c6c75d9aacbeba8ccf33d063a78b63e2c5a5f769a6c01ad67c2e6e64222f6debe4a99703b00069c60299485b78056f31d05e4a8547c1c2
7
- data.tar.gz: c41cb857f2f15d3437ec7e9cc981b1f498ad3f154eaed7ea9c87cab9c4ac1fff6ba57c6053070819419042a5eea2066556f4e2d5e1b91758be19ff02a8abdf14
6
+ metadata.gz: fd9425061291ce3644048530842316121962937b4413810d0bfca1f273623b2149b067a9439fe7fdff97893c8feee6f7a2361f77db0eac7bda46b314b77176ee
7
+ data.tar.gz: 041aa3a0e7e08cf270ad3bb4e93f9248d0f3fa412e5376d9db78da914a8597c48e0e5f22470ce65f14242e53c6cac68fa3c86b3d049f33977a0d37f7bb863b33
data/LICENSE ADDED
@@ -0,0 +1,116 @@
1
+ CC0 1.0 Universal
2
+
3
+ Statement of Purpose
4
+
5
+ The laws of most jurisdictions throughout the world automatically confer
6
+ exclusive Copyright and Related Rights (defined below) upon the creator and
7
+ subsequent owner(s) (each and all, an "owner") of an original work of
8
+ authorship and/or a database (each, a "Work").
9
+
10
+ Certain owners wish to permanently relinquish those rights to a Work for the
11
+ purpose of contributing to a commons of creative, cultural and scientific
12
+ works ("Commons") that the public can reliably and without fear of later
13
+ claims of infringement build upon, modify, incorporate in other works, reuse
14
+ and redistribute as freely as possible in any form whatsoever and for any
15
+ purposes, including without limitation commercial purposes. These owners may
16
+ contribute to the Commons to promote the ideal of a free culture and the
17
+ further production of creative, cultural and scientific works, or to gain
18
+ reputation or greater distribution for their Work in part through the use and
19
+ efforts of others.
20
+
21
+ For these and/or other purposes and motivations, and without any expectation
22
+ of additional consideration or compensation, the person associating CC0 with a
23
+ Work (the "Affirmer"), to the extent that he or she is an owner of Copyright
24
+ and Related Rights in the Work, voluntarily elects to apply CC0 to the Work
25
+ and publicly distribute the Work under its terms, with knowledge of his or her
26
+ Copyright and Related Rights in the Work and the meaning and intended legal
27
+ effect of CC0 on those rights.
28
+
29
+ 1. Copyright and Related Rights. A Work made available under CC0 may be
30
+ protected by copyright and related or neighboring rights ("Copyright and
31
+ Related Rights"). Copyright and Related Rights include, but are not limited
32
+ to, the following:
33
+
34
+ i. the right to reproduce, adapt, distribute, perform, display, communicate,
35
+ and translate a Work;
36
+
37
+ ii. moral rights retained by the original author(s) and/or performer(s);
38
+
39
+ iii. publicity and privacy rights pertaining to a person's image or likeness
40
+ depicted in a Work;
41
+
42
+ iv. rights protecting against unfair competition in regards to a Work,
43
+ subject to the limitations in paragraph 4(a), below;
44
+
45
+ v. rights protecting the extraction, dissemination, use and reuse of data in
46
+ a Work;
47
+
48
+ vi. database rights (such as those arising under Directive 96/9/EC of the
49
+ European Parliament and of the Council of 11 March 1996 on the legal
50
+ protection of databases, and under any national implementation thereof,
51
+ including any amended or successor version of such directive); and
52
+
53
+ vii. other similar, equivalent or corresponding rights throughout the world
54
+ based on applicable law or treaty, and any national implementations thereof.
55
+
56
+ 2. Waiver. To the greatest extent permitted by, but not in contravention of,
57
+ applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and
58
+ unconditionally waives, abandons, and surrenders all of Affirmer's Copyright
59
+ and Related Rights and associated claims and causes of action, whether now
60
+ known or unknown (including existing as well as future claims and causes of
61
+ action), in the Work (i) in all territories worldwide, (ii) for the maximum
62
+ duration provided by applicable law or treaty (including future time
63
+ extensions), (iii) in any current or future medium and for any number of
64
+ copies, and (iv) for any purpose whatsoever, including without limitation
65
+ commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes
66
+ the Waiver for the benefit of each member of the public at large and to the
67
+ detriment of Affirmer's heirs and successors, fully intending that such Waiver
68
+ shall not be subject to revocation, rescission, cancellation, termination, or
69
+ any other legal or equitable action to disrupt the quiet enjoyment of the Work
70
+ by the public as contemplated by Affirmer's express Statement of Purpose.
71
+
72
+ 3. Public License Fallback. Should any part of the Waiver for any reason be
73
+ judged legally invalid or ineffective under applicable law, then the Waiver
74
+ shall be preserved to the maximum extent permitted taking into account
75
+ Affirmer's express Statement of Purpose. In addition, to the extent the Waiver
76
+ is so judged Affirmer hereby grants to each affected person a royalty-free,
77
+ non transferable, non sublicensable, non exclusive, irrevocable and
78
+ unconditional license to exercise Affirmer's Copyright and Related Rights in
79
+ the Work (i) in all territories worldwide, (ii) for the maximum duration
80
+ provided by applicable law or treaty (including future time extensions), (iii)
81
+ in any current or future medium and for any number of copies, and (iv) for any
82
+ purpose whatsoever, including without limitation commercial, advertising or
83
+ promotional purposes (the "License"). The License shall be deemed effective as
84
+ of the date CC0 was applied by Affirmer to the Work. Should any part of the
85
+ License for any reason be judged legally invalid or ineffective under
86
+ applicable law, such partial invalidity or ineffectiveness shall not
87
+ invalidate the remainder of the License, and in such case Affirmer hereby
88
+ affirms that he or she will not (i) exercise any of his or her remaining
89
+ Copyright and Related Rights in the Work or (ii) assert any associated claims
90
+ and causes of action with respect to the Work, in either case contrary to
91
+ Affirmer's express Statement of Purpose.
92
+
93
+ 4. Limitations and Disclaimers.
94
+
95
+ a. No trademark or patent rights held by Affirmer are waived, abandoned,
96
+ surrendered, licensed or otherwise affected by this document.
97
+
98
+ b. Affirmer offers the Work as-is and makes no representations or warranties
99
+ of any kind concerning the Work, express, implied, statutory or otherwise,
100
+ including without limitation warranties of title, merchantability, fitness
101
+ for a particular purpose, non infringement, or the absence of latent or
102
+ other defects, accuracy, or the present or absence of errors, whether or not
103
+ discoverable, all to the greatest extent permissible under applicable law.
104
+
105
+ c. Affirmer disclaims responsibility for clearing rights of other persons
106
+ that may apply to the Work or any use thereof, including without limitation
107
+ any person's Copyright and Related Rights in the Work. Further, Affirmer
108
+ disclaims responsibility for obtaining any necessary consents, permissions
109
+ or other rights required for any use of the Work.
110
+
111
+ d. Affirmer understands and acknowledges that Creative Commons is not a
112
+ party to this document and has no duty or obligation with respect to this
113
+ CC0 or use of the Work.
114
+
115
+ For more information, please see
116
+ <http://creativecommons.org/publicdomain/zero/1.0/>
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  A simple SAFE API wrapper written in Ruby.
4
4
 
5
- **Tested Aug 14, 2016. Working with SAFE version 0.5.**
5
+ **Tested Feb 24, 2017. Working with SAFE version 0.5.**
6
6
 
7
7
  ## Installation
8
8
  ```
@@ -14,18 +14,18 @@ A simple SAFE API wrapper written in Ruby.
14
14
  ```ruby
15
15
  require "safenet"
16
16
 
17
- my_client = SafeNet::Client.new
18
- my_client.nfs.create_public_directory("/mydir")
19
- my_client.nfs.create_file("/mydir/index.html", "Hello world!<br>I'm a webpage :D")
20
- my_client.dns.register_service("my-wonderful-app", "www", "/mydir")
21
- my_client.nfs.get_file("/mydir/index.html")
17
+ safe = SafeNet::Client.new(permissions: ["SAFE_DRIVE_ACCESS"])
18
+ safe.nfs.create_public_directory("/mydir")
19
+ safe.nfs.create_file("/mydir/index.html", "Hello world!<br>I'm a webpage :D")
20
+ safe.dns.register_service("my-wonderful-app", "www", "/mydir")
21
+ safe.nfs.get_file("/mydir/index.html")
22
22
 
23
23
  # Then, open http://www.my-wonderful-app.safenet/
24
24
  ```
25
25
 
26
26
  You can also set a more detailed App info:
27
27
  ```
28
- my_client = SafeNet::Client.new({
28
+ safe = SafeNet::Client.new({
29
29
  name: "Ruby Demo App",
30
30
  version: "0.0.1",
31
31
  vendor: "Vendor's Name",
@@ -36,46 +36,100 @@ my_client = SafeNet::Client.new({
36
36
  *File Upload / Download:*
37
37
  ```ruby
38
38
  # upload
39
- my_client.nfs.create_file("/mydir/dog.jpg", File.read("/home/daniel/Pictures/dog.jpg"), content_type: "image/jpeg")
39
+ safe.nfs.create_file("/mydir/dog.jpg", File.read("/home/daniel/Pictures/dog.jpg"), content_type: "image/jpeg")
40
40
 
41
41
  # download
42
42
  File.open("/home/daniel/Pictures/dog-new.jpg", "w") do |file|
43
- file.write(my_client.nfs.get_file("/mydir/dog.jpg")["body"])
43
+ file.write(safe.nfs.get_file("/mydir/dog.jpg")["body"])
44
44
  end
45
45
  ```
46
46
 
47
47
  *Directory's file list:*
48
48
  ```ruby
49
- my_client.nfs.get_directory("/mydir")["files"].each do |file|
49
+ safe.nfs.get_directory("/mydir")["files"].each do |file|
50
50
  puts file["name"]
51
51
  end
52
52
  ```
53
53
 
54
- ## Structured Data (SD): **EMULATED**
55
- Although SD has not been officially implemented by MaidSafe yet, we provide a sub-module (sd) that emulates it.
56
- All the information are stored in the Safe Network, through DNS/NFS sub-systems.
54
+ ## Structured Data (SD):
57
55
 
58
- Example:
59
56
  ```ruby
60
- my_client.sd.update(37267, 11, "Hi John") # 37267 = id, 11 = tag_type
61
- my_client.sd.get(37267, 11)
62
- my_client.sd.update(37267, 11, "Hello World!")
57
+ # client
58
+ safe = SafeNet::Client.new(permissions: ["LOW_LEVEL_API"])
59
+
60
+ # plain (not encrypted)
61
+ hnd_cipher = safe.cipher.get_handle
62
+
63
+ # create
64
+ name = SafeNet::s2h("my_sd")
65
+ hnd = safe.sd.create(name, 500, hnd_cipher, IO.binread("#{Rails.root}/my_file.txt"))
66
+ safe.sd.put(hnd) # saves on the network
67
+ safe.sd.drop_handle(hnd) # release handler
68
+
69
+ # release cipher handler
70
+ safe.cipher.drop_handle(hnd_cipher)
71
+
72
+ # read
73
+ name = SafeNet::s2h("my_sd")
74
+ hnd_sd_data_id = safe.data_id.get_data_id_sd(name)
75
+ hnd_sd = safe.sd.get_handle(hnd_sd_data_id)['handleId']
76
+ contents = safe.sd.read(hnd_sd)
77
+ safe.sd.drop_handle(hnd_sd)
78
+ safe.data_id.drop_handle(hnd_sd_data_id)
79
+ puts contents # print SD contents on screen
80
+ ```
81
+
82
+ ## Immutable Data:
63
83
 
64
- my_client.raw.create("Hello World!") # => "861844d6704e8573fec34d967e20bcfef3d424cf48be04e6dc08f2bd58c729743371015ead891cc3cf1c9d34b49264b510751b1ff9e537937bc46b5d6ff4ecc8"
65
- my_client.raw.create_from_file("/home/daniel/dog.jpg")
66
- my_client.raw.get("861844d6704e8573fec34d967e20bcfef3d424cf48be04e6dc08f2bd58c729743371015ead891cc3cf1c9d34b49264b510751b1ff9e537937bc46b5d6ff4ecc8") # => "Hello World!"
84
+ ```ruby
85
+ # client
86
+ safe = SafeNet::Client.new(permissions: ["LOW_LEVEL_API"])
87
+
88
+ # plain (not encrypted)
89
+ hnd_cipher = safe.cipher.get_handle
90
+
91
+ # write
92
+ hnd_w = safe.immutable.get_writer_handle
93
+ safe.immutable.write_data(hnd_w, 'Hello World')
94
+ hnd_data_id = safe.immutable.close_writer(hnd_w, hnd_cipher)
95
+ name = safe.data_id.serialize(hnd_data_id) # IMMUTABLE NAME
96
+ safe.immutable.drop_writer_handle(hnd_w)
97
+ safe.data_id.drop_handle(hnd_data_id)
98
+ puts "Immutable name: #{name}"
99
+
100
+ # read
101
+ hnd_data_id = safe.data_id.deserialize(name)
102
+ hnd_r = safe.immutable.get_reader_handle(hnd_data_id)
103
+ contents = safe.immutable.read(hnd_r)
104
+ safe.immutable.drop_reader_handle(hnd_r)
105
+ safe.data_id.drop_handle(hnd_data_id)
106
+ puts contents
107
+
108
+ # read - seek position
109
+ chunk_pos = 0
110
+ max_chunk_size = 100_000
111
+
112
+ hnd_data_id = safe.data_id.deserialize(name)
113
+ hnd_r = safe.immutable.get_reader_handle(hnd_data_id)
114
+ contents = safe.immutable.read(hnd_r, "bytes=#{chunk_pos}-#{chunk_pos+max_chunk_size}")
115
+ safe.immutable.drop_reader_handle(hnd_r)
116
+ safe.data_id.drop_handle(hnd_data_id)
117
+ puts contents
67
118
  ```
68
119
 
69
- Encryption and versioning are both not supported in this emulated version.
120
+ <!-- id = SafeNet.s2h("my_sd")
121
+ safe.sd.update(id, 500, "Hi John")
122
+ safe.sd.get(id, 500)
123
+ safe.sd.update(id, 500, "Hello World!") -->
70
124
 
71
- For more information see:
72
- https://github.com/maidsafe/rfcs/blob/master/text/0028-launcher-low-level-api/0028-launcher-low-level-api.md
125
+ <!-- id = safe.immutable.create("Hello World!") # => "861844d6704e8573fec34d967e20bcfef3d424cf48be04e6dc08f2bd58c729743371015ead891cc3cf1c9d34b49264b510751b1ff9e537937bc46b5d6ff4ecc8"
126
+ safe.immutable.create_from_file("/home/daniel/dog.jpg")
127
+ safe.immutable.get(id) # => "Hello World!" -->
128
+ ```
73
129
 
74
130
  ## Supported methods:
75
131
  |Module|Method|Arguments|Optional|Doc|
76
132
  |------|------|---------|--------|---|
77
- |sd|update|id (_int_), tag_type (_int_), contents (_string_\|_binary_)|||
78
- |sd|get|id (_int_), tag_type (_int_)|||
79
133
  |nfs|create_public_directory|dir_path (_string_)|root_path ("_app_" or "_drive_"), meta (_string_)|* _Alias to "create_directory"_|
80
134
  |nfs|create_private_directory|dir_path (_string_)|root_path ("_app_" or "_drive_"), meta (_string_)|* _Alias to "create_directory"_|
81
135
  |nfs|create_directory|dir_path (_string_)|is_private (_bool_), root_path ("_app_" or "_drive_"), meta (_string_)|https://maidsafe.readme.io/docs/nfs-create-directory|
@@ -95,3 +149,9 @@ https://github.com/maidsafe/rfcs/blob/master/text/0028-launcher-low-level-api/00
95
149
  |dns|list_services|long_name (_string_)||https://maidsafe.readme.io/docs/dns-list-services|
96
150
  |dns|get_home_dir|long_name (_string_), service_name (_string_)||https://maidsafe.readme.io/docs/dns-get-home-dir|
97
151
  |dns|get_file_unauth|long_name (_string_), service_name (_string_), file_path (_string_)||https://maidsafe.readme.io/docs/dns-get-file-unauth|
152
+
153
+ ## TODO
154
+ * Improve test suite
155
+ * Improve documentation
156
+ * Use FFI instead of REST
157
+ * Use the same interface (same method names) as [safe_app_nodejs](https://github.com/maidsafe/safe_app_nodejs)
data/lib/safenet.rb CHANGED
@@ -4,10 +4,13 @@ require "base64"
4
4
  require "json"
5
5
  require "cgi" # CGI.escape method
6
6
 
7
+ API_VERSION = 0.5
8
+ API_ENDPOINT = "http://localhost:8100/"
9
+
7
10
  module SafeNet
8
11
 
9
12
  class Client
10
- attr_reader :auth, :nfs, :dns, :sd, :raw, :app_info, :key_helper
13
+ attr_reader :auth, :nfs, :dns, :sd, :ad, :immutable, :cipher, :data_id, :app_info, :key_helper
11
14
 
12
15
  def initialize(options = {})
13
16
  @app_info = defaults()
@@ -17,10 +20,14 @@ module SafeNet
17
20
  @nfs = SafeNet::NFS.new(self)
18
21
  @dns = SafeNet::DNS.new(self)
19
22
  @sd = SafeNet::SD.new(self)
20
- @raw = SafeNet::Raw.new(self)
23
+ @ad = SafeNet::AD.new(self)
24
+ @immutable = SafeNet::Immutable.new(self)
25
+ @cipher = SafeNet::Cipher.new(self)
26
+ @data_id = SafeNet::DataId.new(self)
21
27
  end
22
28
 
23
29
  def set_app_info(options = {})
30
+ @app_info[:permissions] = options[:permissions] if options.has_key?(:permissions)
24
31
  @app_info[:name] = options[:name] if options.has_key?(:name)
25
32
  @app_info[:version] = options[:version] if options.has_key?(:version)
26
33
  @app_info[:vendor] = options[:vendor] if options.has_key?(:vendor)
@@ -38,7 +45,7 @@ module SafeNet
38
45
  version: "0.0.1",
39
46
  vendor: "Vendor's Name",
40
47
  id: "org.thevendor.demo",
41
- launcher_server: "http://localhost:8100/",
48
+ launcher_server: API_ENDPOINT,
42
49
  conf_path: File.join(File.expand_path('..', __FILE__), "conf.json")
43
50
  }
44
51
  end
@@ -91,9 +98,9 @@ module SafeNet
91
98
  #
92
99
  # Reference: https://maidsafe.readme.io/docs/auth
93
100
  #
94
- def auth(permissions = [])
101
+ def auth()
95
102
  # entry point
96
- url = "#{@client.app_info[:launcher_server]}auth"
103
+ url = "#{@client.app_info[:launcher_server]}#{API_VERSION}/auth"
97
104
 
98
105
  # payload
99
106
  payload = {
@@ -103,7 +110,7 @@ module SafeNet
103
110
  vendor: @client.app_info[:vendor],
104
111
  id: @client.app_info[:id]
105
112
  },
106
- permissions: permissions
113
+ permissions: @client.app_info[:permissions]
107
114
  }
108
115
 
109
116
  # api call
@@ -142,7 +149,7 @@ module SafeNet
142
149
  #
143
150
  def is_token_valid
144
151
  # entry point
145
- url = "#{@client.app_info[:launcher_server]}auth"
152
+ url = "#{@client.app_info[:launcher_server]}#{API_VERSION}/auth"
146
153
 
147
154
  # api call
148
155
  uri = URI(url)
@@ -166,7 +173,7 @@ module SafeNet
166
173
  #
167
174
  def revoke_token
168
175
  # entry point
169
- url = "#{@client.app_info[:launcher_server]}auth"
176
+ url = "#{@client.app_info[:launcher_server]}#{API_VERSION}/auth"
170
177
 
171
178
  # api call
172
179
  uri = URI(url)
@@ -203,7 +210,7 @@ module SafeNet
203
210
  options[:is_private] = true if ! options.has_key?(:is_private)
204
211
 
205
212
  # Entry point
206
- url = "#{@client.app_info[:launcher_server]}nfs/directory/#{options[:root_path]}/#{CGI.escape(dir_path)}"
213
+ url = "#{@client.app_info[:launcher_server]}#{API_VERSION}/nfs/directory/#{options[:root_path]}/#{CGI.escape(dir_path)}"
207
214
 
208
215
  # Payload
209
216
  payload = {
@@ -252,7 +259,7 @@ module SafeNet
252
259
  options[:root_path] = 'app' if ! options.has_key?(:root_path)
253
260
 
254
261
  # Entry point
255
- url = "#{@client.app_info[:launcher_server]}nfs/directory/#{options[:root_path]}/#{CGI.escape(dir_path)}"
262
+ url = "#{@client.app_info[:launcher_server]}#{API_VERSION}/nfs/directory/#{options[:root_path]}/#{CGI.escape(dir_path)}"
256
263
 
257
264
  # API call
258
265
  uri = URI(url)
@@ -281,7 +288,7 @@ module SafeNet
281
288
  options[:root_path] = 'app' if ! options.has_key?(:root_path)
282
289
 
283
290
  # Entry point
284
- url = "#{@client.app_info[:launcher_server]}nfs/directory/#{options[:root_path]}/#{CGI.escape(dir_path)}"
291
+ url = "#{@client.app_info[:launcher_server]}#{API_VERSION}/nfs/directory/#{options[:root_path]}/#{CGI.escape(dir_path)}"
285
292
 
286
293
  # Optional payload
287
294
  payload = {}
@@ -322,7 +329,7 @@ module SafeNet
322
329
  options[:root_path] = 'app' if ! options.has_key?(:root_path)
323
330
 
324
331
  # Entry point
325
- url = "#{@client.app_info[:launcher_server]}nfs/directory/#{options[:root_path]}/#{CGI.escape(dir_path)}"
332
+ url = "#{@client.app_info[:launcher_server]}#{API_VERSION}/nfs/directory/#{options[:root_path]}/#{CGI.escape(dir_path)}"
326
333
 
327
334
  # API call
328
335
  uri = URI(url)
@@ -352,7 +359,7 @@ module SafeNet
352
359
  contents ||= ""
353
360
 
354
361
  # Entry point
355
- url = "#{@client.app_info[:launcher_server]}nfs/file/#{options[:root_path]}/#{CGI.escape(file_path)}"
362
+ url = "#{@client.app_info[:launcher_server]}#{API_VERSION}/nfs/file/#{options[:root_path]}/#{CGI.escape(file_path)}"
356
363
 
357
364
  # API call
358
365
  uri = URI(url)
@@ -386,7 +393,7 @@ module SafeNet
386
393
  options[:root_path] = 'app' if ! options.has_key?(:root_path)
387
394
 
388
395
  # Entry point
389
- url = "#{@client.app_info[:launcher_server]}nfs/file/#{options[:root_path]}/#{CGI.escape(file_path)}"
396
+ url = "#{@client.app_info[:launcher_server]}#{API_VERSION}/nfs/file/#{options[:root_path]}/#{CGI.escape(file_path)}"
390
397
 
391
398
  # API call
392
399
  uri = URI(url)
@@ -422,7 +429,7 @@ module SafeNet
422
429
  options[:root_path] = 'app' if ! options.has_key?(:root_path)
423
430
 
424
431
  # Entry point
425
- url = "#{@client.app_info[:launcher_server]}nfs/file/#{options[:root_path]}/#{CGI.escape(file_path)}?"
432
+ url = "#{@client.app_info[:launcher_server]}#{API_VERSION}/nfs/file/#{options[:root_path]}/#{CGI.escape(file_path)}?"
426
433
 
427
434
  # Query params
428
435
  query = []
@@ -461,7 +468,7 @@ module SafeNet
461
468
  options[:root_path] = 'app' if ! options.has_key?(:root_path)
462
469
 
463
470
  # Entry point
464
- url = "#{@client.app_info[:launcher_server]}nfs/file/metadata/#{options[:root_path]}/#{CGI.escape(file_path)}"
471
+ url = "#{@client.app_info[:launcher_server]}#{API_VERSION}/nfs/file/metadata/#{options[:root_path]}/#{CGI.escape(file_path)}"
465
472
 
466
473
  # Optional payload
467
474
  payload = {}
@@ -503,7 +510,7 @@ module SafeNet
503
510
  options[:root_path] = 'app' if ! options.has_key?(:root_path)
504
511
 
505
512
  # Entry point
506
- url = "#{@client.app_info[:launcher_server]}nfs/file/#{options[:root_path]}/#{CGI.escape(file_path)}"
513
+ url = "#{@client.app_info[:launcher_server]}#{API_VERSION}/nfs/file/#{options[:root_path]}/#{CGI.escape(file_path)}"
507
514
 
508
515
  # API call
509
516
  uri = URI(url)
@@ -534,7 +541,7 @@ module SafeNet
534
541
  #
535
542
  def create_long_name(long_name)
536
543
  # entry point
537
- url = "#{@client.app_info[:launcher_server]}dns/#{CGI.escape(long_name)}"
544
+ url = "#{@client.app_info[:launcher_server]}#{API_VERSION}/dns/#{CGI.escape(long_name)}"
538
545
 
539
546
  # api call
540
547
  uri = URI(url)
@@ -560,7 +567,7 @@ module SafeNet
560
567
  #
561
568
  def register_service(long_name, service_name, service_home_dir_path, options = {})
562
569
  # Entry point
563
- url = "#{@client.app_info[:launcher_server]}dns"
570
+ url = "#{@client.app_info[:launcher_server]}#{API_VERSION}/dns"
564
571
 
565
572
  # Payload
566
573
  payload = {
@@ -598,7 +605,7 @@ module SafeNet
598
605
  #
599
606
  def add_service(long_name, service_name, service_home_dir_path)
600
607
  # Entry point
601
- url = "#{@client.app_info[:launcher_server]}dns"
608
+ url = "#{@client.app_info[:launcher_server]}#{API_VERSION}/dns"
602
609
 
603
610
  # Payload
604
611
  payload = {
@@ -624,7 +631,7 @@ module SafeNet
624
631
  # https://maidsafe.readme.io/docs/dns-list-long-names
625
632
  def list_long_names
626
633
  # entry point
627
- url = "#{@client.app_info[:launcher_server]}dns"
634
+ url = "#{@client.app_info[:launcher_server]}#{API_VERSION}/dns"
628
635
 
629
636
  # api call
630
637
  uri = URI(url)
@@ -639,7 +646,7 @@ module SafeNet
639
646
  # https://maidsafe.readme.io/docs/dns-list-services
640
647
  def list_services(long_name)
641
648
  # entry point
642
- url = "#{@client.app_info[:launcher_server]}dns/#{CGI.escape(long_name)}"
649
+ url = "#{@client.app_info[:launcher_server]}#{API_VERSION}/dns/#{CGI.escape(long_name)}"
643
650
 
644
651
  # api call
645
652
  uri = URI(url)
@@ -655,7 +662,7 @@ module SafeNet
655
662
  # https://maidsafe.readme.io/docs/dns-get-home-dir
656
663
  def get_home_dir(long_name, service_name)
657
664
  # entry point
658
- url = "#{@client.app_info[:launcher_server]}dns/#{CGI.escape(service_name)}/#{CGI.escape(long_name)}"
665
+ url = "#{@client.app_info[:launcher_server]}#{API_VERSION}/dns/#{CGI.escape(service_name)}/#{CGI.escape(long_name)}"
659
666
 
660
667
  # api call
661
668
  uri = URI(url)
@@ -672,7 +679,7 @@ module SafeNet
672
679
  # get_file_unauth("thegoogle", "www", "index.html")
673
680
  def get_file_unauth(long_name, service_name, file_path)
674
681
  # entry point
675
- url = "#{@client.app_info[:launcher_server]}dns/#{CGI.escape(service_name)}/#{CGI.escape(long_name)}/#{CGI.escape(file_path)}"
682
+ url = "#{@client.app_info[:launcher_server]}#{API_VERSION}/dns/#{CGI.escape(service_name)}/#{CGI.escape(long_name)}/#{CGI.escape(file_path)}"
676
683
 
677
684
  # api call
678
685
  uri = URI(url)
@@ -685,65 +692,520 @@ module SafeNet
685
692
  end
686
693
  end
687
694
 
695
+ class AD
696
+ def initialize(client_obj)
697
+ @client = client_obj
698
+ end
699
+
700
+ def create(name, is_private = false, filter_type = 'BLACK_LIST', filter_key = nil)
701
+ # Entry point
702
+ url = "#{@client.app_info[:launcher_server]}#{API_VERSION}/appendable-data"
703
+
704
+ # Payload
705
+ payload = {
706
+ name: name,
707
+ isPrivate: is_private,
708
+ filterType: filter_type,
709
+ filterKey: filter_key
710
+ }
711
+
712
+ # API call
713
+ uri = URI(url)
714
+ http = Net::HTTP.new(uri.host, uri.port)
715
+ req = Net::HTTP::Post.new(uri.path, {
716
+ 'Authorization' => "Bearer #{@client.key_helper.get_valid_token()}",
717
+ 'Content-Type' => 'application/json'
718
+ })
719
+ req.body = payload.to_json
720
+ res = http.request(req)
721
+ res.code == "200" ? JSON.parse(res.body)['handleId'] : JSON.parse(res.body)
722
+ end
723
+
724
+ def put(handle_id)
725
+ # Entry point
726
+ url = "#{@client.app_info[:launcher_server]}#{API_VERSION}/appendable-data/#{handle_id}"
727
+
728
+ # API call
729
+ uri = URI(url)
730
+ http = Net::HTTP.new(uri.host, uri.port)
731
+ req = Net::HTTP::Put.new(uri.path, {
732
+ 'Authorization' => "Bearer #{@client.key_helper.get_valid_token()}"
733
+ })
734
+ res = http.request(req)
735
+ res.code == "200" ? true : JSON.parse(res.body)
736
+ end
737
+
738
+ def post(handle_id)
739
+ # Entry point
740
+ url = "#{@client.app_info[:launcher_server]}#{API_VERSION}/appendable-data/#{handle_id}"
741
+
742
+ # API call
743
+ uri = URI(url)
744
+ http = Net::HTTP.new(uri.host, uri.port)
745
+ req = Net::HTTP::Post.new(uri.path, {
746
+ 'Authorization' => "Bearer #{@client.key_helper.get_valid_token()}"
747
+ })
748
+ res = http.request(req)
749
+ res.code == "200" ? true : JSON.parse(res.body)
750
+ end
751
+
752
+ def get_handle(data_id_handle)
753
+ # entry point
754
+ url = "#{@client.app_info[:launcher_server]}#{API_VERSION}/appendable-data/handle/#{data_id_handle}"
755
+
756
+ # api call
757
+ uri = URI(url)
758
+ http = Net::HTTP.new(uri.host, uri.port)
759
+ req = Net::HTTP::Get.new(uri.path, {
760
+ 'Authorization' => "Bearer #{@client.key_helper.get_token()}"
761
+ })
762
+ res = http.request(req)
763
+ JSON.parse(res.body)
764
+ end
765
+
766
+ def get_data_id_handle(handle_id)
767
+ # entry point
768
+ url = "#{@client.app_info[:launcher_server]}#{API_VERSION}/appendable-data/data-id/#{handle_id}"
769
+
770
+ # api call
771
+ uri = URI(url)
772
+ http = Net::HTTP.new(uri.host, uri.port)
773
+ req = Net::HTTP::Get.new(uri.path, {
774
+ 'Authorization' => "Bearer #{@client.key_helper.get_token()}"
775
+ })
776
+ res = http.request(req)
777
+ res.code == "200" ? JSON.parse(res.body)['handleId'] : JSON.parse(res.body)
778
+ end
779
+
780
+ def get_metadata(handle_id)
781
+ # entry point
782
+ url = "#{@client.app_info[:launcher_server]}#{API_VERSION}/appendable-data/metadata/#{handle_id}"
783
+
784
+ # api call
785
+ uri = URI(url)
786
+ http = Net::HTTP.new(uri.host, uri.port)
787
+ req = Net::HTTP::Get.new(uri.path, {
788
+ 'Authorization' => "Bearer #{@client.key_helper.get_token()}"
789
+ })
790
+ res = http.request(req)
791
+ JSON.parse(res.body)
792
+ end
793
+
794
+ def drop_handle(handle_id)
795
+ # entry point
796
+ url = "#{@client.app_info[:launcher_server]}#{API_VERSION}/appendable-data/handle/#{handle_id}"
797
+
798
+ # api call
799
+ uri = URI(url)
800
+ http = Net::HTTP.new(uri.host, uri.port)
801
+ req = Net::HTTP::Delete.new(uri.path)
802
+ res = http.request(req)
803
+ res.code == "200" ? true : JSON.parse(res.body)
804
+ end
805
+
806
+ def append(handle_id, handle_data_id)
807
+ # Entry point
808
+ url = "#{@client.app_info[:launcher_server]}#{API_VERSION}/appendable-data/#{handle_id}/#{handle_data_id}"
809
+
810
+ # API call
811
+ uri = URI(url)
812
+ http = Net::HTTP.new(uri.host, uri.port)
813
+ req = Net::HTTP::Put.new(uri.path, {
814
+ 'Authorization' => "Bearer #{@client.key_helper.get_valid_token()}"
815
+ })
816
+ res = http.request(req)
817
+ res.code == "200" ? true : JSON.parse(res.body)
818
+ end
819
+
820
+ def get_data_id_at_index(handle_id, index)
821
+ # Entry point
822
+ url = "#{@client.app_info[:launcher_server]}#{API_VERSION}/appendable-data/#{handle_id}/#{index}"
823
+
824
+ # API call
825
+ uri = URI(url)
826
+ http = Net::HTTP.new(uri.host, uri.port)
827
+ req = Net::HTTP::Get.new(uri.path, {
828
+ 'Authorization' => "Bearer #{@client.key_helper.get_valid_token()}"
829
+ })
830
+ res = http.request(req)
831
+ res.code == "200" ? JSON.parse(res.body)["handleId"] : JSON.parse(res.body)
832
+ end
833
+
834
+ end
835
+
688
836
  class SD
689
837
  def initialize(client_obj)
690
838
  @client = client_obj
691
839
  end
692
840
 
693
- def create(id, tag_type, contents)
694
- return { "errorCode" => -99991, "description" => "SD max size currently limited to 70k" } if contents.size > 1024 * 70
695
- new_id = Digest::SHA2.new(512).hexdigest("#{id}#{tag_type}")
696
- res = @client.nfs.create_public_directory("/_sds/#{new_id}", meta: contents)
697
- if res != true
698
- if res["errorCode"] == -1502 # "_sds" directory doesn't exist
699
- @client.nfs.create_public_directory("/_sds")
700
- res = @client.nfs.create_public_directory("/_sds/#{new_id}", meta: contents) == true
701
- else # unknown error
702
- res = false
703
- end
704
- end
705
- res &&= @client.dns.register_service("sd#{new_id[0..48]}", "sds", "/_sds/#{new_id}") == true
706
- res
841
+ def create(name, type_tag = 500, hnd_cipher_opts = nil, data = nil, version = 0)
842
+ # Entry point
843
+ url = "#{@client.app_info[:launcher_server]}#{API_VERSION}/structured-data"
844
+
845
+ # Payload
846
+ payload = {
847
+ name: name,
848
+ typeTag: type_tag,
849
+ cipherOpts: hnd_cipher_opts,
850
+ data: Base64.encode64(data),
851
+ version: version
852
+ }
853
+
854
+ # API call
855
+ uri = URI(url)
856
+ http = Net::HTTP.new(uri.host, uri.port)
857
+ req = Net::HTTP::Post.new(uri.path, {
858
+ 'Authorization' => "Bearer #{@client.key_helper.get_valid_token()}",
859
+ 'Content-Type' => 'application/json'
860
+ })
861
+ req.body = payload.to_json
862
+ res = http.request(req)
863
+ res.code == "200" ? JSON.parse(res.body)['handleId'] : JSON.parse(res.body)
707
864
  end
708
865
 
709
- def update(id, tag_type, contents)
710
- new_id = Digest::SHA2.new(512).hexdigest("#{id}#{tag_type}")
711
- res = @client.nfs.update_directory("/_sds/#{new_id}", meta: contents)
712
- if res != true
713
- if res["errorCode"] == -1502 # SD doesn't exist yet
714
- res = self.create(id, tag_type, contents) == true
715
- else # unknown error
716
- res = false
717
- end
718
- end
719
- res
866
+
867
+ def put(handle_id)
868
+ # Entry point
869
+ url = "#{@client.app_info[:launcher_server]}#{API_VERSION}/structured-data/#{handle_id}"
870
+
871
+ # API call
872
+ uri = URI(url)
873
+ http = Net::HTTP.new(uri.host, uri.port)
874
+ req = Net::HTTP::Put.new(uri.path, {
875
+ 'Authorization' => "Bearer #{@client.key_helper.get_valid_token()}"
876
+ })
877
+ res = http.request(req)
878
+ res.code == "200" ? true : JSON.parse(res.body)
879
+ end
880
+
881
+ def post(handle_id)
882
+ # Entry point
883
+ url = "#{@client.app_info[:launcher_server]}#{API_VERSION}/structured-data/#{handle_id}"
884
+
885
+ # API call
886
+ uri = URI(url)
887
+ http = Net::HTTP.new(uri.host, uri.port)
888
+ req = Net::HTTP::Post.new(uri.path, {
889
+ 'Authorization' => "Bearer #{@client.key_helper.get_valid_token()}"
890
+ })
891
+ res = http.request(req)
892
+ res.code == "200" ? true : JSON.parse(res.body)
720
893
  end
721
894
 
722
- def get(id, tag_type)
723
- new_id = Digest::SHA2.new(512).hexdigest("#{id}#{tag_type}")
724
- @client.dns.get_home_dir("sd#{new_id[0..48]}", "sds").try(:[], "info").try(:[], "metadata")
895
+ def get_handle(data_id_handle)
896
+ # entry point
897
+ url = "#{@client.app_info[:launcher_server]}#{API_VERSION}/structured-data/handle/#{data_id_handle}"
898
+
899
+ # api call
900
+ uri = URI(url)
901
+ http = Net::HTTP.new(uri.host, uri.port)
902
+ req = Net::HTTP::Get.new(uri.path, {
903
+ 'Authorization' => "Bearer #{@client.key_helper.get_token()}"
904
+ })
905
+ res = http.request(req)
906
+ JSON.parse(res.body)
907
+ end
908
+
909
+ def get_data_id_handle(handle_id)
910
+ # entry point
911
+ url = "#{@client.app_info[:launcher_server]}#{API_VERSION}/structured-data/data-id/#{handle_id}"
912
+
913
+ # api call
914
+ uri = URI(url)
915
+ http = Net::HTTP.new(uri.host, uri.port)
916
+ req = Net::HTTP::Get.new(uri.path, {
917
+ 'Authorization' => "Bearer #{@client.key_helper.get_token()}"
918
+ })
919
+ res = http.request(req)
920
+ JSON.parse(res.body)
921
+ end
922
+
923
+ def get_metadata(handle_id)
924
+ # entry point
925
+ url = "#{@client.app_info[:launcher_server]}#{API_VERSION}/structured-data/metadata/#{handle_id}"
926
+
927
+ # api call
928
+ uri = URI(url)
929
+ http = Net::HTTP.new(uri.host, uri.port)
930
+ req = Net::HTTP::Get.new(uri.path, {
931
+ 'Authorization' => "Bearer #{@client.key_helper.get_token()}"
932
+ })
933
+ res = http.request(req)
934
+ JSON.parse(res.body)
935
+ end
936
+
937
+ def read(handle_id, version = nil)
938
+ # entry point
939
+ url = "#{@client.app_info[:launcher_server]}#{API_VERSION}/structured-data/#{handle_id}"
940
+ url = "#{url}/#{version}?" if ! version.nil?
941
+
942
+ # api call
943
+ uri = URI(url)
944
+ http = Net::HTTP.new(uri.host, uri.port)
945
+ req = Net::HTTP::Get.new(uri.path, {
946
+ 'Authorization' => "Bearer #{@client.key_helper.get_token()}"
947
+ })
948
+ res = http.request(req)
949
+ res.code == "200" ? res.body : JSON.parse(res.body)
950
+ end
951
+
952
+ def drop_handle(handle_id)
953
+ # entry point
954
+ url = "#{@client.app_info[:launcher_server]}#{API_VERSION}/structured-data/handle/#{handle_id}"
955
+
956
+ # api call
957
+ uri = URI(url)
958
+ http = Net::HTTP.new(uri.host, uri.port)
959
+ req = Net::HTTP::Delete.new(uri.path)
960
+ res = http.request(req)
961
+ res.code == "200" ? true : JSON.parse(res.body)
962
+ end
963
+ end
964
+
965
+ class Immutable
966
+ def initialize(client_obj)
967
+ @client = client_obj
968
+ end
969
+
970
+ def get_reader_handle(handle_id)
971
+ # entry point
972
+ url = "#{@client.app_info[:launcher_server]}#{API_VERSION}/immutable-data/reader/#{handle_id}"
973
+
974
+ # api call
975
+ uri = URI(url)
976
+ http = Net::HTTP.new(uri.host, uri.port)
977
+ req = Net::HTTP::Get.new(uri.path, {
978
+ 'Authorization' => "Bearer #{@client.key_helper.get_token()}"
979
+ })
980
+ res = http.request(req)
981
+ res.code == "200" ? JSON.parse(res.body)["handleId"] : JSON.parse(res.body)
982
+ end
983
+
984
+ def get_writer_handle()
985
+ # entry point
986
+ url = "#{@client.app_info[:launcher_server]}#{API_VERSION}/immutable-data/writer"
987
+
988
+ # api call
989
+ uri = URI(url)
990
+ http = Net::HTTP.new(uri.host, uri.port)
991
+ req = Net::HTTP::Get.new(uri.path, {
992
+ 'Authorization' => "Bearer #{@client.key_helper.get_token()}"
993
+ })
994
+ res = http.request(req)
995
+ res.code == "200" ? JSON.parse(res.body)["handleId"] : JSON.parse(res.body)
996
+ end
997
+
998
+ # eg range: "bytes=0-1000"
999
+ def read(handle_id, range = nil)
1000
+ # entry point
1001
+ url = "#{@client.app_info[:launcher_server]}#{API_VERSION}/immutable-data/#{handle_id}"
1002
+
1003
+ # api call
1004
+ uri = URI(url)
1005
+ http = Net::HTTP.new(uri.host, uri.port)
1006
+ header = { 'Authorization' => "Bearer #{@client.key_helper.get_token()}", 'Content-Type': 'text/plain' }
1007
+ header['Range'] = range if range
1008
+ req = Net::HTTP::Get.new(uri.path, header)
1009
+ res = http.request(req)
1010
+ (res.code == "200" || res.code == "206") ? res.body : JSON.parse(res.body)
1011
+ end
1012
+
1013
+ def write_data(handle_id, contents)
1014
+ # Entry point
1015
+ url = "#{@client.app_info[:launcher_server]}#{API_VERSION}/immutable-data/#{handle_id}"
1016
+
1017
+ # API call
1018
+ uri = URI(url)
1019
+ http = Net::HTTP.new(uri.host, uri.port)
1020
+ headers = {
1021
+ 'Authorization' => "Bearer #{@client.key_helper.get_valid_token()}",
1022
+ 'Content-Type': 'text/plain'
1023
+ }
1024
+ headers["Content-Length"] = contents.size.to_s
1025
+ req = Net::HTTP::Post.new(uri.path, headers)
1026
+ req.body = contents
1027
+ res = http.request(req)
1028
+ res.code == "200" ? true : JSON.parse(res.body)
1029
+ end
1030
+
1031
+ def close_writer(handle_id, cipher_opts_handle)
1032
+ # entry point
1033
+ url = "#{@client.app_info[:launcher_server]}#{API_VERSION}/immutable-data/#{handle_id}/#{cipher_opts_handle}"
1034
+
1035
+ # api call
1036
+ uri = URI(url)
1037
+ http = Net::HTTP.new(uri.host, uri.port)
1038
+ req = Net::HTTP::Put.new(uri.path, {
1039
+ 'Authorization' => "Bearer #{@client.key_helper.get_valid_token()}"
1040
+ })
1041
+ res = http.request(req)
1042
+ res.code == "200" ? JSON.parse(res.body)["handleId"] : JSON.parse(res.body)
1043
+ end
1044
+
1045
+
1046
+ def drop_reader_handle(handle_id)
1047
+ # entry point
1048
+ url = "#{@client.app_info[:launcher_server]}#{API_VERSION}/immutable-data/reader/#{handle_id}"
1049
+
1050
+ # api call
1051
+ uri = URI(url)
1052
+ http = Net::HTTP.new(uri.host, uri.port)
1053
+ req = Net::HTTP::Delete.new(uri.path, {
1054
+ 'Authorization' => "Bearer #{@client.key_helper.get_valid_token()}"
1055
+ })
1056
+ res = http.request(req)
1057
+ res.code == "200" ? true : JSON.parse(res.body)
1058
+ end
1059
+
1060
+ def drop_writer_handle(handle_id)
1061
+ # entry point
1062
+ url = "#{@client.app_info[:launcher_server]}#{API_VERSION}/immutable-data/writer/#{handle_id}"
1063
+
1064
+ # api call
1065
+ uri = URI(url)
1066
+ http = Net::HTTP.new(uri.host, uri.port)
1067
+ req = Net::HTTP::Delete.new(uri.path, {
1068
+ 'Authorization' => "Bearer #{@client.key_helper.get_valid_token()}"
1069
+ })
1070
+ res = http.request(req)
1071
+ res.code == "200" ? true : JSON.parse(res.body)
725
1072
  end
726
1073
  end
727
1074
 
728
- class Raw
1075
+ class Cipher
729
1076
  def initialize(client_obj)
730
1077
  @client = client_obj
731
1078
  end
732
1079
 
733
- def create(contents)
734
- id = Digest::SHA2.new(512).hexdigest(contents)
735
- @client.sd.create(id, -1, contents)
736
- id
1080
+ def get_handle(enc_type = 'PLAIN', sym_key_handle = nil)
1081
+ # Entry point
1082
+ url = "#{@client.app_info[:launcher_server]}#{API_VERSION}/cipher-opts/#{enc_type}"
1083
+ url << "/#{sym_key_handle}?" if sym_key_handle
1084
+
1085
+ # API call
1086
+ uri = URI(url)
1087
+ http = Net::HTTP.new(uri.host, uri.port)
1088
+ req = Net::HTTP::Get.new(uri.path, {
1089
+ 'Authorization' => "Bearer #{@client.key_helper.get_valid_token()}"
1090
+ })
1091
+ res = http.request(req)
1092
+ res.code == "200" ? JSON.parse(res.body)["handleId"] : JSON.parse(res.body)
1093
+ end
1094
+
1095
+ def drop_handle(handle_id)
1096
+ # entry point
1097
+ url = "#{@client.app_info[:launcher_server]}#{API_VERSION}/cipher-opts/#{handle_id}"
1098
+
1099
+ # api call
1100
+ uri = URI(url)
1101
+ http = Net::HTTP.new(uri.host, uri.port)
1102
+ req = Net::HTTP::Delete.new(uri.path, {
1103
+ 'Authorization' => "Bearer #{@client.key_helper.get_valid_token()}"
1104
+ })
1105
+ res = http.request(req)
1106
+ res.code == "200" ? true : JSON.parse(res.body)
1107
+ end
1108
+ end
1109
+
1110
+ class DataId
1111
+ def initialize(client_obj)
1112
+ @client = client_obj
1113
+ end
1114
+
1115
+ def get_data_id_sd(name, type_tag = 500)
1116
+ # Entry point
1117
+ url = "#{@client.app_info[:launcher_server]}#{API_VERSION}/data-id/structured-data"
1118
+
1119
+ # Payload
1120
+ payload = {
1121
+ name: name,
1122
+ typeTag: type_tag
1123
+ }
1124
+
1125
+ # API call
1126
+ uri = URI(url)
1127
+ http = Net::HTTP.new(uri.host, uri.port)
1128
+ req = Net::HTTP::Post.new(uri.path, {
1129
+ 'Authorization' => "Bearer #{@client.key_helper.get_valid_token()}",
1130
+ 'Content-Type' => 'application/json'
1131
+ })
1132
+ req.body = payload.to_json
1133
+ res = http.request(req)
1134
+ res.code == "200" ? JSON.parse(res.body)['handleId'] : JSON.parse(res.body)
1135
+ end
1136
+
1137
+ def get_data_id_ad(name, is_private = false)
1138
+ # Entry point
1139
+ url = "#{@client.app_info[:launcher_server]}#{API_VERSION}/data-id/appendable-data"
1140
+
1141
+ # Payload
1142
+ payload = {
1143
+ name: name,
1144
+ isPrivate: is_private
1145
+ }
1146
+
1147
+ # API call
1148
+ uri = URI(url)
1149
+ http = Net::HTTP.new(uri.host, uri.port)
1150
+ req = Net::HTTP::Post.new(uri.path, {
1151
+ 'Authorization' => "Bearer #{@client.key_helper.get_valid_token()}",
1152
+ 'Content-Type' => 'application/json'
1153
+ })
1154
+ req.body = payload.to_json
1155
+ res = http.request(req)
1156
+ res.code == "200" ? JSON.parse(res.body)['handleId'] : JSON.parse(res.body)
1157
+ end
1158
+
1159
+ def drop_handle(handle_id)
1160
+ # entry point
1161
+ url = "#{@client.app_info[:launcher_server]}#{API_VERSION}/data-id/#{handle_id}"
1162
+
1163
+ # api call
1164
+ uri = URI(url)
1165
+ http = Net::HTTP.new(uri.host, uri.port)
1166
+ req = Net::HTTP::Delete.new(uri.path, {
1167
+ 'Authorization' => "Bearer #{@client.key_helper.get_valid_token()}"
1168
+ })
1169
+ res = http.request(req)
1170
+ res.code == "200" ? true : JSON.parse(res.body)
737
1171
  end
738
1172
 
739
- def create_from_file(local_path)
740
- id = Digest::SHA2.new(512).file(local_path).hexdigest
741
- @client.sd.create(id, -1, File.read(local_path))
742
- id
1173
+ def serialize(handle_id)
1174
+ # entry point
1175
+ url = "#{@client.app_info[:launcher_server]}#{API_VERSION}/data-id/#{handle_id}"
1176
+
1177
+ # api call
1178
+ uri = URI(url)
1179
+ http = Net::HTTP.new(uri.host, uri.port)
1180
+ req = Net::HTTP::Get.new(uri.path, {
1181
+ 'Authorization' => "Bearer #{@client.key_helper.get_valid_token()}"
1182
+ })
1183
+ res = http.request(req)
1184
+ res.code == "200" ? res.body : JSON.parse(res.body)
743
1185
  end
744
1186
 
745
- def get(id)
746
- @client.sd.get(id, -1)
1187
+ def deserialize(contents)
1188
+ # entry point
1189
+ url = "#{@client.app_info[:launcher_server]}#{API_VERSION}/data-id"
1190
+
1191
+ # api call
1192
+ uri = URI(url)
1193
+ http = Net::HTTP.new(uri.host, uri.port)
1194
+ headers = {
1195
+ 'Authorization' => "Bearer #{@client.key_helper.get_valid_token()}",
1196
+ 'Content-Type': 'text/plain'
1197
+ }
1198
+ headers["Content-Length"] = contents.size.to_s
1199
+ req = Net::HTTP::Post.new(uri.path, headers)
1200
+ req.body = contents
1201
+ res = http.request(req)
1202
+ res.code == "200" ? JSON.parse(res.body)['handleId'] : JSON.parse(res.body)
747
1203
  end
1204
+
1205
+ end
1206
+
1207
+ def self.s2h(str)
1208
+ # Digest::SHA2.new(256).hexdigest(str)
1209
+ Digest::SHA2.new(256).base64digest(str)
748
1210
  end
749
1211
  end
@@ -1,3 +1,3 @@
1
1
  module Safenet
2
- VERSION = "0.2.4"
2
+ VERSION = "0.5.1"
3
3
  end
data/ruby-safenet.gemspec CHANGED
@@ -8,8 +8,9 @@ Gem::Specification.new do |spec|
8
8
  spec.version = Safenet::VERSION
9
9
  spec.authors = ["Daniel Loureiro"]
10
10
  spec.email = ["loureirorg@gmail.com"]
11
+ spec.licenses = ['CC0-1.0']
11
12
 
12
- spec.summary = %q{Ruby library for accessing the SAFE network}
13
+ spec.summary = %q{Ruby wrapper for the SAFE network}
13
14
  spec.description = %q{Ruby library for accessing the SAFE network}
14
15
  spec.homepage = "https://github.com/loureirorg/ruby-safenet"
15
16
 
@@ -28,4 +29,5 @@ Gem::Specification.new do |spec|
28
29
 
29
30
  spec.add_development_dependency "bundler", "~> 1.10"
30
31
  spec.add_development_dependency "rake", "~> 10.0"
32
+ spec.add_development_dependency "rspec", "~> 3.0"
31
33
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-safenet
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Loureiro
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-08-14 00:00:00.000000000 Z
11
+ date: 2017-02-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
41
55
  description: Ruby library for accessing the SAFE network
42
56
  email:
43
57
  - loureirorg@gmail.com
@@ -48,6 +62,7 @@ files:
48
62
  - ".gitignore"
49
63
  - ".travis.yml"
50
64
  - Gemfile
65
+ - LICENSE
51
66
  - README.md
52
67
  - Rakefile
53
68
  - bin/console
@@ -56,7 +71,8 @@ files:
56
71
  - lib/safenet/version.rb
57
72
  - ruby-safenet.gemspec
58
73
  homepage: https://github.com/loureirorg/ruby-safenet
59
- licenses: []
74
+ licenses:
75
+ - CC0-1.0
60
76
  metadata: {}
61
77
  post_install_message:
62
78
  rdoc_options: []
@@ -77,5 +93,5 @@ rubyforge_project:
77
93
  rubygems_version: 2.5.1
78
94
  signing_key:
79
95
  specification_version: 4
80
- summary: Ruby library for accessing the SAFE network
96
+ summary: Ruby wrapper for the SAFE network
81
97
  test_files: []