zold-score 0.2.2 → 0.3.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 +4 -4
- data/.gitignore +2 -0
- data/.travis.yml +2 -0
- data/Rakefile +6 -1
- data/appveyor.yml +3 -2
- data/ext/score_suffix/ScoreSuffix.cpp +128 -0
- data/ext/score_suffix/extconf.rb +33 -0
- data/lib/zold/score.rb +10 -15
- data/zold-score.gemspec +2 -1
- metadata +18 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 633fc21de75740f2a881f83a3316a8c487e4c961869cd1b2fd06914e77672a03
|
4
|
+
data.tar.gz: 83382113630773e7b161fdac29130a6e4a8eaec9621ed5b793a1769e9b2981a2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 114608fa7b37a278418bb7a0ea3e5a157c21dbca65a992da76c9857c94ec6eb31fe22b2f5c0fdd2e2a3f2762fd46d4274d2f28e6a495cd06543a5f2b82ffc1f4
|
7
|
+
data.tar.gz: e0b5ab868f2a2e9505051a0c2b5aecb082c8ff8372ca491d51b12370b9c5d25a393a486d6230ac4ca6f0c869e0adfeba08d58eac880dc8d110853354fa846c2e
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
@@ -9,8 +9,10 @@ branches:
|
|
9
9
|
install:
|
10
10
|
- travis_retry bundle update
|
11
11
|
- gem install pdd
|
12
|
+
- sudo apt-get install cppcheck
|
12
13
|
script:
|
13
14
|
- pdd -f /dev/null
|
15
|
+
- cppcheck --enable=all --quiet --suppress=unusedFunction .
|
14
16
|
- export RUBYOPT="-W0"
|
15
17
|
- rake --quiet
|
16
18
|
after_success:
|
data/Rakefile
CHANGED
@@ -33,7 +33,12 @@ def version
|
|
33
33
|
Gem::Specification.load(Dir['*.gemspec'].first).version
|
34
34
|
end
|
35
35
|
|
36
|
-
task default: %i[clean test rubocop copyright]
|
36
|
+
task default: %i[clean compile test rubocop copyright]
|
37
|
+
|
38
|
+
require 'rake/extensiontask'
|
39
|
+
Rake::ExtensionTask.new 'score_suffix' do |ext|
|
40
|
+
ext.lib_dir = 'lib/score_suffix'
|
41
|
+
end
|
37
42
|
|
38
43
|
require 'rake/testtask'
|
39
44
|
desc 'Run all unit tests'
|
data/appveyor.yml
CHANGED
@@ -8,13 +8,14 @@ branches:
|
|
8
8
|
- gh-pages
|
9
9
|
os: Windows Server 2012
|
10
10
|
environment:
|
11
|
+
MAKE: mingw32-make
|
11
12
|
matrix:
|
12
13
|
- ruby_version: "23-x64"
|
13
14
|
- ruby_version: "24-x64"
|
14
15
|
- ruby_version: "25-x64"
|
15
16
|
install:
|
16
17
|
- ps: |
|
17
|
-
$Env:PATH = "C:\Ruby${Env:ruby_version}\bin;${Env:PATH}"
|
18
|
+
$Env:PATH = "C:\Ruby${Env:ruby_version}\bin;C:\msys64\mingw64\bin;${Env:PATH}"
|
18
19
|
if ($Env:ruby_version -match "^23" ) {
|
19
20
|
# RubyInstaller; download OpenSSL headers from OpenKnapsack Project
|
20
21
|
$Env:openssl_dir = "C:\Ruby${Env:ruby_version}"
|
@@ -33,6 +34,6 @@ build_script:
|
|
33
34
|
- bundle update
|
34
35
|
- bundle install
|
35
36
|
test_script:
|
36
|
-
- bundle exec rake --
|
37
|
+
- bundle exec rake --trace
|
37
38
|
cache:
|
38
39
|
- vendor/bundle
|
@@ -0,0 +1,128 @@
|
|
1
|
+
// Copyright (c) 2018 Yegor Bugayenko
|
2
|
+
//
|
3
|
+
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
// of this software and associated documentation files (the 'Software'), to deal
|
5
|
+
// in the Software without restriction, including without limitation the rights
|
6
|
+
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
// copies of the Software, and to permit persons to whom the Software is
|
8
|
+
// furnished to do so, subject to the following conditions:
|
9
|
+
//
|
10
|
+
// The above copyright notice and this permission notice shall be included in
|
11
|
+
// all copies or substantial portions of the Software.
|
12
|
+
//
|
13
|
+
// THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
19
|
+
// SOFTWARE.
|
20
|
+
|
21
|
+
#include <array>
|
22
|
+
#include <random>
|
23
|
+
#include <vector>
|
24
|
+
#include <openssl/sha.h>
|
25
|
+
#include <ruby.h>
|
26
|
+
|
27
|
+
using namespace std;
|
28
|
+
|
29
|
+
static
|
30
|
+
array<uint8_t, SHA256_DIGEST_LENGTH> sha256(const string &string)
|
31
|
+
{
|
32
|
+
SHA256_CTX ctx;
|
33
|
+
SHA256_Init(&ctx);
|
34
|
+
SHA256_Update(&ctx, string.data(), string.size());
|
35
|
+
array<uint8_t, SHA256_DIGEST_LENGTH> hash;
|
36
|
+
SHA256_Final(&hash[0], &ctx);
|
37
|
+
return hash;
|
38
|
+
}
|
39
|
+
|
40
|
+
static
|
41
|
+
bool check_hash(const array<uint8_t, SHA256_DIGEST_LENGTH> &hash, int strength)
|
42
|
+
{
|
43
|
+
int current_strength = 0;
|
44
|
+
const auto rend = hash.rend();
|
45
|
+
for (auto h = hash.rbegin(); h != rend; ++h) {
|
46
|
+
if ((*h & 0x0f) != 0) {
|
47
|
+
break;
|
48
|
+
}
|
49
|
+
current_strength += (*h == 0) ? 2 : 1;
|
50
|
+
if (*h != 0) {
|
51
|
+
break;
|
52
|
+
}
|
53
|
+
}
|
54
|
+
return current_strength >= strength;
|
55
|
+
}
|
56
|
+
|
57
|
+
static
|
58
|
+
string create_nonce(uint64_t i)
|
59
|
+
{
|
60
|
+
const string chars =
|
61
|
+
"0123456789"
|
62
|
+
"abcdefghijklmnopqrstuvwxyz"
|
63
|
+
"ABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
64
|
+
|
65
|
+
string rv;
|
66
|
+
for (int l = 0; l < 6; l++) { // Cut to 6 sym
|
67
|
+
rv += chars[i % chars.size()];
|
68
|
+
if (i < chars.size()) {
|
69
|
+
break;
|
70
|
+
}
|
71
|
+
i /= chars.size();
|
72
|
+
}
|
73
|
+
return {rv.rbegin(), rv.rend()};
|
74
|
+
}
|
75
|
+
|
76
|
+
static
|
77
|
+
string index(const string &prefix, int strength)
|
78
|
+
{
|
79
|
+
mt19937_64 random(uint64_t(time(nullptr)));
|
80
|
+
|
81
|
+
for (uint64_t i = random(); ; i++) {
|
82
|
+
const auto hash = sha256(prefix + " " + create_nonce(i));
|
83
|
+
if (check_hash(hash, strength)) {
|
84
|
+
return create_nonce(i);
|
85
|
+
}
|
86
|
+
}
|
87
|
+
}
|
88
|
+
|
89
|
+
static
|
90
|
+
VALUE ScoreSuffix_initialize(VALUE self, VALUE prefix, VALUE strength)
|
91
|
+
{
|
92
|
+
rb_iv_set(self, "@prefix", prefix);
|
93
|
+
rb_iv_set(self, "@strength", strength);
|
94
|
+
return self;
|
95
|
+
}
|
96
|
+
|
97
|
+
static
|
98
|
+
VALUE ScoreSuffix_value(VALUE self)
|
99
|
+
{
|
100
|
+
auto prefix_value = rb_iv_get(self, "@prefix");
|
101
|
+
const string prefix = StringValuePtr(prefix_value);
|
102
|
+
const int strength = NUM2INT(rb_iv_get(self, "@strength"));
|
103
|
+
const auto nonce = index(prefix, strength);
|
104
|
+
return rb_str_new2(nonce.c_str());
|
105
|
+
}
|
106
|
+
|
107
|
+
extern "C"
|
108
|
+
void Init_score_suffix()
|
109
|
+
{
|
110
|
+
VALUE module = rb_define_module("Zold");
|
111
|
+
VALUE score_suffix = rb_define_class_under(
|
112
|
+
module,
|
113
|
+
"ScoreSuffix",
|
114
|
+
rb_cObject
|
115
|
+
);
|
116
|
+
rb_define_method(
|
117
|
+
score_suffix,
|
118
|
+
"initialize",
|
119
|
+
reinterpret_cast<VALUE(*)(...)>(ScoreSuffix_initialize),
|
120
|
+
2
|
121
|
+
);
|
122
|
+
rb_define_method(
|
123
|
+
score_suffix,
|
124
|
+
"value",
|
125
|
+
reinterpret_cast<VALUE(*)(...)>(ScoreSuffix_value),
|
126
|
+
0
|
127
|
+
);
|
128
|
+
}
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright (c) 2018 Yegor Bugayenko
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
# of this software and associated documentation files (the 'Software'), to deal
|
7
|
+
# in the Software without restriction, including without limitation the rights
|
8
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
# copies of the Software, and to permit persons to whom the Software is
|
10
|
+
# furnished to do so, subject to the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be included in all
|
13
|
+
# copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
# SOFTWARE.
|
22
|
+
|
23
|
+
require 'mkmf'
|
24
|
+
|
25
|
+
# rubocop:disable Style/GlobalVars
|
26
|
+
$warnflags = ''
|
27
|
+
$CXXFLAGS << ' -std=c++11'
|
28
|
+
$CXXFLAGS.gsub!(/-Wimplicit-int/, '')
|
29
|
+
$CXXFLAGS.gsub!(/-Wdeclaration-after-statement/, '')
|
30
|
+
$CXXFLAGS.gsub!(/-Wimplicit-function-declaration/, '')
|
31
|
+
# rubocop:enable Style/GlobalVars
|
32
|
+
|
33
|
+
create_makefile 'score_suffix/score_suffix'
|
data/lib/zold/score.rb
CHANGED
@@ -21,6 +21,7 @@
|
|
21
21
|
# SOFTWARE.
|
22
22
|
|
23
23
|
require 'openssl'
|
24
|
+
require 'score_suffix/score_suffix'
|
24
25
|
require 'time'
|
25
26
|
|
26
27
|
# Zold score.
|
@@ -188,23 +189,17 @@ module Zold
|
|
188
189
|
# on the CPU power and the <tt>strength</tt> of the current score.
|
189
190
|
def next
|
190
191
|
raise 'This score is not valid' unless valid?
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
time: @time, host: @host, port: @port,
|
196
|
-
invoice: @invoice, suffixes: @suffixes + [suffix],
|
197
|
-
strength: @strength
|
192
|
+
if expired?
|
193
|
+
return Score.new(
|
194
|
+
time: Time.now, host: @host, port: @port, invoice: @invoice,
|
195
|
+
suffixes: [], strength: @strength
|
198
196
|
)
|
199
|
-
return score if score.valid?
|
200
|
-
if score.expired?
|
201
|
-
return Score.new(
|
202
|
-
time: Time.now, host: @host, port: @port, invoice: @invoice,
|
203
|
-
suffixes: [], strength: @strength
|
204
|
-
)
|
205
|
-
end
|
206
|
-
idx += 1
|
207
197
|
end
|
198
|
+
suffix = ScoreSuffix.new(suffixes.empty? ? prefix : hash, @strength)
|
199
|
+
Score.new(
|
200
|
+
time: @time, host: @host, port: @port, invoice: @invoice,
|
201
|
+
suffixes: @suffixes + [suffix.value], strength: @strength
|
202
|
+
)
|
208
203
|
end
|
209
204
|
|
210
205
|
# The age of the score in seconds.
|
data/zold-score.gemspec
CHANGED
@@ -27,7 +27,7 @@ Gem::Specification.new do |s|
|
|
27
27
|
s.rubygems_version = '2.2'
|
28
28
|
s.required_ruby_version = '>=2.3'
|
29
29
|
s.name = 'zold-score'
|
30
|
-
s.version = '0.
|
30
|
+
s.version = '0.3.0'
|
31
31
|
s.license = 'MIT'
|
32
32
|
s.summary = 'Zold score'
|
33
33
|
s.description = 'Score calculating Ruby Gem for Zold'
|
@@ -41,6 +41,7 @@ Gem::Specification.new do |s|
|
|
41
41
|
s.extra_rdoc_files = ['README.md', 'LICENSE.txt']
|
42
42
|
s.add_development_dependency 'codecov', '~>0'
|
43
43
|
s.add_development_dependency 'minitest', '~>5'
|
44
|
+
s.add_development_dependency 'rake-compiler', '~>1.0.4'
|
44
45
|
s.add_development_dependency 'rdoc', '~>4'
|
45
46
|
s.add_development_dependency 'rspec-rails', '~>3'
|
46
47
|
s.add_development_dependency 'rubocop', '0.58.1'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zold-score
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yegor Bugayenko
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-11-
|
11
|
+
date: 2018-11-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: codecov
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '5'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake-compiler
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 1.0.4
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.0.4
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: rdoc
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -115,6 +129,8 @@ files:
|
|
115
129
|
- README.md
|
116
130
|
- Rakefile
|
117
131
|
- appveyor.yml
|
132
|
+
- ext/score_suffix/ScoreSuffix.cpp
|
133
|
+
- ext/score_suffix/extconf.rb
|
118
134
|
- lib/zold/score.rb
|
119
135
|
- test/zold/test_score.rb
|
120
136
|
- zold-score.gemspec
|