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 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