ndr_support 5.1.0 → 5.2.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: e3b89d3c13899b63bff25a98b9fa61eb2f96b48a
4
- data.tar.gz: 0930523be4d656ccb9dcd26beb72f68677b5af6f
3
+ metadata.gz: 609a55a5903e1a1920b0870cb6338be2d3ce9d47
4
+ data.tar.gz: 15adfab49032115e4693bcbaace8b8d46837911b
5
5
  SHA512:
6
- metadata.gz: 698f5dae240478b84e559fcad339e4c9a12f951ef90c489c58190bbc3431aba3d50d786d7c9899ddc53db7f6e850c052b1edcc094def201b6f3357cbfb071cf5
7
- data.tar.gz: de6652923af6e94c83cd0c378569d7662a5f043bdd7df41d2f15d70732cbb22b87438bbd8887b0a980f06c027c7ff266cab194673e645665c549bc480f07f947
6
+ metadata.gz: f2270a5b0d7a368945b7276e92a0297a0ea6dacad884a85eefee2e565bac5079fdd92d85ab68e625bb5debb6626c242c050a27613e85dd46f3770f954b95b196
7
+ data.tar.gz: ac102ce2887029107c2d5adad88fbdb04df9ecc7eeb6698fc206a6abe982f807edc7715e9bab620bf955d90be439d76f8b8669ebf9eab0d74db0e75f12702c34
data/.gitignore CHANGED
@@ -13,3 +13,7 @@
13
13
  *.o
14
14
  *.a
15
15
  mkmf.log
16
+
17
+ # Ignore RuboCop's cache.
18
+ .rubocop-https---raw-githubusercontent-com-PublicHealthEngland-ndr-dev-support-master--rubocop-yml
19
+
@@ -1,29 +1 @@
1
- Rails:
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
@@ -3,15 +3,11 @@ file safety:
3
3
  ".gitignore":
4
4
  comments:
5
5
  reviewed_by: josh.pencheon
6
- safe_revision: 412c86abb7b5fa545c1d4895aad4fe50cbc41faf
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: timgentry
14
- safe_revision: bd7dbaf2c72eb4a8f74db498f4dea67e02c8cb60
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: 764eca3766b00dbd105f4deb33181ea3d7235056
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: 7c32f5a80c1fb7aaf6e850d4b0651a7b47640e15
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: 6a0de6c085dc9b6f996f06dd6233f80ac6a1757d
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: 9a2ce0c2cdefd4726df33199ca8f1a5ece6f3042
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: timgentry
218
- safe_revision: 2a5d30674dc9dde336e1dbbbf3c8a98905647432
225
+ reviewed_by: josh.pencheon
226
+ safe_revision: dfb7d1b94fc4d1578ab2129096945d5d1a1094fe
219
227
  test/test_helper.rb:
220
228
  comments:
221
229
  reviewed_by: timgentry
@@ -6,6 +6,7 @@ require 'ndr_support/integer'
6
6
  require 'ndr_support/nil'
7
7
  require 'ndr_support/ourdate'
8
8
  require 'ndr_support/ourtime'
9
+ require 'ndr_support/password'
9
10
  require 'ndr_support/regexp_range'
10
11
  require 'ndr_support/safe_file'
11
12
  require 'ndr_support/safe_path'
@@ -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
@@ -3,5 +3,5 @@
3
3
  # This defines the NdrSupport version. If you change it, rebuild and commit the gem.
4
4
  # Use "rake build" to build the gem, see rake -T for all bundler rake tasks.
5
5
  module NdrSupport
6
- VERSION = '5.1.0'
6
+ VERSION = '5.2.0'
7
7
  end
@@ -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', '~> 1.1', '>= 1.1.3'
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
- assert_equal nil, '19450000'.to_date('yyyymmdd')
173
- assert_equal nil, '19450300'.to_date('yyyymmdd')
174
- assert_equal nil, '19450013'.to_date('yyyymmdd')
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.1.0
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-01-06 00:00:00.000000000 Z
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: '1.1'
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: '1.1'
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
data/.hound.yml DELETED
@@ -1,10 +0,0 @@
1
- fail_on_violations: true
2
-
3
- coffeescript:
4
- enabled: false
5
- javascript:
6
- enabled: false
7
- ruby:
8
- config_file: .rubocop.yml
9
- scss:
10
- enabled: false