ndr_support 5.1.0 → 5.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +4 -0
- data/.rubocop.yml +1 -29
- data/README.md +2 -1
- data/code_safety.yml +21 -13
- data/lib/ndr_support.rb +1 -0
- data/lib/ndr_support/password.rb +121 -0
- data/lib/ndr_support/password/constants.rb +126 -0
- data/lib/ndr_support/version.rb +1 -1
- data/ndr_support.gemspec +1 -1
- data/test/password_test.rb +129 -0
- data/test/string/conversions_test.rb +3 -3
- metadata +8 -11
- data/.hound.yml +0 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 609a55a5903e1a1920b0870cb6338be2d3ce9d47
|
4
|
+
data.tar.gz: 15adfab49032115e4693bcbaace8b8d46837911b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f2270a5b0d7a368945b7276e92a0297a0ea6dacad884a85eefee2e565bac5079fdd92d85ab68e625bb5debb6626c242c050a27613e85dd46f3770f954b95b196
|
7
|
+
data.tar.gz: ac102ce2887029107c2d5adad88fbdb04df9ecc7eeb6698fc206a6abe982f807edc7715e9bab620bf955d90be439d76f8b8669ebf9eab0d74db0e75f12702c34
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
@@ -1,29 +1 @@
|
|
1
|
-
|
2
|
-
Enabled: true
|
3
|
-
|
4
|
-
# Multi-line method chaining should be done with trailing dots.
|
5
|
-
Style/DotPosition:
|
6
|
-
EnforcedStyle: trailing
|
7
|
-
|
8
|
-
# By default, would enforce { key: value } rather than { :key => value }.
|
9
|
-
HashSyntax:
|
10
|
-
EnforcedStyle: hash_rockets
|
11
|
-
SupportedStyles:
|
12
|
-
- ruby19
|
13
|
-
- hash_rockets
|
14
|
-
|
15
|
-
# Would enforce "-> { }", which we cannot use yet.
|
16
|
-
Lambda:
|
17
|
-
Enabled: false
|
18
|
-
|
19
|
-
# ...
|
20
|
-
LineLength:
|
21
|
-
Max: 99
|
22
|
-
|
23
|
-
# Relax some of the cops for tests
|
24
|
-
Metrics/ClassLength:
|
25
|
-
Exclude:
|
26
|
-
- test/**/*.rb
|
27
|
-
Metrics/MethodLength:
|
28
|
-
Exclude:
|
29
|
-
- test/**/*.rb
|
1
|
+
inherit_from: 'https://raw.githubusercontent.com/PublicHealthEngland/ndr_dev_support/master/.rubocop.yml'
|
data/README.md
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
This is the Public Health England (PHE) National Disease Registers (NDR) Support ruby gem, providing:
|
4
4
|
|
5
5
|
1. core ruby class extensions;
|
6
|
-
2. additional time, regular expression, file security and encoding classes.
|
6
|
+
2. additional time, regular expression, file security, password checking/generation, and encoding classes.
|
7
7
|
|
8
8
|
## Installation
|
9
9
|
|
@@ -36,6 +36,7 @@ ndr_support extends/overrides the following core classes/modules:
|
|
36
36
|
ndr_support adds the following classes:
|
37
37
|
|
38
38
|
- Daterange
|
39
|
+
- NdrSupport::Password
|
39
40
|
- Ourdate
|
40
41
|
- Ourtime
|
41
42
|
- RegexpRange
|
data/code_safety.yml
CHANGED
@@ -3,15 +3,11 @@ file safety:
|
|
3
3
|
".gitignore":
|
4
4
|
comments:
|
5
5
|
reviewed_by: josh.pencheon
|
6
|
-
safe_revision:
|
7
|
-
".hound.yml":
|
8
|
-
comments:
|
9
|
-
reviewed_by: timgentry
|
10
|
-
safe_revision: 9605fa85dca3d70c85927d3f1f5818c20ad922f0
|
6
|
+
safe_revision: a02f14cbf1fc36fbaf820365fdedfdc9af326db1
|
11
7
|
".rubocop.yml":
|
12
8
|
comments:
|
13
|
-
reviewed_by:
|
14
|
-
safe_revision:
|
9
|
+
reviewed_by: josh.pencheon
|
10
|
+
safe_revision: a02f14cbf1fc36fbaf820365fdedfdc9af326db1
|
15
11
|
".travis.yml":
|
16
12
|
comments: diff failed; reviewed whole file
|
17
13
|
reviewed_by: josh.pencheon
|
@@ -35,7 +31,7 @@ file safety:
|
|
35
31
|
README.md:
|
36
32
|
comments:
|
37
33
|
reviewed_by: josh.pencheon
|
38
|
-
safe_revision:
|
34
|
+
safe_revision: 799d9fe4d76759958926c0385fc7f5d8e405d0d0
|
39
35
|
Rakefile:
|
40
36
|
comments:
|
41
37
|
reviewed_by: timgentry
|
@@ -59,7 +55,7 @@ file safety:
|
|
59
55
|
lib/ndr_support.rb:
|
60
56
|
comments:
|
61
57
|
reviewed_by: josh.pencheon
|
62
|
-
safe_revision:
|
58
|
+
safe_revision: f5d1ba50d378286c0541f300d73844240e2eb7c1
|
63
59
|
lib/ndr_support/array.rb:
|
64
60
|
comments:
|
65
61
|
reviewed_by: pauleves
|
@@ -104,6 +100,14 @@ file safety:
|
|
104
100
|
comments:
|
105
101
|
reviewed_by: pauleves
|
106
102
|
safe_revision: 4a4ed24d2cfe7e1736baadf4cf6e0fece6823be1
|
103
|
+
lib/ndr_support/password.rb:
|
104
|
+
comments: with input from brian.shand
|
105
|
+
reviewed_by: josh.pencheon
|
106
|
+
safe_revision: f5d1ba50d378286c0541f300d73844240e2eb7c1
|
107
|
+
lib/ndr_support/password/constants.rb:
|
108
|
+
comments: with input from brian.shand
|
109
|
+
reviewed_by: josh.pencheon
|
110
|
+
safe_revision: f5d1ba50d378286c0541f300d73844240e2eb7c1
|
107
111
|
lib/ndr_support/regexp_range.rb:
|
108
112
|
comments:
|
109
113
|
reviewed_by: pauleves
|
@@ -147,7 +151,7 @@ file safety:
|
|
147
151
|
lib/ndr_support/version.rb:
|
148
152
|
comments:
|
149
153
|
reviewed_by: josh.pencheon
|
150
|
-
safe_revision:
|
154
|
+
safe_revision: 802eaa1206e0f179d403aa46c7826b1d4ab7b369
|
151
155
|
lib/ndr_support/yaml/serialization_migration.rb:
|
152
156
|
comments:
|
153
157
|
reviewed_by: timgentry
|
@@ -155,7 +159,7 @@ file safety:
|
|
155
159
|
ndr_support.gemspec:
|
156
160
|
comments:
|
157
161
|
reviewed_by: josh.pencheon
|
158
|
-
safe_revision:
|
162
|
+
safe_revision: 7e4f3d4ea1befdf75533b92415f74c9afaca04a3
|
159
163
|
test/array_test.rb:
|
160
164
|
comments:
|
161
165
|
reviewed_by: timgentry
|
@@ -192,6 +196,10 @@ file safety:
|
|
192
196
|
comments:
|
193
197
|
reviewed_by: timgentry
|
194
198
|
safe_revision: 2a5d30674dc9dde336e1dbbbf3c8a98905647432
|
199
|
+
test/password_test.rb:
|
200
|
+
comments: with input from brian.shand
|
201
|
+
reviewed_by: josh.pencheon
|
202
|
+
safe_revision: f5d1ba50d378286c0541f300d73844240e2eb7c1
|
195
203
|
test/regexp_range_test.rb:
|
196
204
|
comments:
|
197
205
|
reviewed_by: timgentry
|
@@ -214,8 +222,8 @@ file safety:
|
|
214
222
|
safe_revision: d30717902e767bd63a35c0482b9a3ee52b0cdc73
|
215
223
|
test/string/conversions_test.rb:
|
216
224
|
comments:
|
217
|
-
reviewed_by:
|
218
|
-
safe_revision:
|
225
|
+
reviewed_by: josh.pencheon
|
226
|
+
safe_revision: dfb7d1b94fc4d1578ab2129096945d5d1a1094fe
|
219
227
|
test/test_helper.rb:
|
220
228
|
comments:
|
221
229
|
reviewed_by: timgentry
|
data/lib/ndr_support.rb
CHANGED
@@ -0,0 +1,121 @@
|
|
1
|
+
require 'ndr_support/password/constants'
|
2
|
+
|
3
|
+
module NdrSupport
|
4
|
+
# Contains logic for checking and generating secure passwords,
|
5
|
+
# in line with CESG guidelines.
|
6
|
+
module Password
|
7
|
+
include Constants
|
8
|
+
|
9
|
+
extend self
|
10
|
+
|
11
|
+
# Is the given `string` deemed a good password?
|
12
|
+
# An additional `word_list` can be provided; its entries add only
|
13
|
+
# minimally when considering the strength of `string`.
|
14
|
+
#
|
15
|
+
# NdrSupport::Password.valid?('google password') #=> false
|
16
|
+
# NdrSupport::Password.valid?(SecureRandom.hex(12)) #=> true
|
17
|
+
#
|
18
|
+
def valid?(string, word_list: [])
|
19
|
+
string = prepare_string(string.to_s.dup)
|
20
|
+
slug = slugify(strip_common_words(string, word_list))
|
21
|
+
|
22
|
+
meets_requirements?(slug)
|
23
|
+
end
|
24
|
+
|
25
|
+
# Generates a random #valid? password, using the 2048-word RFC1751 dictionary.
|
26
|
+
# Optionally, specify `number_of_words` and/or `separator`.
|
27
|
+
#
|
28
|
+
# NdrSupport::Password.generate #=> "sill quod okay phi"
|
29
|
+
# NdrSupport::Password.generate #=> "dint dale pew wane"
|
30
|
+
# NdrSupport::Password.generate #=> "rent jude ding gent"
|
31
|
+
#
|
32
|
+
# NdrSupport::Password.generate(number_of_words: 6) #=> "dad bide thee glen road beam"
|
33
|
+
#
|
34
|
+
# NdrSupport::Password.generate(separator: '-') #=> "jail-net-skim-cup"
|
35
|
+
#
|
36
|
+
# Raises a RuntimeError if a strong enough password was not produced:
|
37
|
+
#
|
38
|
+
# NdrSupport::Password.generate(number_of_words: 1) #=>
|
39
|
+
# RuntimeError: Failed to generate a #valid? password!
|
40
|
+
#
|
41
|
+
def generate(number_of_words: 4, separator: ' ')
|
42
|
+
attempts = 0
|
43
|
+
|
44
|
+
loop do
|
45
|
+
words = Array.new(number_of_words) do
|
46
|
+
RFC1751_WORDS[SecureRandom.random_number(RFC1751_WORDS.length)].downcase
|
47
|
+
end
|
48
|
+
|
49
|
+
phrase = words.join(separator)
|
50
|
+
return phrase if valid?(phrase)
|
51
|
+
|
52
|
+
attempts += 1
|
53
|
+
raise 'Failed to generate a #valid? password!' if attempts > 10
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
def meets_requirements?(string)
|
60
|
+
string.length >= 6 && string.chars.uniq.length >= 5
|
61
|
+
end
|
62
|
+
|
63
|
+
def strip_common_words(string, common_words)
|
64
|
+
common_words += COMMON_PASSWORDS
|
65
|
+
|
66
|
+
# Try the longest common words first, in case some are substrings of others:
|
67
|
+
common_words = common_words.sort_by(&:length).reverse
|
68
|
+
|
69
|
+
common_words.each do |common_word|
|
70
|
+
pattern = prepare_string(common_word)
|
71
|
+
|
72
|
+
# Don't try to remove things that #slugify will be able to remove
|
73
|
+
# at least as effectively: [#6950#note-12]
|
74
|
+
next if slugify(pattern).length <= 2
|
75
|
+
|
76
|
+
string.gsub!(pattern) { |word| word.chars.first + word.chars.last }
|
77
|
+
end
|
78
|
+
|
79
|
+
string
|
80
|
+
end
|
81
|
+
|
82
|
+
def slugify(string)
|
83
|
+
input = string.chars
|
84
|
+
output = []
|
85
|
+
|
86
|
+
until input.length.zero?
|
87
|
+
sequence = [input.shift]
|
88
|
+
sequence << input.shift while input.any? && no_added_value?(sequence.last, input.first)
|
89
|
+
|
90
|
+
sequence.slice!(1..-2) # discard interior of sequence
|
91
|
+
output.concat(sequence.uniq)
|
92
|
+
end
|
93
|
+
|
94
|
+
output.join
|
95
|
+
end
|
96
|
+
|
97
|
+
def no_added_value?(a, b)
|
98
|
+
sequential?(a, b) || repeating?(a, b)
|
99
|
+
end
|
100
|
+
|
101
|
+
def repeating?(a, b)
|
102
|
+
a == b
|
103
|
+
end
|
104
|
+
|
105
|
+
def sequential?(a, b, check_inverse: true)
|
106
|
+
# avoid non-alphanumeric characters being considered for sequencing:
|
107
|
+
# ';'.next #=> '<'
|
108
|
+
return false unless sequencible?(a) && sequencible?(b)
|
109
|
+
|
110
|
+
(a.next == b && b.length == 1) || (check_inverse && sequential?(b, a, check_inverse: false))
|
111
|
+
end
|
112
|
+
|
113
|
+
def sequencible?(string)
|
114
|
+
/\A([a-z]|[0-9])\z/i =~ string
|
115
|
+
end
|
116
|
+
|
117
|
+
def prepare_string(string)
|
118
|
+
string.downcase
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
@@ -0,0 +1,126 @@
|
|
1
|
+
module NdrSupport
|
2
|
+
module Password
|
3
|
+
# Static lookups for password checking / generation
|
4
|
+
module Constants
|
5
|
+
COMMON_PASSWORDS = %w(
|
6
|
+
123456 123456789 qwerty 12345678 111111 1234567890 1234567 password
|
7
|
+
123123 987654321 qwertyuiop mynoob 123321 666666 18atcskd2w 7777777
|
8
|
+
1q2w3e4r 654321 555555 3rjs1la7qe google 1q2w3e4r5t 123qwe zxcvbnm
|
9
|
+
).freeze
|
10
|
+
|
11
|
+
RFC1751_WORDS = %w(
|
12
|
+
A ABE ACE ACT AD ADA ADD AGO AID AIM AIR ALL ALP AM AMY AN ANA
|
13
|
+
AND ANN ANT ANY APE APS APT ARC ARE ARK ARM ART AS ASH ASK AT ATE AUG AUK AVE
|
14
|
+
AWE AWK AWL AWN AX AYE BAD BAG BAH BAM BAN BAR BAT BAY BE BED BEE BEG BEN BET
|
15
|
+
BEY BIB BID BIG BIN BIT BOB BOG BON BOO BOP BOW BOY BUB BUD BUG BUM BUN BUS BUT
|
16
|
+
BUY BY BYE CAB CAL CAM CAN CAP CAR CAT CAW COD COG COL CON COO COP COT COW COY
|
17
|
+
CRY CUB CUE CUP CUR CUT DAB DAD DAM DAN DAR DAY DEE DEL DEN DES DEW DID DIE DIG
|
18
|
+
DIN DIP DO DOE DOG DON DOT DOW DRY DUB DUD DUE DUG DUN EAR EAT ED EEL EGG EGO
|
19
|
+
ELI ELK ELM ELY EM END EST ETC EVA EVE EWE EYE FAD FAN FAR FAT FAY FED FEE FEW
|
20
|
+
FIB FIG FIN FIR FIT FLO FLY FOE FOG FOR FRY FUM FUN FUR GAB GAD GAG GAL GAM GAP
|
21
|
+
GAS GAY GEE GEL GEM GET GIG GIL GIN GO GOT GUM GUN GUS GUT GUY GYM GYP HA HAD
|
22
|
+
HAL HAM HAN HAP HAS HAT HAW HAY HE HEM HEN HER HEW HEY HI HID HIM HIP HIS HIT
|
23
|
+
HO HOB HOC HOE HOG HOP HOT HOW HUB HUE HUG HUH HUM HUT I ICY IDA IF IKE ILL
|
24
|
+
INK INN IO ION IQ IRA IRE IRK IS IT ITS IVY JAB JAG JAM JAN JAR JAW JAY JET JIG
|
25
|
+
JIM JO JOB JOE JOG JOT JOY JUG JUT KAY KEG KEN KEY KID KIM KIN KIT LA LAB LAC
|
26
|
+
LAD LAG LAM LAP LAW LAY LEA LED LEE LEG LEN LEO LET LEW LID LIE LIN LIP LIT LO
|
27
|
+
LOB LOG LOP LOS LOT LOU LOW LOY LUG LYE MA MAC MAD MAE MAN MAO MAP MAT MAW MAY
|
28
|
+
ME MEG MEL MEN MET MEW MID MIN MIT MOB MOD MOE MOO MOP MOS MOT MOW MUD MUG MUM
|
29
|
+
MY NAB NAG NAN NAP NAT NAY NE NED NEE NET NEW NIB NIL NIP NIT NO NOB NOD NON
|
30
|
+
NOR NOT NOV NOW NU NUN NUT O OAF OAK OAR OAT ODD ODE OF OFF OFT OH OIL OK
|
31
|
+
OLD ON ONE OR ORB ORE ORR OS OTT OUR OUT OVA OW OWE OWL OWN OX PA PAD PAL
|
32
|
+
PAM PAN PAP PAR PAT PAW PAY PEA PEG PEN PEP PER PET PEW PHI PI PIE PIN PIT PLY
|
33
|
+
PO POD POE POP POT POW PRO PRY PUB PUG PUN PUP PUT QUO RAG RAM RAN RAP RAT RAW
|
34
|
+
RAY REB RED REP RET RIB RID RIG RIM RIO RIP ROB ROD ROE RON ROT ROW ROY RUB RUE
|
35
|
+
RUG RUM RUN RYE SAC SAD SAG SAL SAM SAN SAP SAT SAW SAY SEA SEC SEE SEN SET SEW
|
36
|
+
SHE SHY SIN SIP SIR SIS SIT SKI SKY SLY SO SOB SOD SON SOP SOW SOY SPA SPY SUB
|
37
|
+
SUD SUE SUM SUN SUP TAB TAD TAG TAN TAP TAR TEA TED TEE TEN THE THY TIC TIE TIM
|
38
|
+
TIN TIP TO TOE TOG TOM TON TOO TOP TOW TOY TRY TUB TUG TUM TUN TWO UN UP US
|
39
|
+
USE VAN VAT VET VIE WAD WAG WAR WAS WAY WE WEB WED WEE WET WHO WHY WIN WIT WOK
|
40
|
+
WON WOO WOW WRY WU YAM YAP YAW YE YEA YES YET YOU ABED ABEL ABET ABLE ABUT ACHE
|
41
|
+
ACID ACME ACRE ACTA ACTS ADAM ADDS ADEN AFAR AFRO AGEE AHEM AHOY AIDA AIDE AIDS AIRY AJAR
|
42
|
+
AKIN ALAN ALEC ALGA ALIA ALLY ALMA ALOE ALSO ALTO ALUM ALVA AMEN AMES AMID AMMO AMOK AMOS
|
43
|
+
AMRA ANDY ANEW ANNA ANNE ANTE ANTI AQUA ARAB ARCH AREA ARGO ARID ARMY ARTS ARTY ASIA ASKS
|
44
|
+
ATOM AUNT AURA AUTO AVER AVID AVIS AVON AVOW AWAY AWRY BABE BABY BACH BACK BADE BAIL BAIT
|
45
|
+
BAKE BALD BALE BALI BALK BALL BALM BAND BANE BANG BANK BARB BARD BARE BARK BARN BARR BASE
|
46
|
+
BASH BASK BASS BATE BATH BAWD BAWL BEAD BEAK BEAM BEAN BEAR BEAT BEAU BECK BEEF BEEN BEER
|
47
|
+
BEET BELA BELL BELT BEND BENT BERG BERN BERT BESS BEST BETA BETH BHOY BIAS BIDE BIEN BILE
|
48
|
+
BILK BILL BIND BING BIRD BITE BITS BLAB BLAT BLED BLEW BLOB BLOC BLOT BLOW BLUE BLUM BLUR
|
49
|
+
BOAR BOAT BOCA BOCK BODE BODY BOGY BOHR BOIL BOLD BOLO BOLT BOMB BONA BOND BONE BONG BONN
|
50
|
+
BONY BOOK BOOM BOON BOOT BORE BORG BORN BOSE BOSS BOTH BOUT BOWL BOYD BRAD BRAE BRAG BRAN
|
51
|
+
BRAY BRED BREW BRIG BRIM BROW BUCK BUDD BUFF BULB BULK BULL BUNK BUNT BUOY BURG BURL BURN
|
52
|
+
BURR BURT BURY BUSH BUSS BUST BUSY BYTE CADY CAFE CAGE CAIN CAKE CALF CALL CALM CAME CANE
|
53
|
+
CANT CARD CARE CARL CARR CART CASE CASH CASK CAST CAVE CEIL CELL CENT CERN CHAD CHAR CHAT
|
54
|
+
CHAW CHEF CHEN CHEW CHIC CHIN CHOU CHOW CHUB CHUG CHUM CITE CITY CLAD CLAM CLAN CLAW CLAY
|
55
|
+
CLOD CLOG CLOT CLUB CLUE COAL COAT COCA COCK COCO CODA CODE CODY COED COIL COIN COKE COLA
|
56
|
+
COLD COLT COMA COMB COME COOK COOL COON COOT CORD CORE CORK CORN COST COVE COWL CRAB CRAG
|
57
|
+
CRAM CRAY CREW CRIB CROW CRUD CUBA CUBE CUFF CULL CULT CUNY CURB CURD CURE CURL CURT CUTS
|
58
|
+
DADE DALE DAME DANA DANE DANG DANK DARE DARK DARN DART DASH DATA DATE DAVE DAVY DAWN DAYS
|
59
|
+
DEAD DEAF DEAL DEAN DEAR DEBT DECK DEED DEEM DEER DEFT DEFY DELL DENT DENY DESK DIAL DICE
|
60
|
+
DIED DIET DIME DINE DING DINT DIRE DIRT DISC DISH DISK DIVE DOCK DOES DOLE DOLL DOLT DOME
|
61
|
+
DONE DOOM DOOR DORA DOSE DOTE DOUG DOUR DOVE DOWN DRAB DRAG DRAM DRAW DREW DRUB DRUG DRUM
|
62
|
+
DUAL DUCK DUCT DUEL DUET DUKE DULL DUMB DUNE DUNK DUSK DUST DUTY EACH EARL EARN EASE EAST
|
63
|
+
EASY EBEN ECHO EDDY EDEN EDGE EDGY EDIT EDNA EGAN ELAN ELBA ELLA ELSE EMIL EMIT EMMA ENDS
|
64
|
+
ERIC EROS EVEN EVER EVIL EYED FACE FACT FADE FAIL FAIN FAIR FAKE FALL FAME FANG FARM FAST
|
65
|
+
FATE FAWN FEAR FEAT FEED FEEL FEET FELL FELT FEND FERN FEST FEUD FIEF FIGS FILE FILL FILM
|
66
|
+
FIND FINE FINK FIRE FIRM FISH FISK FIST FITS FIVE FLAG FLAK FLAM FLAT FLAW FLEA FLED FLEW
|
67
|
+
FLIT FLOC FLOG FLOW FLUB FLUE FOAL FOAM FOGY FOIL FOLD FOLK FOND FONT FOOD FOOL FOOT FORD
|
68
|
+
FORE FORK FORM FORT FOSS FOUL FOUR FOWL FRAU FRAY FRED FREE FRET FREY FROG FROM FUEL FULL
|
69
|
+
FUME FUND FUNK FURY FUSE FUSS GAFF GAGE GAIL GAIN GAIT GALA GALE GALL GALT GAME GANG GARB
|
70
|
+
GARY GASH GATE GAUL GAUR GAVE GAWK GEAR GELD GENE GENT GERM GETS GIBE GIFT GILD GILL GILT
|
71
|
+
GINA GIRD GIRL GIST GIVE GLAD GLEE GLEN GLIB GLOB GLOM GLOW GLUE GLUM GLUT GOAD GOAL GOAT
|
72
|
+
GOER GOES GOLD GOLF GONE GONG GOOD GOOF GORE GORY GOSH GOUT GOWN GRAB GRAD GRAY GREG GREW
|
73
|
+
GREY GRID GRIM GRIN GRIT GROW GRUB GULF GULL GUNK GURU GUSH GUST GWEN GWYN HAAG HAAS HACK
|
74
|
+
HAIL HAIR HALE HALF HALL HALO HALT HAND HANG HANK HANS HARD HARK HARM HART HASH HAST HATE
|
75
|
+
HATH HAUL HAVE HAWK HAYS HEAD HEAL HEAR HEAT HEBE HECK HEED HEEL HEFT HELD HELL HELM HERB
|
76
|
+
HERD HERE HERO HERS HESS HEWN HICK HIDE HIGH HIKE HILL HILT HIND HINT HIRE HISS HIVE HOBO
|
77
|
+
HOCK HOFF HOLD HOLE HOLM HOLT HOME HONE HONK HOOD HOOF HOOK HOOT HORN HOSE HOST HOUR HOVE
|
78
|
+
HOWE HOWL HOYT HUCK HUED HUFF HUGE HUGH HUGO HULK HULL HUNK HUNT HURD HURL HURT HUSH HYDE
|
79
|
+
HYMN IBIS ICON IDEA IDLE IFFY INCA INCH INTO IONS IOTA IOWA IRIS IRMA IRON ISLE ITCH ITEM
|
80
|
+
IVAN JACK JADE JAIL JAKE JANE JAVA JEAN JEFF JERK JESS JEST JIBE JILL JILT JIVE JOAN JOBS
|
81
|
+
JOCK JOEL JOEY JOHN JOIN JOKE JOLT JOVE JUDD JUDE JUDO JUDY JUJU JUKE JULY JUNE JUNK JUNO
|
82
|
+
JURY JUST JUTE KAHN KALE KANE KANT KARL KATE KEEL KEEN KENO KENT KERN KERR KEYS KICK KILL
|
83
|
+
KIND KING KIRK KISS KITE KLAN KNEE KNEW KNIT KNOB KNOT KNOW KOCH KONG KUDO KURD KURT KYLE
|
84
|
+
LACE LACK LACY LADY LAID LAIN LAIR LAKE LAMB LAME LAND LANE LANG LARD LARK LASS LAST LATE
|
85
|
+
LAUD LAVA LAWN LAWS LAYS LEAD LEAF LEAK LEAN LEAR LEEK LEER LEFT LEND LENS LENT LEON LESK
|
86
|
+
LESS LEST LETS LIAR LICE LICK LIED LIEN LIES LIEU LIFE LIFT LIKE LILA LILT LILY LIMA LIMB
|
87
|
+
LIME LIND LINE LINK LINT LION LISA LIST LIVE LOAD LOAF LOAM LOAN LOCK LOFT LOGE LOIS LOLA
|
88
|
+
LONE LONG LOOK LOON LOOT LORD LORE LOSE LOSS LOST LOUD LOVE LOWE LUCK LUCY LUGE LUKE LULU
|
89
|
+
LUND LUNG LURA LURE LURK LUSH LUST LYLE LYNN LYON LYRA MACE MADE MAGI MAID MAIL MAIN MAKE
|
90
|
+
MALE MALI MALL MALT MANA MANN MANY MARC MARE MARK MARS MART MARY MASH MASK MASS MAST MATE
|
91
|
+
MATH MAUL MAYO MEAD MEAL MEAN MEAT MEEK MEET MELD MELT MEMO MEND MENU MERT MESH MESS MICE
|
92
|
+
MIKE MILD MILE MILK MILL MILT MIMI MIND MINE MINI MINK MINT MIRE MISS MIST MITE MITT MOAN
|
93
|
+
MOAT MOCK MODE MOLD MOLE MOLL MOLT MONA MONK MONT MOOD MOON MOOR MOOT MORE MORN MORT MOSS
|
94
|
+
MOST MOTH MOVE MUCH MUCK MUDD MUFF MULE MULL MURK MUSH MUST MUTE MUTT MYRA MYTH NAGY NAIL
|
95
|
+
NAIR NAME NARY NASH NAVE NAVY NEAL NEAR NEAT NECK NEED NEIL NELL NEON NERO NESS NEST NEWS
|
96
|
+
NEWT NIBS NICE NICK NILE NINA NINE NOAH NODE NOEL NOLL NONE NOOK NOON NORM NOSE NOTE NOUN
|
97
|
+
NOVA NUDE NULL NUMB OATH OBEY OBOE ODIN OHIO OILY OINT OKAY OLAF OLDY OLGA OLIN OMAN OMEN
|
98
|
+
OMIT ONCE ONES ONLY ONTO ONUS ORAL ORGY OSLO OTIS OTTO OUCH OUST OUTS OVAL OVEN OVER OWLY
|
99
|
+
OWNS QUAD QUIT QUOD RACE RACK RACY RAFT RAGE RAID RAIL RAIN RAKE RANK RANT RARE RASH RATE
|
100
|
+
RAVE RAYS READ REAL REAM REAR RECK REED REEF REEK REEL REID REIN RENA REND RENT REST RICE
|
101
|
+
RICH RICK RIDE RIFT RILL RIME RING RINK RISE RISK RITE ROAD ROAM ROAR ROBE ROCK RODE ROIL
|
102
|
+
ROLL ROME ROOD ROOF ROOK ROOM ROOT ROSA ROSE ROSS ROSY ROTH ROUT ROVE ROWE ROWS RUBE RUBY
|
103
|
+
RUDE RUDY RUIN RULE RUNG RUNS RUNT RUSE RUSH RUSK RUSS RUST RUTH SACK SAFE SAGE SAID SAIL
|
104
|
+
SALE SALK SALT SAME SAND SANE SANG SANK SARA SAUL SAVE SAYS SCAN SCAR SCAT SCOT SEAL SEAM
|
105
|
+
SEAR SEAT SEED SEEK SEEM SEEN SEES SELF SELL SEND SENT SETS SEWN SHAG SHAM SHAW SHAY SHED
|
106
|
+
SHIM SHIN SHOD SHOE SHOT SHOW SHUN SHUT SICK SIDE SIFT SIGH SIGN SILK SILL SILO SILT SINE
|
107
|
+
SING SINK SIRE SITE SITS SITU SKAT SKEW SKID SKIM SKIN SKIT SLAB SLAM SLAT SLAY SLED SLEW
|
108
|
+
SLID SLIM SLIT SLOB SLOG SLOT SLOW SLUG SLUM SLUR SMOG SMUG SNAG SNOB SNOW SNUB SNUG SOAK
|
109
|
+
SOAR SOCK SODA SOFA SOFT SOIL SOLD SOME SONG SOON SOOT SORE SORT SOUL SOUR SOWN STAB STAG
|
110
|
+
STAN STAR STAY STEM STEW STIR STOW STUB STUN SUCH SUDS SUIT SULK SUMS SUNG SUNK SURE SURF
|
111
|
+
SWAB SWAG SWAM SWAN SWAT SWAY SWIM SWUM TACK TACT TAIL TAKE TALE TALK TALL TANK TASK TATE
|
112
|
+
TAUT TEAL TEAM TEAR TECH TEEM TEEN TEET TELL TEND TENT TERM TERN TESS TEST THAN THAT THEE
|
113
|
+
THEM THEN THEY THIN THIS THUD THUG TICK TIDE TIDY TIED TIER TILE TILL TILT TIME TINA TINE
|
114
|
+
TINT TINY TIRE TOAD TOGO TOIL TOLD TOLL TONE TONG TONY TOOK TOOL TOOT TORE TORN TOTE TOUR
|
115
|
+
TOUT TOWN TRAG TRAM TRAY TREE TREK TRIG TRIM TRIO TROD TROT TROY TRUE TUBA TUBE TUCK TUFT
|
116
|
+
TUNA TUNE TUNG TURF TURN TUSK TWIG TWIN TWIT ULAN UNIT URGE USED USER USES UTAH VAIL VAIN
|
117
|
+
VALE VARY VASE VAST VEAL VEDA VEIL VEIN VEND VENT VERB VERY VETO VICE VIEW VINE VISE VOID
|
118
|
+
VOLT VOTE WACK WADE WAGE WAIL WAIT WAKE WALE WALK WALL WALT WAND WANE WANG WANT WARD WARM
|
119
|
+
WARN WART WASH WAST WATS WATT WAVE WAVY WAYS WEAK WEAL WEAN WEAR WEED WEEK WEIR WELD WELL
|
120
|
+
WELT WENT WERE WERT WEST WHAM WHAT WHEE WHEN WHET WHOA WHOM WICK WIFE WILD WILL WIND WINE
|
121
|
+
WING WINK WINO WIRE WISE WISH WITH WOLF WONT WOOD WOOL WORD WORE WORK WORM WORN WOVE WRIT
|
122
|
+
WYNN YALE YANG YANK YARD YARN YAWL YAWN YEAH YEAR YELL YOGA YOKE
|
123
|
+
).freeze
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
data/lib/ndr_support/version.rb
CHANGED
data/ndr_support.gemspec
CHANGED
@@ -31,7 +31,7 @@ Gem::Specification.new do |spec|
|
|
31
31
|
spec.add_development_dependency 'minitest', '>= 5.0.0'
|
32
32
|
spec.add_development_dependency 'mocha', '~> 1.1'
|
33
33
|
|
34
|
-
spec.add_development_dependency 'ndr_dev_support', '~>
|
34
|
+
spec.add_development_dependency 'ndr_dev_support', '~> 2.0'
|
35
35
|
spec.add_development_dependency 'guard'
|
36
36
|
spec.add_development_dependency 'listen', '< 3.1' # Bundle 1.12 should be (but isn't) resolving Ruby 2.1 issue
|
37
37
|
spec.add_development_dependency 'guard-rubocop'
|
@@ -0,0 +1,129 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
# Tests password generation and checking library
|
4
|
+
class PasswordTest < Minitest::Test
|
5
|
+
test 'checking length requirement' do
|
6
|
+
refute NdrSupport::Password.valid?('acegi')
|
7
|
+
assert NdrSupport::Password.valid?('acegik')
|
8
|
+
end
|
9
|
+
|
10
|
+
test 'checking character uniqueness requirement' do
|
11
|
+
refute NdrSupport::Password.valid?('acegacegacegacegacegacegaceg')
|
12
|
+
assert NdrSupport::Password.valid?('acefhacefhacefhacefhacefhace')
|
13
|
+
end
|
14
|
+
|
15
|
+
test 'when checking, dictionary words are considered' do
|
16
|
+
refute NdrSupport::Password.valid?('google password')
|
17
|
+
assert NdrSupport::Password.valid?('google the password')
|
18
|
+
end
|
19
|
+
|
20
|
+
test 'when checking, custom dictionary words are considered' do
|
21
|
+
refute NdrSupport::Password.valid?('google passphrase', word_list: ['passphrase'])
|
22
|
+
assert NdrSupport::Password.valid?('google the passphrase', word_list: ['passphrase'])
|
23
|
+
end
|
24
|
+
|
25
|
+
test 'when checking, custom dictionary words that are also sequences are not over-counted' do
|
26
|
+
refute NdrSupport::Password.valid?('hijkl a ', word_list: %w(hijkl hijklm))
|
27
|
+
refute NdrSupport::Password.valid?('hijklm a ', word_list: %w(hijkl hijklm))
|
28
|
+
end
|
29
|
+
|
30
|
+
test 'when checking, custom dictionary words substrings of others should not intefere' do
|
31
|
+
refute NdrSupport::Password.valid?('acegik a', word_list: %w(cegi acegik))
|
32
|
+
refute NdrSupport::Password.valid?('acegik a', word_list: %w(acegik cegi))
|
33
|
+
end
|
34
|
+
|
35
|
+
test 'checking blank input' do
|
36
|
+
refute NdrSupport::Password.valid?(nil)
|
37
|
+
refute NdrSupport::Password.valid?('')
|
38
|
+
refute NdrSupport::Password.valid?(' ')
|
39
|
+
end
|
40
|
+
|
41
|
+
test 'checking with increasing sequences' do
|
42
|
+
refute NdrSupport::Password.valid?('12345678')
|
43
|
+
refute NdrSupport::Password.valid?('1234 5678')
|
44
|
+
refute NdrSupport::Password.valid?('456789')
|
45
|
+
refute NdrSupport::Password.valid?('456 789')
|
46
|
+
refute NdrSupport::Password.valid?('abcdefghijk')
|
47
|
+
refute NdrSupport::Password.valid?('abcde fghijk')
|
48
|
+
refute NdrSupport::Password.valid?('BCDEFGHIJKL')
|
49
|
+
refute NdrSupport::Password.valid?('BCDEFG HIJKL')
|
50
|
+
|
51
|
+
assert NdrSupport::Password.valid?('more 1234 5678')
|
52
|
+
assert NdrSupport::Password.valid?('1234 more 5678')
|
53
|
+
assert NdrSupport::Password.valid?('1234 5678 more')
|
54
|
+
end
|
55
|
+
|
56
|
+
test 'checking with decreasing sequences' do
|
57
|
+
refute NdrSupport::Password.valid?('87654321')
|
58
|
+
refute NdrSupport::Password.valid?('8765 4321')
|
59
|
+
refute NdrSupport::Password.valid?('987654')
|
60
|
+
refute NdrSupport::Password.valid?('987 654')
|
61
|
+
refute NdrSupport::Password.valid?('kjihgfedcba')
|
62
|
+
refute NdrSupport::Password.valid?('kjihg fedcba')
|
63
|
+
refute NdrSupport::Password.valid?('LKJIHGFEDCB')
|
64
|
+
refute NdrSupport::Password.valid?('LKJIHG FEDCB')
|
65
|
+
|
66
|
+
assert NdrSupport::Password.valid?('more 8765 4321')
|
67
|
+
assert NdrSupport::Password.valid?('8765 more 4321')
|
68
|
+
assert NdrSupport::Password.valid?('8765 4321 more')
|
69
|
+
end
|
70
|
+
|
71
|
+
test 'checking with increasing then decreasing sequences' do
|
72
|
+
refute NdrSupport::Password.valid?('123456787654321')
|
73
|
+
refute NdrSupport::Password.valid?('aBcDeFgFeDcBa')
|
74
|
+
|
75
|
+
assert NdrSupport::Password.valid?('something 123456787654321')
|
76
|
+
assert NdrSupport::Password.valid?('something aBcDeFgFeDcBa')
|
77
|
+
end
|
78
|
+
|
79
|
+
test 'checking with decreasing then increasing sequences' do
|
80
|
+
refute NdrSupport::Password.valid?('876543212345678')
|
81
|
+
refute NdrSupport::Password.valid?('gFeDcBaBcDeFg')
|
82
|
+
|
83
|
+
assert NdrSupport::Password.valid?('something 876543212345678')
|
84
|
+
assert NdrSupport::Password.valid?('something gFeDcBaBcDeFg')
|
85
|
+
end
|
86
|
+
|
87
|
+
test 'checking with repeating characters' do
|
88
|
+
refute NdrSupport::Password.valid?('happen')
|
89
|
+
assert NdrSupport::Password.valid?('happens')
|
90
|
+
assert NdrSupport::Password.valid?('hapqren')
|
91
|
+
assert NdrSupport::Password.valid?('hapqsen')
|
92
|
+
|
93
|
+
refute NdrSupport::Password.valid?('balloon')
|
94
|
+
refute NdrSupport::Password.valid?('ballllLLLllLLLllllooooOOooOOoooon')
|
95
|
+
assert NdrSupport::Password.valid?('baileon')
|
96
|
+
end
|
97
|
+
|
98
|
+
test 'generating' do
|
99
|
+
password = NdrSupport::Password.generate
|
100
|
+
|
101
|
+
assert NdrSupport::Password.valid?(password)
|
102
|
+
assert_equal 4, password.split(/\s/).length
|
103
|
+
|
104
|
+
password.scan(/\w+/) { |wd| assert NdrSupport::Password::RFC1751_WORDS.include?(wd.upcase) }
|
105
|
+
end
|
106
|
+
|
107
|
+
test 'generating with custom length' do
|
108
|
+
password = NdrSupport::Password.generate(number_of_words: 6)
|
109
|
+
|
110
|
+
assert NdrSupport::Password.valid?(password)
|
111
|
+
assert_equal 6, password.split(/\s/).length
|
112
|
+
|
113
|
+
password.scan(/\w+/) { |wd| assert NdrSupport::Password::RFC1751_WORDS.include?(wd.upcase) }
|
114
|
+
end
|
115
|
+
|
116
|
+
test 'generating with custom separator' do
|
117
|
+
password = NdrSupport::Password.generate(separator: '-')
|
118
|
+
|
119
|
+
assert NdrSupport::Password.valid?(password)
|
120
|
+
assert_equal 4, password.split(/-/).length
|
121
|
+
|
122
|
+
password.scan(/\w+/) { |wd| assert NdrSupport::Password::RFC1751_WORDS.include?(wd.upcase) }
|
123
|
+
end
|
124
|
+
|
125
|
+
test 'generating unrealistically' do
|
126
|
+
exception = assert_raises(RuntimeError) { NdrSupport::Password.generate(number_of_words: 1) }
|
127
|
+
assert_match(/failed to generate/i, exception.message)
|
128
|
+
end
|
129
|
+
end
|
@@ -169,9 +169,9 @@ class String::ConversionsTest < Minitest::Test
|
|
169
169
|
|
170
170
|
# ONS wildcard date formats
|
171
171
|
# (cannot convert to a Date, but need to parse into EBaseRecord date fields)
|
172
|
-
|
173
|
-
|
174
|
-
|
172
|
+
assert_nil '19450000'.to_date('yyyymmdd')
|
173
|
+
assert_nil '19450300'.to_date('yyyymmdd')
|
174
|
+
assert_nil '19450013'.to_date('yyyymmdd')
|
175
175
|
|
176
176
|
# parse our own date format correctly, regardless of format specification
|
177
177
|
assert_equal Ourdate.build_datetime(1998, 02, 13), '13.02.1998'.to_date('yyyymmdd')
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ndr_support
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.
|
4
|
+
version: 5.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- NCRS Development Team
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-02-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -112,20 +112,14 @@ dependencies:
|
|
112
112
|
requirements:
|
113
113
|
- - "~>"
|
114
114
|
- !ruby/object:Gem::Version
|
115
|
-
version: '
|
116
|
-
- - ">="
|
117
|
-
- !ruby/object:Gem::Version
|
118
|
-
version: 1.1.3
|
115
|
+
version: '2.0'
|
119
116
|
type: :development
|
120
117
|
prerelease: false
|
121
118
|
version_requirements: !ruby/object:Gem::Requirement
|
122
119
|
requirements:
|
123
120
|
- - "~>"
|
124
121
|
- !ruby/object:Gem::Version
|
125
|
-
version: '
|
126
|
-
- - ">="
|
127
|
-
- !ruby/object:Gem::Version
|
128
|
-
version: 1.1.3
|
122
|
+
version: '2.0'
|
129
123
|
- !ruby/object:Gem::Dependency
|
130
124
|
name: guard
|
131
125
|
requirement: !ruby/object:Gem::Requirement
|
@@ -231,7 +225,6 @@ extensions: []
|
|
231
225
|
extra_rdoc_files: []
|
232
226
|
files:
|
233
227
|
- ".gitignore"
|
234
|
-
- ".hound.yml"
|
235
228
|
- ".rubocop.yml"
|
236
229
|
- ".travis.yml"
|
237
230
|
- CODE_OF_CONDUCT.md
|
@@ -257,6 +250,8 @@ files:
|
|
257
250
|
- lib/ndr_support/nil.rb
|
258
251
|
- lib/ndr_support/ourdate.rb
|
259
252
|
- lib/ndr_support/ourtime.rb
|
253
|
+
- lib/ndr_support/password.rb
|
254
|
+
- lib/ndr_support/password/constants.rb
|
260
255
|
- lib/ndr_support/regexp_range.rb
|
261
256
|
- lib/ndr_support/safe_file.rb
|
262
257
|
- lib/ndr_support/safe_path.rb
|
@@ -279,6 +274,7 @@ files:
|
|
279
274
|
- test/nil_test.rb
|
280
275
|
- test/ourdate_test.rb
|
281
276
|
- test/ourtime_test.rb
|
277
|
+
- test/password_test.rb
|
282
278
|
- test/regexp_range_test.rb
|
283
279
|
- test/resources/filesystem_paths.yml
|
284
280
|
- test/safe_file_test.rb
|
@@ -324,6 +320,7 @@ test_files:
|
|
324
320
|
- test/nil_test.rb
|
325
321
|
- test/ourdate_test.rb
|
326
322
|
- test/ourtime_test.rb
|
323
|
+
- test/password_test.rb
|
327
324
|
- test/regexp_range_test.rb
|
328
325
|
- test/resources/filesystem_paths.yml
|
329
326
|
- test/safe_file_test.rb
|