From 8b17219ed4447a8edf18ee5350b14fd6156a4eb0 Mon Sep 17 00:00:00 2001 From: Jonathan Cobb Date: Thu, 18 Jun 2020 08:27:27 -0400 Subject: [PATCH 1/8] update web --- bubble-web | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bubble-web b/bubble-web index f7aa888b..02818344 160000 --- a/bubble-web +++ b/bubble-web @@ -1 +1 @@ -Subproject commit f7aa888b3e2aad585cb218e33fc97508828b3e99 +Subproject commit 02818344a7b034eb0ce136e9446af2e3383c7740 From 0bf4005229c3c4e6444a9af1ab3d5495165576b3 Mon Sep 17 00:00:00 2001 From: Jonathan Cobb Date: Thu, 18 Jun 2020 17:16:09 -0400 Subject: [PATCH 2/8] more host prefixes --- .../main/resources/bubble/host-prefixes.txt | 12325 ++++++++++++++++ 1 file changed, 12325 insertions(+) diff --git a/bubble-server/src/main/resources/bubble/host-prefixes.txt b/bubble-server/src/main/resources/bubble/host-prefixes.txt index 7b38f7ff..f3d0a7a2 100644 --- a/bubble-server/src/main/resources/bubble/host-prefixes.txt +++ b/bubble-server/src/main/resources/bubble/host-prefixes.txt @@ -1,136 +1,12461 @@ abaca +abaci +aback +abacs +abaft +abaka +abamp +aband +abash +abask +abate +abaya +abbas +abbed +abbes abbey abbot +abcee +abeam +abear +abele +abets +abhor +abide +abies +abled +abler +ables +ablet +ablow +abmho abode +abohm +aboil +aboma aboon +abord +abore +abort +about above +abram +abray +abrim +abrin +abris +absey +absit +abuna +abune +abuse +abuts abuzz +abyes +abysm +abyss +acais +acari +accas +accoy +acerb acers +aceta +achar +ached +aches +achoo +acids +acidy +acing +acini +ackee +acker +acmes +acmic +acned +acnes +acold acorn +acred +acres +acrid +acted +actin +acton +actor +acute +acyls +adage adapt +adaws +adays +addax +added adder +addio +addle +adeem adept +adhan +adieu +adios +adits +adman +admen +admin +admit +admix +adobe +adobo adopt adore adorn +adown +adoze +adrad +adred +adsum +aduki +adunc +adust +advew +adyta +adzed adzes +aecia +aedes +aegis +aeons +aerie +aeros +aesir +afald +afara +afars +afear +affix +afire +aflaj +afoot +afore +afrit +afros +after +again +agama +agami +agape +agars +agast agate agave +agaze +agene agent +agers +agger +aggie +aggri +aggro +aggry +aghas +agila +agile +aging +agios +agism +agist +agita +aglee +aglet +agley +agloo +aglow +aglus +agmas +agoge +agone +agons +agony +agood +agora +agree +agria +agrin +agued +agues +aguna +aguti ahead +aheap +ahent +ahigh +ahind +ahing +ahint +ahold +ahull +ahuru +aidas +aided +aider +aides +aidoi +aidos +aiery +aigas aight +ailed +aimed +aimer +ainee +ainga aioli +aired +airer +airns +airth +airts aisle +aitch +aitus +aiver +aizle +ajiva +ajuga +ajwan +akees +akela +akene +aking akita +akkas +alaap +alack alamo +aland +alane +alang alans +alant +alapa +alaps +alarm +alary +alate +alays +albas +albee album +alcid +alcos +aldea +alder +aldol +aleck +alecs +alefs +aleft +aleph +alert +alews +aleye +alfas +algae +algal +algas +algid +algin +algor +algum alias +alibi alien +alifs align +alike +aline +alist alive +aliya +alkie +alkos +alkyd +alkyl +allay +allee +allel alley +allis +allod +allot +allow alloy +allyl +almah +almas +almeh +almes +almud +almug +alods +aloed +aloes aloft aloha +aloin +alone along +aloof +aloos aloud +alowe alpha +altar +alter +altho +altos +alula +alums +alure +alway +amahs +amain +amass +amate +amaut amaze +amban amber +ambit +amble +ambos +ambry +ameba +ameer +amend +amene +amens +ament +amias +amice amici +amide +amido +amids +amies amiga amigo +amine amino +amins +amirs +amiss +amity +amlas +amman +ammon +ammos +amnia +amnic +amnio +amoks +amole +among +amort +amour +amove +amowt +amped ample +amply +ampul +amrit +amuck +amuse +amyls +anana +anata +ancho +ancle +ancon +andro +anear +anele +anent +angas angel +anger +angle +anglo +angry +angst +anigh +anile +anils +anima +anime +animi +anion +anise anker +ankhs +ankle +ankus +anlas +annal +annas +annat annex +annoy +annul +anoas +anode +anole +anomy +ansae +antae +antar +antas +anted +antes +antic +antis +antra +antre +antsy anvil +anyon aorta +apace +apage +apaid +apart +apayd +apays +apeak +apeek +apers +apert +apery +apgar +aphid +aphis +apian +aping +apiol +apish +apism +apnea +apode +apods +aport +appal +appay +appel apple +apply +appro +appui +appuy +apres apron +apses +apsis +apsos +apted +apter +aptly +aquae +aquas +araba +araks +arame +arars +arbas arbor +arced +arcos +arcus +ardeb +ardor +ardri +aread +areae +areal +arear +areas +areca +aredd +arede +arefy +areic arena +arene +arepa +arets +arett +argal +argan +argil +argle +argol argon +argot +argue +argus arhat arias +ariel +ariki +arils +ariot +arise +arish +arked +arled +arles +armed +armer +armet +armil +armor +arnas +arnut +aroba +aroha +aroid +aroma +arose +arpas +arpen +arrah +arras +array +arret +arris arrow +arsed +arses +arsey +arsis +arson +artal +artel +artic +artis +artsy +aruhe +arums +arval +arvos +aryls +asana ascot +ascus +asdic +ashed +ashen +ashes +ashet +aside +asked +asker +askew +askoi +askos +aspen +asper +aspic +aspis +aspro +assai +assam +assay +asses +asset +assez +assot +aster +astir +astun +asway +aswim +asyla +ataps +ataxy +atigi +atilt +atimy +atlas +atman +atmas +atocs +atoke +atoks atoll +atoms +atomy +atone +atony +atopy +atria +atrip +attap +attar attic +atuas +audad +audio +audit +auger +aught augur +aulas +aulic +auloi +aulos +aumil +aunes +aunts +aunty +aurae +aural +aurar +auras +aurei +aures auric +auris +aurum +autos +auxin avail +avale +avant +avast +avels +avens +avers +avert +avgas +avian +avine +avion +avise +aviso +avize +avoid +avows +avyze +await awake award +aware +awarn +awash +awato +awave +aways +awdls +aweel +aweto +awing +awmry +awned +awner +awoke +awols +awork +axels axial +axile +axils +axing axiom +axion +axite +axled +axles +axman +axmen +axoid +axone +axons +ayahs +ayelp +aygre +ayins +ayont +ayres +ayrie +azans +azide +azido +azine +azlon +azoic +azole +azons +azote azoth +azuki +azure +azurn +azury +azygy +azyme +azyms +baaed +baals +babas +babel +babes +babka baboo +babul +babus +bacca +bacco +baccy +bacha +bachs +backs bacon badge +baels +baffs +baffy +bafts bagel baggy +baghs +bagie +bahts +bahus +bahut +bails +bairn +baith +baits +baiza +baize +bajan +bajra +bajri +bajus +baked +baken baker +bakes +bakra +balas +balds +baldy +baled +baler +bales +balks +balky +balls +bally +balms +balmy +baloo +balsa +balti +balun +balus +bambi +banak +banal banco +bancs +banda +bandh +bands +bandy +baned +banes +bangs +bania banjo +banks +banns +bants +bantu +banty +banya +bapus +barbe +barbs +barby +barca +barde +bardo +bards +bardy +bared +barer +bares +barfs barge +baric +barks barky +barms +barmy +barns +barny baron +barps +barra +barre +barro +barry +barye basal +basan +based +basen +bases basho basic +basij +basil basin basis +basks +bason +basse +bassi basso +bassy basta +baste +basti +basto +basts batch +bated +bates +bathe +baths batik baton batta +batts +battu +batty +bauds +bauks +baulk +baurs +bavin +bawls +bawns +bawrs +bawty +bayed +bayes +bayle +bayou +bayts +bazar bazoo beach +beads +beady +beaks +beaky +beams +beamy +beano +beans +beany +beard +beare +bears beast +beath +beats +beaty +beaus +beaut +beaux +bebop +becap +becke +becks +bedad +bedel +bedes +bedew +bedim +bedye +beech +beedi +beefs +beefy +beeps +beers +beery +beets +befit +befog +begad +began +begar +begat +begem +beget +begin +begot +begum +begun +beige +beigy +being +bekah +belah +belar +belay +belch +belee +belga +belie +belle +bells +belly +belon +below +belts +bemad +bemas +bemix +bemud bench +bends +bendy +benes +benet +benga +benis +benne +benni +benny bento +bents +benty +bepat +beray +beres beret +bergs +berko +berks +berme +berms +berob +berry +berth +beryl +besat +besaw +besee +beses +beset +besit +besom +besot +besti +bests +betas +beted betel +betes +beths +betid +beton +betta +betty +bevel +bever +bevor +bevue +bevvy +bewet +bewig bezel +bezes +bezil +bhais +bhaji +bhang +bhels +bhoot +bhuna +bhuts +biach +biali +bialy +bibbs +bible +biccy bicep +bices +biddy +bided +bider +bides +bidet +bidis +bidon +bield +biers +biffo +biffs +biffy +bifid +bigae +biggs +biggy +bigha +bight +bigly +bigos +bigot +bijou +biked biker +bikes +bikie +bilbo +bilby +biled +biles +bilge +bilgy +bilks +bills +billy +bimah +bimas +bimbo +binal +bindi +binds +biner +bines +binge bingo +bings +bingy +binit +binks +bints +biogs biome +biont +biota biped +bipod birch +birds +birks +birle +birls +biros +birrs +birse +birsy +birth +bises +bisks +bisom bison +biter +bites +bitos +bitou +bitsy +bitte +bitts +bitty +bivia +bivvy +bizes +bizzo +bizzy +blabs black blade +blads +blady +blaer +blaes +blaff +blags +blahs +blain +blame +blams +bland +blank +blare +blart +blase +blash +blast +blate +blats +blatt +blaud +blawn +blaws +blays +blaze +bleak +blear +bleat +blebs +bleed +bleep blees +blend +blent +blert +bless +blest +blets +bleys blimp +blimy blind bling +blini blink +blins +bliny +blips +bliss +blist +blite +blits +blitz +blive +bloat +blobs +block +blocs +blogs +bloke +blond +blood +blook +bloom bloop +blore +blots +blown +blows +blowy +blubs +blude +bludy +blued +bluer +blues +bluet +bluey +bluff +bluid +blume +blunk +blunt blurb +blurs +blurt +blush +blype +boabs +boaks board +boars +boart +boast +boats +bobac +bobak +bobas +bobby +bobol +bocca +bocce +bocci +boche +bocks +boded +bodes +bodge +bodhi +bodle +boeps +boets +boeuf +boffo +boffs +bogan +bogey +boggy +bogie +bogle +bohea +bohos +boils +boing +boink +boite +boked +bokeh +bokes +bokos +bolar +bolas +bolds +boles +bolix +bolls +bolos +bolts +bolus +bomas +bombe +bombo +bombs +bonce +bonds +boned +boner +bones +boney +bongo +bongs +bonie +bonks +bonne +bonny +bonus +bonza +bonze +booai +booay +boody +booed +boofy +boogy +boohs +books +booky +bools +booms +boomy +boong +boons +boord +boors +boose boost +booth +boots +booty +booze +boozy +borak +boral +boras +borax +borde +bords +bored +boree +borel +borer +bores +borgo boric +borks +borms +borna +borne +boron +borts +borty +bortz +bosie +bosks +bosky +boson +bossy +bosun +botas +botch +botel +botes +bothy +botte +botts +botty +bouge +bough +bouks +boule +boult bound +bouns +bourd +bourg +bourn +bouse +bousy +bouts +bovid +bowat +bowed +bowel +bower +bowes +bowet +bowie +bowls +bowne +bowrs +bowse +boxed boxen +boxer +boxes +boxty +boyar +boyau +boyed +boyfs +boygs +boyla +boyos +boysy +bozos +braai +brace +brach +brack +bract +brads +braes +brags braid +brail brain +brake +braks +braky +brame brand +brane +brank +brans +brant +brash brass +brast +brats brava brave +bravi bravo +brawl +brawn +braws +braxy +brays +braza +braze bread +break +bream +brede +breds +breed +breem +breer +brees +breid +breis +breme +brens +brent +brere +brers +breve +brews +breys briar +bribe brick +bride +brief +brier +bries +brigs +briki +briks +brill +brims +brine +bring +brink +brins +briny +brios +brise +brisk +briss +brith +brits +britt +brize +broad +broch +brock +brods +brogh +brogs +broil +broke +brome +bromo +bronc +brond +brood +brook +brool +broom +broos +brose +brosy +broth +brown +brows +brugh +bruin +bruit +brule +brume +brung +brunt brush +brusk +brust +brute +bruts +buats +buaze +bubal +bubas bubba +bubby +bubus +buchu bucko +bucks +bucku +budas buddy +budge +budis +budos +buffa +buffe +buffi +buffo +buffs buffy +bufos +bufty +buggy +bugle +buhls +buhrs +buiks +build +built +buist +bukes +bulbs +bulge +bulgy +bulks bulky +bulla +bulls +bully +bulse +bumbo +bumfs +bumph +bumps +bumpy +bunas +bunce +bunch +bunco +bunde +bundh +bunds +bundt +bundu +bundy +bunia +bunje +bunjy +bunko +bunks +bunns +bunny +bunts +bunty +bunya +buoys +buppy +buran +buras +burbs +burds +buret +burgh +burgs +burin +burka +burke +burks +burls +burly +burns +burnt +buroo +burps +burqa +burro +burrs +burry +bursa +burse +burst +busby +bused +buses +bushy +busks +busky +bussu +busti +busts +busty +butch +buteo +butes +butle +butte +buxom +buyer +buzzy +bwana +bwazi +byded +bydes +byked +bykes +bylaw +byres +byrls +byssi +bytes +byway +caaed +cabal +cabas +cabby +caber +cabin +cable +cabob +caboc +cabre +cacao +cacas +cache +cacks +cacky +cacti +caddy +cadee +cades +cadet +cadge +cadgy +cadie +cadis +cadre +caeca +caese +cafes +caffs +caged +cager +cages +cagey +cagot +cahow +caids +cains +caird +cairn +cajon +cajun +caked +cakes +cakey +calfs +calid +calif +calix +calks +calla +calls +calms +calmy +calos +calpa +calps +calve +calyx +caman +camas +camel +cameo +cames +camis +camos +campi +campo +camps +campy +camus +canal +candy +caned +caneh +caner +canes +cangs +canid +canna +canns +canny +canoe +canon +canso +canst +canto +cants +canty +capas +caped +caper +capes +capex +caphs +capiz +caple +capon +capos +capot +capul +caput +carap +carat +carbo +carbs +carby +cardi +cards +cardy +cared +carer +cares +caret +carex +cargo +carks +carle +carls +carns +carny +carob +carol +carom +caron +carpi +carps +carrs +carry +carse +carta +carte +carts +carve +carvy +casas +casco +cased +cases +casks +casky +caste +casts +casus +catch +cater +cates +catty +cauda +cauks +cauld +caulk +cauls +caums +caups +causa +cause +cavas +caved +cavel +caver +caves +cavie +cavil +cawed +cawks +caxon +cease +ceaze +cebid +cecal +cecum +cedar +ceded +ceder +cedes +cedis +ceiba +ceili +ceils +celeb +cella +celli +cello +cells +celom +celts +cense +cento +cents +centu +ceorl +cepes +cerci +cered +ceres +cerge +ceria +ceric +cerne +ceros +certs +certy +cesse +cesta +cesti +cetes +cetyl +cezve +chace +chack +chaco +chado +chads +chafe +chaff +chaft +chain +chair +chais +chalk +chals +champ +chams +chana +chang +chank +chant +chaos +chape +chaps +chapt +chara +chard +chare +chark +charm +charr +chars +chart +chary +chase +chasm +chats +chave +chavs +chawk +chaws +chaya +chays +cheap +cheat +check +cheek +cheep +cheer +chefs +cheka +chela +chelp +chemo +chere +chert +chess +chest +cheth +chevy +chews +chewy +chiao +chias +chibs +chica +chich +chick +chico +chics +chide +chief +chiel +chiks +child +chile +chili +chill +chimb +chime +chimo +chimp +china +chine +chink +chino +chins +chips +chirk +chirl +chirm +chiro +chirp +chirr +chirt +chiru +chits +chive +chivs +chivy +chizz +chock +choco +chocs +chode +chogs +choir +choke +choko +choky +chola +choli +cholo +chomp +choof +chook +choom +choon +chops +chord +chore +chose +chota +chott +chout +choux +chowk +chows +chubs +chuck +chufa +chuff +chugs +chump +chums +chunk +churl +churn +churr +chuse +chute +chyle +chyme +chynd +cibol +cided +cider +cides +ciels +cigar +ciggy +cilia +cills +cimar +cimex +cinch +cinct +cines +cions +cippi +circa +circs +cires +cirls +cirri +cisco +cissy +cists +cital +cited +citer +cites +cives +civet +civic +civie +civil +civvy +clach +clack +clade +clads +claes +clags +claim +clame +clamp +clams +clang +clank +clans +claps +clapt +claro +clart +clary +clash +clasp +class +clast +clats +claut +clave +clavi +claws +clays +clean +clear +cleat +cleck +cleek +cleep +clefs +cleft +clegs +cleik +clems +clepe +clept +clerk +cleve +clews +click +clied +clies +cliff +clift +climb +clime +cline +cling +clink +clint +clipe +clips +clipt +clits +cloak +cloam +clock +clods +cloff +clogs +cloke +clomb +clomp +clone +clonk +clons +cloop +cloot +clops +close +clote +cloth +clots +cloud +clour +clous +clout +clove +clown +clows +cloye +cloys +cloze +clubs +cluck +clued +clues +clump +clung +clunk +clype +cnida +coach +coact +coala +coals +coaly +coapt +coarb +coast +coate +coati +coats +cobbs +cobby +cobia +coble +cobra +cobza +cocas +cocci +cocco +cocoa +cocos +codas +codec +coded +coden +coder +codes +codex +codon +coeds +coffs +cogie +cogon +cogue +cohab +cohen +cohoe +cohog +cohos +coifs +coign +coils +coins +coirs +coits +coked +cokes +colas +colby +colds +coled +coles +coley +colic +colin +colls +colly +colog +colon +color +colts +colza +comae +comal +comas +combe +combi +combo +combs +comby +comer +comes +comet +comfy +comic +comix +comma +commo +comms +commy +compo +comps +compt +comte +comus +conch +condo +coned +cones +coney +confs +conga +conge +congo +conia +conic +conin +conks +conky +conne +conns +conte +conto +conus +convo +cooch +cooed +cooee +cooer +cooey +coofs +cooks +cooky +cools +coomb +cooms +coomy +coons +coops +coopt +coost +coots +cooze +copal +copay +coped +copen +coper +copes +coppy +copra +copse +copsy +coral +coram +corbe +corby +cords +cored +corer +cores +corey +corgi +coria +corks +corky +corms +corni +corno +corns +cornu +corny +corps +corse +corso +cosec +cosed +coses +coset +cosey +cosie +costa +coste +costs +cotan +coted +cotes +coths +cotta +cotts +couch +coude +cough +could +count +coupe +coups +courb +courd +coure +cours +court +couta +couth +coved +coven +cover +coves +covet +covey +covin +cowal +cowan +cowed +cower +cowks +cowls +cowps +cowry +coxae +coxal +coxed +coxes +coxib +coyed +coyer +coyly +coypu +cozed +cozen +cozes +cozey +cozie +craal +crabs +crack +craft +crags +craic +craig +crake +crame +cramp +crams +crane +crank +crans +crape +craps +crapy +crare +crash +crass +crate +crave +crawl +craws +crays +craze +crazy +creak +cream +credo +creds +creed +creek +creel +creep +crees +creme +crems +crena +crepe +creps +crept +crepy +cress +crest +crewe +crews +crias +cribs +crick +cried +crier +cries +crime +crimp +crims +crine +crios +cripe +crise +crisp +crith +crits +croak +croci +crocs +croft +crogs +cromb +crome +crone +cronk +crony +crook +crool +croon +crops +crore +cross +crost +croup +crout +crowd +crown +crows +croze +cruck +crude +cruds +crudy +cruel +crues +cruet +cruft +crumb +crump +crunk +cruor +crura +cruse +crush +crust +crusy +cruve +crwth +crypt +ctene +cubby +cubeb +cubed +cuber +cubes +cubic +cubit +cuddy +cuffo +cuffs +cuifs +cuing +cuish +cuits +cukes +culch +culet +culex +culls +cully +culms +culpa +culti +cults +culty +cumec +cumin +cundy +cunei +cunts +cunty +cupel +cupid +cuppa +cuppy +curat +curbs +curch +curds +curdy +cured +curer +cures +curet +curfs +curia +curie +curio +curli +curls +curly +curns +curny +currs +curry +curse +cursi +curst +curve +curvy +cusec +cushy +cusks +cusps +cuspy +cusso +cusum +cutch +cuter +cutes +cutey +cutie +cutin +cutis +cutto +cutty +cutup +cuvee +cwtch +cyano +cyans +cyber +cycad +cycas +cycle +cyclo +cyder +cylix +cymae +cymar +cymas +cymes +cymol +cynic +cysts +cytes +cyton +czars +daals +dabba +daces +dacha +dacks +dadah +dadas +daddy +dados +daffs +daffy +dagga +daggy +dagos +dahls +daiko +daily +daine +daint +dairy +daisy +daker +daled +dales +dalis +dalle +dally +dalts +daman +damar +dames +damme +damns +damps +dampy +dance +dancy +dandy +dangs +danio +danks +danny +dants +daraf +darbs +darcy +dared +darer +dares +darga +dargs +daric +daris +darks +darky +darns +darre +darts +darzi +dashi +dashy +datal +dated +dater +dates +datos +datto +datum +daube +daubs +dauby +dauds +dault +daunt +daurs +dauts +daven +davit +dawah +dawds +dawed +dawen +dawks +dawns +dawts +dayan +daych +daynt +dazed +dazer +dazes +deads +deair +deals +dealt +deans +deare +dearn +dears +deary +deash +death +deave +deaws +deawy +debag +debar +debby +debel +debes +debit +debts +debud +debug +debur +debus +debut +debye +decad +decaf +decal +decay +decko +decks +decor +decos +decoy +decry +dedal +deeds +deedy +deely +deems +deens +deeps +deere +deers +deets +deeve +deevs +defat +defer +deffo +defis +defog +degas +degum +degus +deice +deids +deify +deign +deils +deism +deist +deity +deked +dekes +dekko +delay +deled +deles +delfs +delft +delis +dells +delly +delos +delph +delta +delts +delve +deman +demes +demic +demit +demob +demon +demos +dempt +demur +denar +denay +denes +denet +denim +denis +dense +dents +deoxy +depot +depth +derat +deray +derby +dered +deres +derig +derma +derms +derns +deros +derro +derry +derth +dervs +deshi +desks +desse +deter +detox +deuce +devas +devel +devil +devon +devot +dewan +dewar +dewax +dewed +dexes +dexie +dhaks +dhals +dhobi +dhole +dholl +dhols +dhoti +dhows +dhuti +diact +dials +diane +diary +diazo +dibbs +diced +dicer +dices +dicey +dicht +dicot +dicta +dicts +dicty +diddy +didie +didos +didst +diebs +diene +diets +diffs +dight +digit +dikas +dilli +dills +dilly +dimer +dimes +dimly +dimps +dinar +dined +diner +dines +dinge +dingo +dings +dingy +dinic +dinks +dinky +dinna +dinos +dints +diode +diols +diota +dippy +dipso +diram +direr +dirge +dirke +dirks +dirls +dirts +dirty +disas +disci +disco +discs +dishy +disks +disme +dital +ditas +ditch +dited +dites +ditsy +ditto +ditts +ditty +ditzy +divan +divas +dived +diver +dives +divis +divna +divos +divot +divvy +diwan +dixie +dixit +diyas +dizen +dizzy +djinn +djins +doabs +doats +dobby +dobie +dobla +dobra +dobro +docht +docks +docos +doddy +dodge +dodgy +dodos +doeks +doers +doest +doeth +doffs +doges +dogey +doggo +doggy +dogie +dogma +dohyo +doilt +doily +doing +doits +dojos +dolce +dolci +doled +doles +dolia +dolls +dolly +dolma +dolor +dolos +dolts +domal +domed +domes +domic +donah +donas +donee +doner +donga +dongs +donko +donna +donne +donny +donor +donsy +donut +doona +doors +doozy +dopas +dorad +dorba +dorbs +doree +dores +doric +doris +dorms +dormy +dorps +dorrs +dorsa +dorse +dorts +dorty +dosed +doseh +doser +doses +dotal +doted +doter +dotes +dotty +douar +doubt +douce +doucs +dough +douks +doula +douma +doums +doups +doura +douse +douts +doved +doven +dover +doves +dovie +dowar +dowds +dowdy +dowed +dowel +dower +dowie +dowle +dowls +dowly +downa +downy +dowps +dowry +dowse +dowts +doxie +doyen +doyly +dozed +dozen +dozer +dozes +drabs +drack +draco +draff +draft +drags +drail +drain +drake +drama +drams +drank +drant +drape +draps +drats +drave +drawl +drawn +draws +drays +dread +dream +drear +dreck +dreed +drees +dregs +dreks +drent +drere +dress +drest +dreys +dribs +drice +dried +drier +dries +drift +drill +drily +drink +drips +dript +drive +droid +droil +droit +drole +droll +drome +drone +drony +droob +droog +drook +drool +droop +drops +dropt +dross +drouk +drove +drown +drows +drubs +drugs +druid +drums +drunk +drupe +druse +drusy +druxy +dryad +dryer +dryly +dsobo +dsomo +duads +duals +duans +duars +dubbo +ducal +ducat +duces +duchy +ducks +ducky +ducts +duddy +duded +dudes +duels +duets +duett +duffs +duing +duits +dukas +duked +dukes +dukka +dules +dulia +dulls +dully +dulse +dumas +dunam +dunam +dunce +dunch +dunes +dunks +dunno +dunny +dunsh +dunts +duomi +duomo +duped +duper +dupes +duple +duply +duppy +dural +duras +dured +dures +durgy +durns +duroc +duros +duroy +durra +durrs +durry +durst +durum +durzi +dusks +dusky +dusts +dusty +dutch +duvet +duxes +dwaal +dwale +dwalm +dwams +dwang +dwarf +dwaum +dweeb +dwell +dwelt +dwile +dwine +dyads +dyers +dying +dyked +dykes +dykey +dykon +dynel +dynes +dzhos +eager +eagle +eagre +eales +eaned +eards +eared +earls +early +earns +earst +earth +eased +easel +easer +eases +easle +easts +eaten +eater +eathe +eaved +eaves +ebbed +ebbet +ebons +ebony +ebook +ecads +eched +eches +echos +eclat +ecrus +edema +edged +edger +edges +edict +edify +edile +edits +educe +educt +eejit +eerie +eeven +eevns +effed +egads +egers +egest +eggar +egged +egger +egmas +egret +ehing +eider +eidos +eight +eigne +eiked +eikon +eilds +eisel +eject +eking +ekkas +elain +eland +elans +elate +elbow +elchi +elder +eldin +elect +elegy +elemi +elfed +elfin +eliad +elide +elint +elite +elmen +eloge +elogy +eloin +elope +elops +elpee +elsin +elude +elute +elvan +elver +elves +emacs +email +embar +embay +embed +ember +embog +embow +embox +embus +emcee +emeer +emend +emery +emeus +emirs +emits +emmas +emmer +emmet +emmew +emmys +emong +emote +emove +emule +emure +emyde +emyds +enact +enarm +enate +ended +ender +endew +endow +endue +enema +enemy +enews +enfix +eniac +enjoy +enlit +enmew +ennog +ennui +enoki +enols +enorm +enows +enrol +ensew +ensky +ensue +enter +entia +entry +enure +enurn +envoi +envoy +enzym +eorls +eosin +epact +epees +ephah +ephas +ephod +ephor +epics +epoch +epode +epopt +epoxy +epris +equal +equid +equip +erase +erbia +erect +erevs +ergon +ergos +ergot +erhus +erica +erick +erics +ering +erned +ernes +erode +erose +erred +error +erses +eruct +erugo +erupt +eruvs +erven +ervil +escar +escot +esile +eskar +esker +esnes +essay +esses +ester +estoc +estop +estro +etage +etape +etats +etens +ethal +ether +ethic +ethos +ethyl +etnas +ettin +ettle +etude +etuis +etwee +etyma +eughs +euked +eupad +euros +eusol +evade +evens +event +evert +every +evets +evhoe +evict +evils +evite +evohe +evoke +ewers +ewest +ewhow +ewked +exact +exalt +exams +excel +exeat +execs +exeem +exeme +exert +exies +exile +exine +exing +exist +exits +exode +exons +expat +expel +expos +extol +extra +exude +exuls +exult +exurb +eyass +eyers +eying +eyots +eyras +eyres +eyrie +eyrir +fabby +fable +faced +facer +faces +facet +facia +facts +faddy +faded +fader +fades +fadge +fados +faena +faery +faffs +faggy +fagin +fagot +faiks +fails +faine +fains +faint +fairs +fairy +faith +faked +faker +fakes +fakey +fakie +fakir +falaj +falls +false +famed +fames +fanal +fancy +fands +fanes +fanga +fango +fangs +fanks +fanny +fanon +fanos +fanum +faqir +farad +farce +farci +farcy +fards +fared +farer +fares +farle +farls +farms +faros +farse +farts +fasci +fasti +fasts +fatal +fated +fates +fatly +fatso +fatty +fatwa +faugh +fauld +fault +fauna +fauns +faurd +fauts +fauve +favas +favel +faver +faves +favor +favus +fawns +fawny +faxed +faxes +fayed +fayer +fayne +fayre +fazed +fazes +feals +feare +fears +feart +fease +feast +feats +feaze +fecal +feces +fecht +fecit +fecks +fedex +feebs +feeds +feels +feens +feers +feese +feeze +fehme +feign +feint +feist +felch +felid +fella +fells +felly +felon +felts +felty +femal +femes +femme +femmy +femur +fence +fends +fendy +fenis +fenks +fenny +fents +feods +feoff +feral +ferer +feres +feria +ferly +fermi +ferms +ferns +ferny +ferry +fesse +festa +fests +festy +fetal +fetas +fetch +feted +fetes +fetid +fetor +fetta +fetts +fetus +fetwa +feuar +feuds +feued +fever +fewer +feyed +feyer +feyly +fezes +fezzy +fiars +fiats +fiber +fibre +fibro +fices +fiche +fichu +ficin +ficos +ficus +fides +fidge +fidos +fiefs +field +fiend +fient +fiere +fiers +fiery +fiest +fifed +fifer +fifes +fifth +fifty +fight +figos +fiked +fikes +filar +filch +filed +filer +files +filet +filii +fille +fillo +fills +filly +filmi +films +filmy +filos +filth +filum +final +finca +finch +finds +fined +finer +fines +finis +finks +finny +finos +fiord +fiqhs +fique +fired +firer +fires +firie +firks +firms +firns +firry +first +firth +fiscs +fishy +fisks +fists +fisty +fitch +fitly +fitna +fitte +fitts +fiver +fives +fixed +fixer +fixes +fixit +fizzy +fjeld +fjord +flabs +flack +flaff +flags +flail +flair +flake +flaks +flaky +flame +flamm +flams +flamy +flank +flans +flaps +flare +flary +flash +flask +flats +flava +flawn +flaws +flawy +flaxy +flays +fleam +fleas +fleck +fleer +flees +fleet +flegs +fleme +flesh +flews +flexo +fleys +flick +flics +flied +flier +flies +flimp +flims +fling +flint +flips +flirs +flirt +flisk +flite +flits +flitt +float +flobs +flock +flocs +floes +flogs +flong +flood +floor +flops +flora +flors +flory +flosh +floss +flota +flote +flour +flout +flown +flows +flubs +flued +flues +fluey +fluff +fluid +fluke +fluky +flume +flump +flung +flunk +fluor +flurr +flush +flute +fluty +fluyt +flyby +flyer +flype +flyte +foals +foams +foamy +focal +focus +foehn +fogey +foggy +fogie +fogle +fogou +fohns +foids +foils +foins +foist +folds +foley +folia +folic +folie +folio +folks +folky +folly +fomes +fonda +fonds +fondu +fonly +fonts +foods +foody +foots +footy +foram +foray +forbs +forby +force +fordo +fords +forel +fores +forex +forge +forgo +forks +forky +forme +forms +forte +forth +forts +forty +forum +forza +forze +fossa +fosse +fouat +fouds +fouer +fouet +found +fount +fours +fouth +fovea +fowls +fowth +foxed +foxes +foxie +foyer +foyle +foyne +frabs +frack +fract +frags +frail +fraim +frame +franc +frank +frape +fraps +frass +frate +frati +frats +fraud +fraus +frays +freak +freed +freer +frees +freet +freit +fremd +frena +frere +fresh +frets +friar +fribs +fried +frier +fries +frigs +frill +frise +frisk +frist +frith +frits +fritt +fritz +frize +frizz +frock +froes +frogs +frond +frons +front +frore +frorn +frory +frosh +frost +froth +frown +frows +frowy +froze +frugs +fruit +frump +frush +frust +fryer +fubby +fubsy +fucus +fuddy +fudge +fuels +fuero +fuffs +fuffy +fugal +fugle +fugly +fugus +fujis +fulls +fully +fumed +fumer +fumes +fumet +fundi +funds +fundy +fungi +funks +funky +funny +fural +furan +furca +furls +furol +furor +furrs +furry +furth +furze +furzy +fused +fusee +fusel +fuses +fusil +fussy +fusts +fusty +futon +fuzed +fuzee +fuzes +fuzil +fuzzy +fyces +fyked +fykes +fyles +fyrds +fytte +gabba +gabby +gable +gaddi +gades +gadge +gadid +gadis +gadje +gadjo +gadso +gaffe +gaffs +gaged +gager +gages +gaids +gaily +gains +gairs +gaita +gaits +gaitt +gajos +galah +galas +galax +galea +gales +galls +gally +galop +galut +galvo +gamas +gamay +gamba +gambe +gambo +gambs +gamed +gamer +games +gamey +gamic +gamin +gamma +gamme +gammy +gamps +gamut +ganch +gandy +ganef +ganev +gangs +ganja +ganof +gants +gaols +gaped +gaper +gapes +gapos +gappy +garbe +garbo +garbs +garda +garis +garni +garre +garth +garum +gases +gasps +gaspy +gassy +gasts +gated +gater +gates +gaths +gator +gaucy +gauds +gaudy +gauge +gauje +gault +gaums +gaumy +gaunt +gaups +gaurs +gauss +gauze +gauzy +gavel +gavot +gawcy +gawds +gawks +gawky +gawps +gawsy +gazal +gazar +gazed +gazer +gazes +gazon +gazoo +geals +geans +geare +gears +geats +gebur +gecko +gecks +geeks +geeky +geeps +geese +geest +geist +geits +gelds +gelee +gelid +gelly +gelts +gemel +gemma +gemmy +gemot +genal +genas +genes +genet +genic +genie +genii +genny +genoa +genom +genre +genro +gents +genty +genua +genus +geode +geoid +gerah +gerbe +geres +gerle +germs +germy +gerne +gesse +gesso +geste +gests +getas +getup +geums +geyan +geyer +ghast +ghats +ghaut +ghazi +ghees +ghest +ghost +ghoul +ghyll +giant +gibed +gibel +giber +gibes +gibli +gibus +giddy +gifts +gigas +gighe +gigot +gigue +gilas +gilds +gilet +gills +gilly +gilpy +gilts +gimel +gimme +gimps +gimpy +ginge +gings +ginks +ginny +ginzo +gipon +gippo +gippy +gipsy +girds +girls +girly +girns +giron +giros +girrs +girsh +girth +girts +gismo +gisms +gists +gites +giust +gived +given +giver +gives +gizmo +glace +glade +glads +glady +glaik +glair +glams +gland +glans +glare +glary +glass +glaum +glaur +glaze +glazy +gleam +glean +gleba +glebe +gleby +glede +gleds +gleed +gleek +glees +gleet +gleis +glens +glent +gleys +glial +glias +glibs +glide +gliff +glift +glike +glime +glims +glint +glisk +glits +glitz +gloam +gloat +globe +globi +globs +globy +glode +glogg +gloms +gloom +gloop +glops +glory +gloss +glost +glout +glove +glows +gloze +glued +gluer +glues +gluey +glugs +glume +glums +gluon +glute +gluts +glyph +gnarl +gnarr +gnars +gnash +gnats +gnawn +gnaws +gnome +gnows +goads +goafs +goals +goary +goats +goaty +goban +gobar +gobbi +gobbo +gobby +gobis +gobos +godet +goels +goers +goest +goeth +goety +gofer +goffs +gogga +gogos +goier +going +gojis +golds +goldy +golem +goles +golfs +golly +golpe +golps +gombo +gomer +gompa +gonad +gonef +goner +gongs +gonia +gonif +gonks +gonna +gonof +gonys +gonzo +gooby +goods +goody +gooey +goofs +goofy +googs +goold +gools +gooly +goops +goopy +goors +goory +goose +goosy +gopak +gopik +goral +goras +gored +gores +gorge +goris +gorms +gormy +gorps +gorse +gorsy +gosht +gosse +goths +gotta +gouch +gouge +gouks +goura +gourd +gouts +gouty +gowan +gowds +gowfs +gowks +gowls +gowns +goxes +goyim +goyle +graal +grabs +grace +grade +grads +graff +graft +grail +grain +graip +grama +grame +gramp +grams +grana +grand +grans +grant +grape +graph +grapy +grasp +grass +grate +grave +gravs +gravy +grays +graze +great +grebe +grebo +grece +greed +greek +green +grees +greet +grege +grego +grein +grens +grese +greve +grews +greys +grice +gride +grids +grief +griff +grift +grigs +grike +grill +grime +grimy +grind +grins +griot +gripe +grips +gript +gripy +grise +grist +grisy +grith +grits +grize +groan +groat +grody +grogs +groin +groks +groma +grone +groof +groom +grope +gross +grosz +grots +grouf +group +grout +grove +growl +grown +grows +grrls +grrrl +grubs +grued +gruel +grues +grufe +gruff +grume +grump +grund +grunt +gryce +gryde +gryke +grype +grypt +guaco +guana +guano +guans +guard +guars +guava +gucks +gucky +gudes +guess +guest +guffs +gugas +guide +guids +guild +guile +guilt +guimp +guiro +guise +gulag +gular +gulas +gulch +gules +gulet +gulfs +gulfy +gulls +gully +gulph +gulps +gulpy +gumbo +gumma +gummy +gumps +gundy +gunge +gungy +gunks +gunky +gunny +guppy +guqin +gurge +gurls +gurly +gurns +gurry +gursh +gurus +gushy +gusla +gusle +gusli +gussy +gusto +gusts +gusty +gutsy +gutta +gutty +guyed +guyle +guyot +guyse +gwine +gyals +gybed +gybes +gyeld +gymps +gynae +gynie +gynny +gyoza +gyppo +gyppy +gypsy +gyral +gyred +gyres +gyron +gyros +gyrus +gytes +gyved +gyves +haafs +haars +habit +hable +habus +hacek +hacks +hadal +haded +hades +hadst +haems +haets +haffs +hafis +hafiz +hafts +haggs +hahas +haick +haika +haiks +haiku +hails +haily +hains +haint +hairs +hairy +hakus +haled +haler +hales +halfa +halfs +halid +hallo +halls +halma +halms +halon +halos +halse +halts +halva +halve +hamal +hamba +hamed +hames +hammy +hamza +hanap +hance +hanch +hands +handy +hangi +hangs +hanks +hanky +hansa +hanse +hants +haole +haoma +hapax +haply +happy +hapus +hards +hardy +hared +harem +hares +harim +harks +harls +harms +harns +haros +harps +harpy +harry +harsh +harts +hashy +hasks +hasps +hasta +haste +hasty +hatch +hated +hater +hates +hatha +hauds +haufs +haugh +hauld +haulm +hauls +hault +haunt +hause +haute +haven +haver +haves +havoc +hawed +hawks +hawms +hawse +hayed +hayer +hayey +hayle +hazan +hazed +hazel +hazer +hazes +heads +heady +heald +heals +heame +heaps +heapy +heard +heare +hears +heart +heast +heath +heats +heave +heavy +heben +hebes +hecht +hecks +heder +hedge +hedgy +heeds +heedy +heels +heeze +hefte +hefts +hefty +heids +heigh +heils +heirs +heist +hejab +hejra +heled +heles +helio +helix +hello +hells +helms +helos +helot +helps +helve +hemal +hemes +hemic +hemin +hemps +hempy +hence +hends +henge +henna +henny +henry +hents +hepar +herbs +herby +herds +heres +herls +herma +herms +herns +heron +heros +herry +herse +hertz +herye +hesps +hests +hetes +heths +heuch +heugh +hevea +hewed +hewer +hewgh +hexad +hexed +hexer +hexes +hexyl +heyed +hiant +hicks +hided +hider +hides +hiems +highs +hight +hijab +hijra +hiked +hiker +hikes +hikoi +hilar +hilch +hillo +hills +hilly +hilts +hilum +hilus +himbo +hinau +hinds +hinge +hings +hinky +hinny +hints +hiois +hiply +hippo +hippy +hired +hiree +hirer +hires +hissy +hists +hitch +hithe +hived +hiver +hives +hizen +hoaed +hoagy +hoard +hoars +hoary +hoast +hobby +hobos +hocks +hocus +hodad +hodja +hoers +hogan +hogen +hoggs +hoghs +hohed +hoick +hoiks +hoing +hoise +hoist +hokas +hoked +hokes +hokey +hokis +hokku +hokum +holds +holed +holes +holey +holks +holla +hollo +holly +holms +holon +holts +homas +homed +homer +homes +homey +homie +homme +honan +honda +honds +honed +honer +hones +honey +hongi +hongs +honks +honky +honor +hooch +hoods +hoody +hooey +hoofs +hooka +hooks +hooky +hooly +hoons +hoops +hoord +hoors +hoosh +hoots +hooty +hoove +hoped +hoper +hopes +hoppy +horah +horal +horas +horde +horis +horme +horns +horny +horse +horst +horsy +hosed +hosel +hosen +hoser +hoses +hosey +hosta +hosts +hotch +hotel +hoten +hotly +hotty +houff +houfs +hough +hound +houri +hours +house +houts +hovea +hoved +hovel +hoven +hover +hoves +howbe +howdy +howes +howff +howfs +howks +howls +howre +howso +hoxed +hoxes +hoyas +hoyed +hoyle +hubby +hucks +hudna +hudud +huers +huffs +huffy +huger +huggy +huhus +huias +hulas +hules +hulks +hulky +hullo +hulls +hully +human +humas +humfs +humic +humid +humor +humph +humps +humpy +humus +hunch +hunks +hunky +hunts +hurds +hurls +hurly +hurra +hurry +hurst +hurts +hushy +husks +husky +husos +hussy +hutch +hutia +huzza +huzzy +hwyls +hydra +hydro +hyena +hyens +hying +hykes +hylas +hyleg +hyles +hylic +hymen +hymns +hynde +hyoid +hyped +hyper +hypes +hypha +hyphy +hypos +hyrax +hyson +hythe +iambi +iambs +ibrik +icers +iched +iches +ichor +icier +icily +icing +icker +ickle +icons +ictal +ictic +ictus +idant +ideal +ideas +idees +ident +idiom +idiot +idled +idler +idles +idola +idols +idyll +idyls +iftar +igapo +igged +igloo +iglus +ihram +ikans +ikats +ikons +ileac +ileal +ileum +ileus +iliac +iliad +ilial +ilium +iller +illth +image +imago +imams +imari +imaum +imbar +imbed +imbue +imide +imido +imids +imine +imino +immew +immit +immix +imped +impel +impis +imply +impot +imshi +imshy +inane +inapt +inarm +inbox +inbye +incle +incog +incur +incus +incut +indew +index +india +indie +indol +indow +indri +indue +inept +inerm +inert +infer +infix +infos +infra +ingan +ingle +ingot +inion +inked +inker +inkle +inlay +inlet +inned +inner +innit +inorb +input +inrun +inset +intel +inter +intil +intis +intra +intro +inula +inure +inurn +inust +invar +inwit +iodic +iodid +iodin +ionic +iotas +ippon +irade +irate +irids +iring +irked +iroko +irone +irons +irony +isbas +ishes +isled +isles +islet +isnae +issei +issue +istle +itchy +items +ither +ivied +ivies +ivory +ixias +ixora +ixtle +izard +izars +izzat +jaaps +jabot +jacal +jacks +jacky +jaded +jades +jafas +jaffa +jagas +jager +jaggs +jaggy +jagir +jagra +jails +jakes +jakey +jalap +jalop +jambe +jambo +jambs +jambu +james +jammy +jamon +janes +janns +janny +janty +japan +japed +japer +japes +jarks +jarls +jarps +jarta +jarul +jasey +jaspe +jasps +jatos +jauks +jaunt +jaups +javas +javel +jawan +jawed +jaxie +jazzy +jeans +jeats +jebel +jedis +jeels +jeely +jeeps +jeers +jefes +jeffs +jehad +jehus +jelab +jello +jells +jelly +jembe +jemmy +jenny +jerid +jerks +jerky +jerry +jesse +jests +jesus +jetes +jeton +jetty +jeune +jewed +jewel +jewie +jhala +jiaos +jibba +jibbs +jibed +jiber +jibes +jiffs +jiffy +jiggy +jigot +jills +jilts +jimmy +jimpy +jingo +jinks +jinne +jinni +jinns +jirds +jirga +jirre +jisms +jived +jiver +jives +jivey +jnana +jobed +jobes +jodel +joeys +johns +joins +joint +joist +joked +joker +jokes +jokey +jokol +joled +joles +jolls +jolly +jolts +jolty +jomon +jomos +jones +jongs +jonty +jooks +joram +jorum +jotas +jotty +jotun +joual +jougs +jouks +joule +jours +joust +jowar +jowed +jowls +jowly +joyed +jubas +jubes +jucos +judas +judge +judos +jugal +jugum +juice +juicy +jujus +juked +jukes +jukus +julep +jumar +jumbo +jumby +jumps +jumpy +junco +junks +junky +junta +junto +jupes +jupon +jural +jurat +jurel +juror +justs +jutes +jutty +juves +juvie +kaama +kabab +kabar +kabob +kacha +kacks +kades +kadis +kafir +kagos +kagus +kahal +kaiak +kaids +kaies +kaifs +kaika +kaiks +kails +kaims +kaing +kains +kakas +kakis +kalam +kales +kalif +kalis +kalpa +kamas +kames +kamik +kamis +kamme +kanae +kanas +kandy +kaneh +kanes +kanga +kangs +kanji +kants +kanzu +kaons +kapas +kaphs +kapok +kappa +kaput +karas +karat +karks +karma +karns +karoo +karos +karri +karst +karsy +karts +karzy +kasha +kasme +katal +katas +katis +katti +kaugh +kauri +kauru +kaury +kaval +kavas +kawas +kawau +kawed +kayak +kayle +kayos +kazis +kazoo +kbars +kebab +kebar +kebob +kecks +kedge +kedgy +keech +keefs +keeks +keels +keema +keeno +keens +keeps +keets +keeve +kefir +kehua +keirs +kelep +kelim +kells +kelly +kelps +kelpy +kelts +kelty +kembo +kembs +kemps +kempt +kempy +kenaf +kench +kendo +kenos +kente +kents +kepis +kerbs +kerel +kerfs +kerky +kerma +kerne +kerns +keros +kerry +kerve +kesar +kests +ketas +ketch +ketes +ketol +kevel +kevil +kexes +keyed +khadi +khafs +khaki +khans +khaph +khats +khaya +khazi +kheda +kheth +khets +khoja +khors +khoum +khuds +kiaat +kiang +kibbe +kibbi +kibei +kibes +kibla +kicks +kicky +kiddo +kiddy +kidel +kidge +kiefs +kiers +kieve +kievs +kight +kikes +kikoi +kiley +kilim +kilns +kilos +kilps +kilts +kilty +kimbo +kinas +kinda +kinds +kindy +kines +kings +kinin +kinks +kinky +kinos +kiore +kiosk +kipes +kippa +kipps +kirby +kirks +kirns +kirri +kisan +kissy +kists +kited +kiter +kites +kithe +kiths +kitty +kitul +kivas +kiwis +klang +klaps +klett +klick +klieg +kliks +klong +kloof +kluge +klutz +knack +knags +knaps +knarl +knars +knaur +knave +knawe +knead +kneed +kneel +knees +knell +knelt +knife +knish +knits +knive +knobs +knock +knoll +knops +knosp +knots +knout +knowe +known +knows +knubs +knurl +knurr +knurs +knuts +koala +koans +koaps +koban +kobos +koels +koffs +kofta +kogal +kohas +kohen +kohls +koine +kojis +kokas +koker +kokra +kokum +kolas +kolos +kombu +konbu +kondo +konks +kooks +kooky +koori +kopek +kophs +kopje +koppa +korai +koras +korat +kores +korma +koros +korun +korus +koses +kotch +kotos +kotow +koura +kraal +krabs +kraft +krait +krang +krans +kranz +kraut +kreep +kreng +krewe +krill +krona +krone +kroon +krubi +krunk +ksars +kudos +kudus +kudzu +kufis +kugel +kuias +kukri +kukus +kulak +kulan +kulas +kulfi +kumys +kuris +kurre +kurta +kurus +kusso +kutas +kutch +kutis +kutus +kuzus +kvass +kvell +kwela +kyack +kyaks +kyang +kyars +kyats +kybos +kydst +kyles +kylie +kylin +kylix +kyloe +kynde +kynds +kypes +kyrie +kytes +kythe +laari +labda +label +labia +labis +labor +labra +laced +lacer +laces +lacet +lacey +lacks +laded +laden +lader +lades +ladle +laers +laevo +lagan +lager +lahar +laich +laics +laids +laigh +laika +laiks +laird +lairs +lairy +laith +laity +laked +laker +lakes +lakhs +lakin +laksa +laldy +lalls +lamas +lambs +lamby +lamed +lamer +lames +lamia +lammy +lamps +lanai +lanas +lance +lanch +lande +lands +lanes +lanks +lanky +lants +lapel +lapin +lapis +lapje +lapse +larch +lards +lardy +laree +lares +large +largo +laris +larks +larky +larns +larum +larva +lased +laser +lases +lassi +lasso +lassu +lasts +latah +latch +lated +laten +later +latex +lathe +lathi +laths +lathy +latke +latte +lauan +lauch +lauds +laufs +laugh +laund +laura +lavas +laved +laver +laves +lavra +lavvy +lawed +lawer +lawin +lawks +lawns +lawny +laxer +laxes +laxly +layed +layer +layin +layup +lazar +lazed +lazes +lazos +lazzi +lazzo +leach +leads +leady +leafs +leafy +leaks +leaky +leams +leans +leant +leany +leaps +leapt +leare +learn +lears +leary +lease +leash +least +leats +leave +leavy +leaze +leben +leccy +ledge +ledgy +ledum +leear +leech +leeks +leeps +leers +leery +leese +leets +leeze +lefte +lefts +lefty +legal +leger +leges +legge +leggy +legit +lehrs +lehua +leirs +leish +leman +lemed +lemel +lemes +lemma +lemon +lemur +lends +lenes +lengs +lenis +lenos +lense +lenti +lento +leone +leper +lepid +lepra +lepta +lered +leres +lerps +lesbo +leses +lests +letch +lethe +letup +leuch +leuco +leuds +leugh +levee +level +lever +leves +levin +levis +lewis +lexes +lexis +lezes +lezza +lezzy +liana +liane +liang +liard +liars +liart +libel +liber +libra +libri +lichi +licht +licit +licks +lidar +lidos +liefs +liege +liens +liers +lieus +lieve +lifer +lifes +lifts +ligan +liger +ligge +light +ligne +liked +liken +liker +likes +likin +lilac +lills +lilos +lilts +liman +limas +limax +limba +limbi +limbo +limbs +limby +limed +limen +limes +limey +limit +limma +limns +limos +limpa +limps +linac +linch +linds +lindy +lined +linen +liner +lines +liney +linga +lingo +lings +lingy +linin +links +linky +linns +linny +linos +lints +linty +linum +linux +lions +lipas +lipid +lipin +lipos +lippy +liras +lirks +lirot +lisks +lisle +lisps +lists +litai +litas +lited +liter +lites +lithe +litho +liths +litre +lived +liven +liver +lives +livid +livor +livre +llama +llano +loach +loads +loafs +loams +loamy +loans +loast +loath +loave +lobar +lobby +lobed +lobes +lobos +lobus +local +lochs +locks +locos +locum +locus +loden +lodes +lodge +loess +lofts +lofty +logan +loges +loggy +logia +logic +logie +login +logoi +logon +logos +lohan +loids +loins +loipe +loirs +lokes +lolls +lolly +lolog +lomas +lomed +lomes +loner +longa +longe +longs +looby +looed +looey +loofa +loofs +looie +looks +looms +loops +loopy +loord +loose +loots +loped +loper +lopes +loppy +loral +loran +lords +lordy +lorel +lores +loric +loris +lorry +losed +losel +losen +loser +loses +lossy +lotah +lotas +lotes +lotic +lotos +lotte +lotto +lotus +loued +lough +louie +louis +louma +lound +louns +loupe +loups +loure +lours +loury +louse +lousy +louts +lovat +loved +lover +loves +lovey +lowan +lowed +lower +lowes +lowly +lownd +lowne +lowns +lowps +lowry +lowse +lowts +loxed +loxes +loyal +lozen +luach +luaus +lubed +lubes +lubra +luces +lucid +lucks +lucky +lucre +ludes +ludic +ludos +luffa +luffs +luged +luger +luges +lulls +lulus +lumas +lumen +lumme +lummy +lumps +lumpy +lunar +lunas +lunch +lunes +lunet +lunge +lungi +lungs +lunks +lunts +lupin +lupus +lurch +lured +lurer +lures +lurex +lurgi +lurgy +lurid +lurks +lurry +lurve +luser +lushy +lusks +lusts +lusty +lusus +lutea +luted +luter +lutes +luvvy +luxes +lweis +lyams +lyard +lyart +lyase +lycea +lycee +lycra +lying +lymes +lymph +lynch +lynes +lyres +lyric +lysed +lyses +lysin +lysis +lysol +lyssa +lyted +lytes +lythe +lytic +lytta +maaed +maare +maars +mabes +macaw +maced +macer +maces +mache +machi +macho +machs +macks +macle +macon +macro +madam +madge +madid +madly +madre +maerl +mafia +mafic +mages +maggs +magic +magma +magot +magus +mahoe +mahua +mahwa +maids +maiko +maiks +maile +maill +mails +maims +mains +maire +mairs +maise +maist +maize +major +makar +maker +makes +makis +makos +malam +malar +malas +malax +males +malic +malik +malis +malls +malms +malmy +malts +malty +malva +malwa +mamas +mamba +mambo +mamee +mamey +mamie +mamma +mammy +manas +manat +mandi +maned +maneh +manes +manet +manga +mange +mango +mangs +mangy +mania +manic +manis +manky +manly +manna +manor +manos +manse +manta +manto +manty +manul +manus +mapau +maple +maqui +marae +marah +maras +march +marcs +mardy +mares +marge +margs +maria +marid +marka +marks +marle +marls +marly +marms +maron +maror +marri +marry +marse +marsh +marts +marvy +masas +mased +maser +mases +mashy +masks +mason +massa +masse +massy +masts +masty +masus +matai +match +mated +mater +mates +matey +maths +matin +matlo +matte +matts +matza +matzo +mauby +mauds +mauls +maund +mauri +mauts +mauve +maven +mavie +mavin +mavis +mawed +mawks +mawky +mawrs +maxed +maxes +maxim +maxis +mayan +mayas +maybe +mayed +mayor +mayos +mayst +mazed +mazer +mazes +mazey +mazut +mbira +meads +meals +mealy +meane +means +meant +meany +meare +mease +meath +meats +meaty +mebos +mecca +mecks +medal +media +medic +medii +medle +meeds +meers +meets +meffs +meins +meint +meiny +meith +mekka +melas +melba +melds +melee +melic +melik +mells +melon +melts +melty +memes +memos +menad +mends +mened +menes +menge +mengs +mensa +mense +mensh +menta +mento +menus +meous +meows +merch +mercs +mercy +merde +mered +merel +merer +meres +merge +meril +meris +merit +merks +merle +merls +merry +merse +mesal +mesas +mesel +meses +meshy +mesic +mesne +meson +messy +mesto +metal +meted +meter +metes +metho +meths +metic +metif +metis +metol +metre +metro +meuse +meved +meves +mewed +mewls +meynt +mezes +mezze +mezzo +mhorr +miaou +miaow +miasm +miaul +micas +miche +micht +micks +micky +micos +micra +micro +middy +midge +midgy +midis +midst +miens +mieve +miffs +miffy +mifty +miggs +might +mihas +mihis +miked +mikes +mikra +milch +milds +miler +miles +milfs +milia +milko +milks +milky +mille +mills +milor +milos +milpa +milts +milty +miltz +mimed +mimeo +mimer +mimes +mimic +mimsy +minae +minar +minas +mince +mincy +minds +mined +miner +mines +minge +mings +mingy +minim +minis +minke +minks +minny +minor +minos +mints +minty +minus +mired +mires +mirex +mirin +mirks +mirky +mirly +miros +mirth +mirvs +mirza +misch +misdo +miser +mises +misgo +misos +missa +missy +mists +misty +mitch +miter +mites +mitis +mitre +mitts +mixed +mixen +mixer +mixes +mixte +mixup +mizen +mizzy +mneme +moans +moats +mobby +mobes +mobey +mobie +moble +mocha +mochs +mochy +modal +model +modem +moder +modes +modge +modii +modus +moers +mofos +moggy +mogul +mohel +mohrs +mohua +mohur +moils +moira +moire +moist +moits +mojos +mokes +mokis +mokos +molal +molar +molas +molds +moldy +moles +molla +molls +molly +molto +molts +momes +momma +mommy +momus +monad +monal +monas +monde +mondo +moner +money +mongo +mongs +monie +monks +monos +monte +month +monty +moobs +mooch +moods +moody +mooed +mooks +moola +mooli +mools +moong +moons +moony +moops +moors +moory +moose +moots +moove +moped +moper +mopes +mopey +moppy +mopsy +mopus +morae +moral +moras +morat +moray +morel +mores +moria +morne +morns +moron +morph +morra +morro +morse +morts +mosed +moses +mosey +mosks +mosso +mossy +moste +mosts +moted +motel +moten +motes +motet +motey +moths +mothy +motif +motis +motor +motte +motto +motts +motty +motus +motza +mouch +moues +mould +mouls +moult +mound +mount +moups +mourn +mouse +moust +mousy +mouth +moved +mover +moves +movie +mowas +mowed +mower +mowra +moxas +moxie +moyas +moyle +moyls +mozed +mozes +mozos +mpret +mucho +mucic +mucid +mucin +mucks +mucky +mucor +mucro +mucus +muddy +mudge +mudir +mudra +muffs +mufti +mugga +muggs +muggy +muhly +muids +muils +muirs +muist +mujik +mulch +mulct +muled +mules +muley +mulga +mulla +mulls +mulse +mulsh +mumms +mummy +mumps +mumsy +mumus +munch +munis +munts +muntu +muons +mural +muras +mured +mures +murex +murid +murks +murky +murls +murly +murra +murre +murri +murrs +murry +murti +murva +musar +musca +mused +muser +muses +muset +musha +mushy +music +musit +musks +musky +musos +musse +mussy +musth +musts +musty +mutch +muted +muter +mutes +mutha +mutis +muton +mutts +muxed +muxes +muzzy +mvule +myall +mylar +mynah +mynas +myoid +myoma +myope +myops +myopy +myrrh +mysid +mythi +myths +mythy +myxos +mzees +naams +naans +nabes +nabis +nabks +nabla +nabob +nache +nacho +nacre +nadas +nadir +naeve +naevi +naffs +nagas +naggy +nagor +nahal +naiad +naifs +naiks +nails +naira +nairu +naive +naked +naker +nakfa +nalas +naled +nalla +named +namer +names +namma +namus +nanas +nance +nancy +nandu +nanna +nanny +nanua +napas +naped +napes +napoo +nappa +nappe +nappy +naras +narco +narcs +nards +nares +naric +naris +narks +narky +narre +nasal +nashi +nasty +natal +natch +nates +natis +natty +nauch +naunt +naval +navar +navel +naves +navew +navvy +nawab +nazes +nazir +nazis +neafe +neals +neaps +nears +neath +neats +nebek +nebel +necks +neddy +needs +needy +neeld +neele +neemb +neems +neeps +neese +neeze +negro +negus +neifs +neigh +neist +neive +nelis +nelly +nemas +nemns +nempt +nenes +neons +neper +nepit +neral +nerds +nerdy +nerka +nerks +nerol +nerts +nertz +nerve +nervy +nests +netes +netop +netts +netty +neuks +neume +neums +nevel +never +neves +nevus +newed +newel +newer +newie +newly +newsy +newts +nexts +nexus +ngaio +ngana +ngati +ngoma +ngwee +nicad +nicer +niche +nicht +nicks +nicol +nidal +nided +nides +nidor +nidus +niece +niefs +nieve +nifes +niffs +niffy +nifty +nighs +night +nihil +nikab +nikah +nikau +nills +nimbi +nimbs +nimps +nines +ninja +ninny +ninon +ninth +nipas +nippy +niqab +nirls +nirly +nisei +nisse +nisus +niter +nites +nitid +niton +nitre +nitro +nitry +nitty +nival +nixed +nixer +nixes +nixie +nizam +nkosi +noahs +nobby +noble +nobly +nocks +nodal +noddy +nodes +nodus +noels +noggs +nohow +noils +noily +noint +noirs +noise +noisy +noles +nolls +nolos +nomad +nomas +nomen +nomes +nomic +nomoi +nomos +nonas +nonce +nones +nonet +nongs +nonis +nonny +nonyl +noobs +nooit +nooks +nooky +noons +noops +noose +nopal +noria +noris +norks +norma +norms +north +nosed +noser +noses +nosey +notal +notch +noted +noter +notes +notum +nould +noule +nouls +nouns +nouny +noups +novae +novas +novel +novum +noway +nowed +nowls +nowts +nowty +noxal +noxes +noyau +noyed +noyes +nubby +nubia +nucha +nuddy +nuder +nudes +nudge +nudzh +nuffs +nugae +nuked +nukes +nulla +nulls +numbs +numen +nunny +nurds +nurdy +nurls +nurrs +nurse +nutso +nutsy +nutty +nyaff +nyala +nying +nylon +nymph +nyssa +oaked +oaken +oaker +oakum +oared +oases +oasis +oasts +oaten +oater +oaths +oaves +obang +obeah +obeli +obese +obeys +obias +obied +obiit +obits +objet +oboes +obole +oboli +obols +occam +occur +ocean +ocher +oches +ochre +ochry +ocker +ocrea +octad +octal +octan +octas +octet +octyl +oculi +odahs +odals +odder +oddly +odeon +odeum +odism +odist +odium +odors +odour +odyle +odyls +ofays +offal +offed +offer +offie +oflag +often +ofter +ogams +ogeed +ogees +oggin +ogham +ogive +ogled +ogler +ogles +ogmic +ogres +ohias +ohing +ohmic +ohone +oidia +oiled +oiler +oinks +oints +ojime +okapi +okays +okehs +okras +oktas +olden +older +oldie +oleic +olein +olent +oleos +oleum +olios +olive +ollas +ollav +oller +ollie +ology +olpae +olpes +omasa +omber +ombre +ombus +omega +omens +omers +omits +omlah +omovs +omrah +oncer +onces +oncet +oncus +onely +oners +onery +onion +onium +onkus +onlay +onned +onset +ontic +oobit +oohed +oomph +oonts +ooped +oorie +ooses +ootid +oozed +oozes +opahs +opals +opens +opepe +opera +opine +oping +opium +oppos +opsin +opted +opter +optic +orach +oracy +orals +orang +orant +orate +orbed +orbit +orcas +orcin +order +ordos +oread +orfes +organ +orgia +orgic +orgue +oribi +oriel +orixa +orles +orlon +orlop +ormer +ornis +orpin +orris +ortho +orval +orzos +oscar +oshac +osier +osmic +osmol +ossia +ostia +otaku +otary +other +ottar +otter +ottos +oubit +oucht +ouens +ought +ouija +oulks +oumas +ounce +oundy +oupas +ouped +ouphe +ouphs +ourie +ousel +ousts +outby +outdo +outed +outer +outgo +outre +outro +ouzel +ouzos +ovals +ovary +ovate +ovels +ovens +overs +overt +ovine +ovist +ovoid +ovoli +ovolo +ovule +owche +owing +owled +owler +owlet +owned +owner +owres +owrie +owsen +oxbow +oxers +oxeye +oxide +oxids +oxies +oxime +oxims +oxlip +oxter +oyers +ozeki +ozone +ozzie +paals +paans +pacas +paced +pacer +paces +pacey +pacha +packs +pacos +pacta +pacts +paddy +padis +padle +padma +padre +padri +paean +paedo +paeon +pagan +paged +pager +pages +pagle +pagri +paiks +pails +pains +paint +paire +pairs +paisa +paise +pakka +palas +palay +palea +paled +paler +pales +palet +palki +palla +palls +pally +palms +palmy +palpi +palps +palsy +pampa +panax +pance +panda +pands +pandy +paned +panel +panes +panga +pangs +panic +panim +panko +panne +pansy +panto +pants +panty +paoli +paolo +papal +papas +papaw +paper +papes +pappi +pappy +parae +paras +parch +pardi +pards +pardy +pared +pareo +parer +pares +pareu +parev +parge +pargo +paris +parka +parki +parks +parky +parle +parly +parol +parps +parra +parrs +parry +parse +parti +parts +party +parve +parvo +paseo +pases +pasha +pashm +paspy +passe +pasta +paste +pasts +pasty +patch +pated +paten +pater +pates +paths +patin +patio +patka +patly +patsy +patte +patty +patus +pauas +pauls +pause +pavan +paved +paven +paver +paves +pavid +pavin +pavis +pawas +pawaw +pawed +pawer +pawks +pawky +pawls +pawns +paxes +payed +payee +payer +payor +paysd +peace +peach +peage +peags +peaks +peaky +peals +peans +peare +pearl +pears +peart +pease +peats +peaty +peavy +peaze +pebas +pecan +pechs +pecke +pecks +pecky +pedal +pedes +pedro +peece +peeks +peels +peens +peeoy +peepe +peeps +peers +peery +peeve +peggy +peghs +peins +peise +peize +pekan +pekes +pekin +pekoe +pelas +peles +pelfs +pells +pelma +pelon +pelta +pelts +penal +pence +pends +pendu +pened +penes +pengo +penks +penna +penne +penny +pents +peony +pepla +pepos +peppy +perai +perce +perch +perdu +perdy +perea +peres +peris +perks +perky +perms +perns +perps +perry +perse +perst +perts +perve +pervs +pervy +pesky +pesos +pesto +pests +pesty +petal +petar +peter +petit +petre +petri +petti +petto +petty +pewee +pewit +peyse +phage +phang +phare +pharm +phase +pheer +phene +pheon +phese +phial +phlox +phoca +phone +phono +phons +phony +photo +phots +phpht +phuts +phyla +phyle +piani +piano +pians +pibal +pical +picas +piccy +picks +picky +picot +picra +picul +piece +piend +piers +piert +pieta +piets +piety +piezo +piggy +pight +pigmy +piing +pikas +pikau +piked +piker +pikes +pikey +pikis +pikul +pilaf +pilao +pilar +pilau +pilaw +pilch +pilea +piled +pilei +piler +piles +pilis +pills +pilot +pilow +pilum +pilus +pimas +pimps +pinas +pinch +pined +pines +piney +pingo +pings +pinko +pinks +pinky +pinna +pinny +pinon +pinot +pinta +pinto +pints +pinup +pions +piony +pious +pioye +pioys +pipal +pipas +piped +piper +pipes +pipet +pipis +pipit +pippy +pipul +pique +pirai +pirls +pirns +pirog +pisco +pises +pisky +pisos +pissy +piste +pitas +pitch +piths +pithy +piton +pitta +piums +pivot +pixel +pixes +pixie +pized +pizes +pizza +plaas +place +plack +plage +plaid +plain +plait +plane +plank +plans +plant +plaps +plash +plasm +plast +plate +plats +platy +playa +plays +plaza +plead +pleas +pleat +plebe +plebs +plena +pleon +plesh +plews +plica +plied +plier +plies +plims +pling +plink +ploat +plods +plong +plonk +plook +plops +plots +plotz +plouk +plows +ploys +pluck +plues +pluff +plugs +plumb +plume +plump +plums +plumy +plunk +plush +plyer +poach +poaka +poake +poboy +pocks +pocky +podal +poddy +podex +podge +podgy +podia +poems +poeps +poesy +poets +pogey +pogge +pogos +poilu +poind +point +poise +pokal +poked +poker +pokes +pokey +pokie +polar +poled +poler +poles +poley +polio +polis +polje +polka +polks +polls +polly +polos +polts +polyp +polys +pombe +pomes +pommy +pomos +pomps +ponce +poncy +ponds +pones +poney +ponga +pongo +pongs +pongy +ponks +ponts +ponty +ponzu +pooch +poods +pooed +poofs +poofy +poohs +pooja +pooka +pooks +pools +poons +poori +poort +poots +poove +poovy +popes +poppa +poppy +popsy +porae +poral +porch +pored +porer +pores +porge +porgy +porks +porky +porno +porns +porny +porta +ports +porty +posed +poser +poses +posey +posho +posit +posse +posts +potae +potch +poted +potes +potin +potoo +potsy +potto +potts +potty +pouch +pouff +poufs +pouke +pouks +poule +poulp +poult +pound +poupe +poupt +pours +pouts +pouty +powan +power +powin +pownd +powns +powny +powre +poxed +poxes +poynt +poyou +poyse +pozzy +praam +prads +prahu +prams +prana +prang +prank +praos +prase +prate +prats +pratt +praty +praus +prawn +prays +predy +preed +preen +prees +preif +prems +premy +prent +preon +preop +preps +presa +prese +press +prest +preve +prexy +preys +prial +price +prick +pricy +pride +pried +prief +prier +pries +prigs +prill +prima +prime +primi +primo +primp +prims +primy +prink +print +prion +prior +prise +prism +priss +privy +prize +proas +probe +probs +prods +proem +profs +progs +proin +proke +prole +proll +promo +proms +prone +prong +pronk +proof +props +prore +prose +proso +pross +prost +prosy +proto +proud +proul +prove +prowl +prows +proxy +proyn +prude +prune +prunt +pruta +pryer +pryse +psalm +pseud +pshaw +psion +psoae +psoai +psoas +psora +psych +psyop +pubco +pubes +pubic +pubis +pucan +pucer +puces +pucka +pucks +puddy +pudge +pudgy +pudic +pudor +pudsy +pudus +puers +puffs +puffy +puggy +pugil +puhas +pujah +pujas +pukas +puked +puker +pukes +pukey +pukka +pukus +pulao +pulas +puled +puler +pules +pulik +pulis +pulka +pulks +pulli +pulls +pulmo +pulps +pulpy +pulse +pulus +pumas +pumie +pumps +punas +punce +punch +punga +pungs +punji +punka +punks +punky +punny +punto +punts +punty +pupae +pupal +pupas +pupil +puppy +pupus +purda +pured +puree +purer +pures +purge +purin +puris +purls +purpy +purrs +purse +pursy +purty +puses +pushy +pusle +pussy +putid +puton +putti +putto +putts +putty +puzel +pyats +pyets +pygal +pygmy +pyins +pylon +pyned +pynes +pyoid +pyots +pyral +pyran +pyres +pyrex +pyric +pyros +pyxed +pyxes +pyxie +pyxis +pzazz +qadis +qaids +qanat +qibla +qophs +qorma +quack +quads +quaff +quags +quail +quair +quais +quake +quaky +quale +qualm +quant +quare +quark +quart +quash +quasi +quass +quate +quats +quayd +quays +qubit +quean +queen +queer +quell +queme +quena +quern +query +quest +queue +queyn +queys +quich +quick +quids +quiet +quiff +quill +quilt +quims +quina +quine +quino +quins +quint +quipo +quips +quipu +quire +quirk +quirt +quist +quite +quits +quoad +quods +quoif +quoin +quoit +quoll +quonk +quops +quota +quote +quoth +quyte +rabat +rabid +raced +racer +races +rache +racks +racon +radar +radge +radii +radio +radix +radon +raffs +rafts +ragas +ragde +raged +ragee +rager +rages +ragga +raggs +raggy +ragis +ragus +rahed +rahui +raias +raids +raiks +raile +rails +raine +rains +rainy +raird +raise +raita +raits +rajah +rajas +rajes +raked +rakee +raker +rakes +rakia +rakis +rakus +rales +rally +ralph +ramal +ramee +ramen +ramet +ramie +ramin +ramis +rammy +ramps +ramus +ranas +rance +ranch +rands +randy +ranee +ranga +range +rangi +rangy +ranid +ranis +ranke +ranks +rants +raped +raper +rapes +raphe +rapid +rappe +rared +raree +rarer +rares +rarks +rased +raser +rases +rasps +raspy +rasse +rasta +ratal +ratan +ratas +ratch +rated +ratel +rater +rates +ratha +rathe +raths +ratio +ratoo +ratos +ratty +ratus +rauns +raupo +raved +ravel +raven +raver +raves +ravin +rawer +rawin +rawly +rawns +raxed +raxes +rayah +rayas +rayed +rayle +rayne +rayon +razed +razee +razer +razes +razoo +razor +reach +react +readd +reads +ready +reaks +realm +realo +reals +reame +reams +reamy +reans +reaps +rearm +rears +reast +reata +reate +reave +rebar +rebbe +rebec +rebel +rebid +rebit +rebop +rebus +rebut +rebuy +recal +recap +recce +recco +reccy +recit +recks +recon +recta +recti +recto +recur +recut +redan +redds +reddy +reded +redes +redia +redid +redip +redly +redon +redos +redox +redry +redub +redux +redye +reech +reede +reeds +reedy +reefs +reefy +reeks +reeky +reels +reens +reest +reeve +refed +refel +refer +reffo +refit +refix +refly +refry +regal +regar +reges +reggo +regie +regma +regna +regos +regur +rehab +rehem +reifs +reify +reign +reiki +reiks +reink +reins +reird +reist +reive +rejig +rejon +reked +rekes +rekey +relax +relay +relet +relic +relie +relit +reman +remap +remen +remet +remex +remit +remix +renal +renay +rends +renew +reney +renga +renin +renne +rente +rents +reoil +repay +repeg +repel +repin +repla +reply +repos +repot +repps +repro +reran +rerig +rerun +resat +resaw +resay +resee +reses +reset +resew +resid +resin +resit +resod +resow +resto +rests +resty +retag +retax +retch +retem +retia +retie +retro +retry +reuse +revel +revet +revie +revue +rewan +rewax +rewed +rewet +rewin +rewon +rewth +rexes +rheas +rheme +rheum +rhies +rhime +rhine +rhino +rhody +rhomb +rhone +rhumb +rhyme +rhyne +rhyta +riads +rials +riant +riata +ribas +ribby +ribes +riced +ricer +rices +ricey +richt +ricin +ricks +rider +rides +ridge +ridgy +riels +riems +rieve +rifer +riffs +rifle +rifte +rifts +rifty +riggs +right +rigid +rigol +rigor +riled +riles +riley +rille +rills +rimae +rimed +rimer +rimes +rimus +rinds +rindy +rines +rings +rinks +rinse +rioja +riots +riped +ripen +riper +ripes +ripps +risen +riser +rises +rishi +risks +risky +risps +risus +rites +ritts +ritzy +rival +rivas +rived +rivel +riven +river +rives +rivet +riyal +rizas +roach +roads +roams +roans +roars +roary +roast +roate +robed +robes +robin +roble +robot +rocks +rocky +roded +rodeo +rodes +roger +rogue +roguy +roils +roily +roins +roist +rojak +rojis +roked +roker +rokes +rolag +roles +rolfs +rolls +romal +roman +romeo +romps +ronde +rondo +roneo +rones +ronin +ronne +ronte +ronts +roods +roofs +roofy +rooks +rooky +rooms +roomy +roons +roops +roopy +roosa +roose +roost +roots +rooty +roped +roper +ropes +ropey +roque +roral +rores +roric +rorid +rorie +rorts +rorty +rosed +roses +roset +roshi +rosin +rosit +rosti +rosts +rotal +rotan +rotas +rotch +roted +rotes +rotis +rotls +roton +rotor +rotos +rotte +rouen +roues +rouge +rough +roule +rouls +roums +round +roups +roupy +rouse +roust +route +routh +routs +roved +roven +rover +roves +rowan +rowdy +rowed +rowel +rowen +rower +rowme +rownd +rowth +rowts +royal +royne +royst +rozet +rozit +ruana +rubai +rubby +rubel +rubes +rubin +ruble +rubus +ruche +rucks +rudas +rudds +ruddy +ruder +rudes +rudie +rueda +ruers +ruffe +ruffs +rugae +rugal +rugby +ruggy +ruing +ruins +rukhs +ruled +ruler +rules +rumal +rumba +rumbo +rumen +rumes +rumly +rummy +rumor +rumpo +rumps +rumpy +runch +runds +runed +runes +rungs +runic +runny +runts +runty +rupee +rupia +rural +rurps +rurus +rusas +ruses +rushy +rusks +rusma +russe +rusts +rusty +ruths +rutin +rutty +ryals +rybat +ryked +rykes +rymme +rynds +ryots +ryper +saags +sabal +sabed +saber +sabes +sabha +sabin +sabir +sable +sabot +sabra +sabre +sacks +sacra +saddo +sades +sadhe +sadhu +sadis +sadly +sados +sadza +safed +safer +safes +sagas +sager +sages +saggy +sagos +sagum +saheb +sahib +saice +saick +saics +saids +saiga +sails +saims +saine +sains +saint +sairs +saist +saith +sajou +sakai +saker +sakes +sakia +sakis +salad +salal +salep +sales +salet +salic +salix +salle +sally +salmi +salol +salon +salop +salpa +salps +salsa +salse +salto +salts +salty +salue +salve +salvo +saman +samas +samba +sambo +samek +samel +samen +sames +samey +samfu +sammy +sampi +samps +sands +sandy +saned +saner +sanes +sanga +sangh +sango +sangs +sanko +sansa +santo +sants +saola +sapan +sapid +sapor +sappy +saran +sards +sared +saree +sarge +sargo +sarin +saris +sarks +sarky +sarod +saros +sarus +saser +sasin +sasse +sassy +satai +satay +sated +satem +sates +satin +satis +satyr +sauba +sauce +sauch +saucy +saugh +sauls +sault +sauna +saunt +saury +saute +sauts +saved +saver +saves +savey +savin +savor +savoy +savvy +sawah +sawed +sawer +saxes +sayed +sayer +sayid +sayne +sayon +sayst +sazes +scabs +scads +scaff +scags +scail +scala +scald +scale +scall +scalp +scaly +scamp +scams +scand +scans +scant +scapa +scape +scapi +scare +scarf +scarp +scars +scart +scary +scath +scats +scatt +scaud +scaup +scaur +scaws +sceat +scena +scend +scene +scent +schav +schmo +schul +schwa +scion +sclim +scody +scoff +scogs +scold +scone +scoog +scoop +scoot +scopa +scope +scops +score +scorn +scots +scoug +scoup +scour +scout +scowl +scowp +scows +scrab +scrae +scrag +scram +scran +scrap +scrat +scraw +scray +scree +screw +scrim +scrip +scrod +scrog +scrow +scrub +scrum +scuba +scudi +scudo +scuds +scuff +scuft +scugs +sculk +scull +sculp +sculs +scums +scups +scurf +scurs +scuse +scuta +scute +scuts +scuzz +scyes +sdayn +sdein +seals +seame +seams +seamy +seans +seare +sears +sease +seats +seaze +sebum +secco +sechs +sects +sedan +seder +sedes +sedge +sedgy +sedum +seeds +seedy +seeks +seeld +seels +seely +seems +seeps +seepy +seers +sefer +segar +segni +segno +segol +segos +segue +sehri +seifs +seils +seine +seirs +seise +seism +seity +seize +sekos +sekts +selah +seles +selfs +sella +selle +sells +selva +semee +semen +semes +semie +semis +senas +sends +senes +sengi +senna +senor +sensa +sense +sensi +sente +senti +sents +senvy +senza +sepad +sepal +sepia +sepic +sepoy +septa +septs +serac +serai +seral +sered +serer +seres +serfs +serge +seric +serif +serin +serks +seron +serow +serra +serre +serrs +serry +serum +serve +servo +sesey +sessa +setae +setal +seton +setts +setup +seven +sever +sewan +sewar +sewed +sewel +sewen +sewer +sewin +seyen +shack +shade +shads +shady +shaft +shags +shahs +shake +shako +shakt +shaky +shale +shall +shalm +shalt +shaly +shama +shame +shams +shand +shank +shans +shape +shaps +shard +share +shark +sharn +sharp +shart +shash +shaul +shave +shawl +shawm +shawn +shaws +shaya +shays +shchi +sheaf +sheal +shear +sheas +sheds +sheel +sheen +sheep +sheer +sheet +sheik +shelf +shell +shend +shent +sheol +sherd +shere +shets +sheva +shewn +shews +shiai +shied +shiel +shier +shies +shift +shill +shily +shims +shine +shins +shiny +ships +shire +shirk +shirr +shirs +shirt +shish +shiso +shiur +shiva +shive +shivs +shlep +shlub +shmek +shoal +shoat +shock +shoed +shoer +shoes +shogi +shogs +shoji +shola +shone +shook +shool +shoon +shoos +shoot +shope +shops +shore +shorl +shorn +short +shote +shots +shott +shout +shove +showd +shown +shows +showy +shoyu +shred +shrew +shris +shrow +shrub +shrug +shtik +shtum +shtup +shuck +shule +shuln +shuls +shuns +shunt +shura +shush +shute +shuts +shwas +shyer +shyly +sials +sibbs +sibyl +sices +sicht +sicko +sicks +sidas +sided +sider +sides +sidha +sidhe +sidle +siege +sield +siens +sient +sieth +sieur +sieve +sifts +sighs +sight +sigil +sigla +sigma +signa +signs +sijos +sikas +siker +sikes +silds +siled +silen +siler +siles +silex +silks +silky +sills +silly +silos +silts +silty +silva +simar +simas +simba +simis +simps +simul +since +sinds +sined +sines +sinew +singe +sings +sinhs +sinks +sinky +sinus +siped +sipes +sippy +sired +siree +siren +sires +sirih +siris +siroc +sirra +sirup +sisal +sises +sissy +sists +sitar +sited +sites +sithe +sitka +situp +situs +siver +sixer +sixes +sixmo +sixte +sixth +sixty +sizar +sized +sizel +sizer +sizes +skags +skail +skald +skank +skart +skate +skats +skatt +skaws +skean +skear +skeed +skeef +skeen +skeer +skees +skeet +skegg +skegs +skein +skelf +skell +skelm +skelp +skene +skens +skeos +skeps +skers +skets +skews +skids +skied +skier +skies +skiey +skiff +skill +skimo +skimp +skims +skink +skins +skint +skios +skips +skirl +skirr +skirt +skite +skits +skive +skivy +sklim +skoal +skoff +skols +skool +skort +skosh +skran +skrik +skuas +skugs +skulk +skull +skunk +skyed +skyer +skyey +skyfs +skyre +skyrs +skyte +slabs +slack +slade +slaes +slags +slaid +slain +slake +slams +slane +slang +slank +slant +slaps +slart +slash +slate +slats +slaty +slave +slaws +slays +slebs +sleds +sleek +sleep +sleer +sleet +slept +slews +sleys +slice +slick +slide +slier +slily +slime +slims +slimy +sling +slink +slipe +slips +slipt +slish +slits +slive +sloan +slobs +sloes +slogs +sloid +slojd +sloom +sloop +sloot +slope +slops +slopy +slorm +slosh +sloth +slots +slove +slows +sloyd +slubb +slubs +slued +slues +sluff +slugs +sluit +slump +slums +slung +slunk +slurb +slurp +slurs +sluse +slush +sluts +slyer +slyly +slype +smaak +smack +smaik +small +smalm +smalt +smarm +smart +smash +smaze +smear +smeek +smees +smeik +smeke +smell +smelt +smerk +smews +smile +smirk +smirr +smirs +smite +smith +smits +smock +smogs +smoke +smoko +smoky +smolt +smoor +smoot +smore +smote +smout +smowt +smugs +smurs +smush +smuts +snabs +snack +snags +snail +snake +snaky +snaps +snare +snarf +snark +snarl +snars +snary +snash +snath +snaws +snead +sneak +sneap +snebs +sneck +sneds +sneed +sneer +snees +snell +snibs +snick +snide +snies +sniff +snift +snipe +snips +snipy +snirt +snits +snobs +snods +snoek +snoep +snogs +snoke +snood +snook +snool +snoop +snoot +snore +snort +snots +snout +snowk +snows +snowy +snubs +snuck +snuff +snugs +snush +snyes +soaks +soaps +soapy +soare +soars +soave +sobas +sober +socas +socko +socks +socle +sodas +soddy +sodic +sodom +sofar +sofas +softa +softs +softy +soger +soggy +sohur +soils +soily +sojas +sokah +soken +sokes +sokol +solah +solan +solar +solas +solde +soldi +soldo +solds +soled +solei +soler +soles +solid +solon +solos +solum +solus +solve +soman +somas +sonar +sonce +sonde +sones +songs +sonic +sonly +sonne +sonny +sonse +sonsy +sooey +sooks +soole +sools +sooms +soops +soote +sooth +soots +sooty +sophs +sophy +sopor +soppy +sopra +soral +soras +sorbo +sorbs +sorda +sordo +sords +sored +soree +sorel +sorer +sores +sorex +sorgo +sorns +sorra +sorry +sorta +sorts +sorus +soths +sotol +souce +souct +sough +souks +souls +soums +sound +soups +soupy +sours +souse +south +souts +sowar +sowce +sowed +sower +sowff +sowfs +sowle +sowls +sowms +sownd +sowne +sowps +sowse +sowth +soyas +soyle +soyuz +sozin +space +spacy +spade +spado +spaed +spaer +spaes +spags +spahi +spail +spain +spait +spake +spald +spale +spall +spalt +spams +spane +spang +spank +spans +spard +spare +spark +spars +spart +spasm +spate +spats +spaul +spawl +spawn +spaws +spayd +spays +spaza +spazz +speak +speal +spean +spear +speat +speck +specs +speed +speel +speer +speil +speir +speks +speld +spelk +spell +spelt +spend +spent +speos +sperm +spets +speug +spews +spewy +spial +spica +spice +spick +spics +spicy +spide +spied +spiel +spier +spies +spiff +spifs +spike +spiks +spiky +spile +spill +spilt +spims +spina +spine +spink +spins +spiny +spire +spirt +spiry +spite +spits +spitz +spivs +splat +splay +split +splog +spode +spods +spoil +spoke +spoof +spook +spool +spoom +spoon +spoor +spoot +spore +spork +sport +sposh +spots +spout +sprad +sprag +sprat +spray +spred +spree +sprew +sprig +sprit +sprod +sprog +sprue +sprug +spuds +spued +spuer +spues +spugs +spule +spume +spumy +spunk +spurn +spurs +spurt +sputa +spyal +spyre +squab +squad +squat +squaw +squeg +squib +squid +squit +squiz +stack +stade +staff +stage +stags +stagy +staid +staig +stain +stair +stake +stale +stalk +stall +stamp +stand +stane +stang +stank +staph +staps +stare +stark +starn +starr +stars +start +stash +state +stats +staun +stave +staws +stays +stead +steak +steal +steam +stean +stear +stedd +stede +steds +steed +steek +steel +steem +steen +steep +steer +steil +stein +stela +stele +stell +steme +stems +stend +steno +stens +stent +steps +stept +stere +stern +stets +stews +stewy +stich +stick +stied +sties +stiff +stilb +stile +still +stilt +stime +stims +stimy +sting +stink +stint +stipa +stipe +stire +stirk +stirp +stirs +stive +stivy +stoae +stoai +stoas +stoat +stobs +stock +stoep +stogy +stoic +stoit +stoke +stole +stoln +stoma +stomp +stond +stone +stong +stonk +stonn +stony +stood +stook +stool +stoop +stoor +stope +stops +stopt +store +stork +storm +story +stoss +stots +stott +stoun +stoup +stour +stout +stove +stown +stowp +stows +strad +strae +strag +strak +strap +straw +stray +strep +strew +stria +strig +strim +strip +strop +strow +stroy +strum +strut +stubs +stuck +stude +studs +study +stuff +stull +stulm +stumm +stump +stums +stung +stunk +stuns +stunt +stupa +stupe +sture +sturt +styed +styes +style +styli +stylo +styme +stymy +styre +styte +suave +subah +subas +subby +suber +subha +succi +sucre +sudds +sudor +sudsy +suede +suent +suers +suets +suety +sugan +sugar +sughs +sugos +suhur +suids +suing +suint +suite +suits +sujee +sukhs +sukuk +sulci +sulfa +sulfo +sulks +sulky +sully +sulph +sulus +sumac +summa +sumos +sumph +sumps +sunis +sunks +sunna +sunns +sunny +sunup +super +supes +supra +surah +sural +suras +surat +surds +sured +surer +sures +surfs +surfy +surge +surgy +surly +surra +suses +sushi +susus +sutor +sutra +sutta +swabs +swack +swads +swage +swags +swail +swain +swale +swaly +swami +swamp +swamy +swang +swank +swans +swaps +swapt +sward +sware +swarf +swarm +swart +swash +swath +swats +swayl +sways +sweal +swear +sweat +swede +sweed +sweel +sweep +sweer +swees +sweet +sweir +swell +swelt +swept +swerf +sweys +swies +swift +swigs +swill +swims +swine +swing +swink +swipe +swire +swirl +swish +swiss +swith +swits +swive +swizz +swobs +swoln +swoon +swoop +swops +swopt +sword +swore +sworn +swots +swoun +swung +sybbe +sybil +syboe +sybow +sycee +syces +syens +syker +sykes +sylis +sylph +sylva +symar +synch +syncs +synds +syned +synes +synod +synth +syped +sypes +syphs +syrah +syren +syrup +sysop +sythe +syver +taals +taata +tabby +taber +tabes +tabid +tabla +table +taboo +tabor +tabun +tabus +tacan +taces +tacet +tache +tacho +tachs +tacit +tacks +tacky +tacos +tacts +taels +taffy +tafia +taggy +tagma +tahas +tahrs +taiga +taigs +taiko +tails +tains +taint +taira +taish +taits +tajes +takas +taken +taker +takes +takhi +takin +takis +talak +talaq +talar +talas +talcs +talcy +talea +taler +tales +talks +talky +talls +tally +talma +talon +talpa +taluk +talus +tamal +tamed +tamer +tames +tamin +tamis +tammy +tamps +tanas +tanga +tangi +tango +tangs +tangy +tanhs +tanka +tanks +tanky +tanna +tansy +tanti +tanto +tapas +taped +tapen +taper +tapes +tapet +tapir +tapis +tappa +tapus +taras +tardo +tardy +tared +tares +targa +targe +tarns +taroc +tarok +taros +tarot +tarps +tarre +tarry +tarsi +tarts +tarty +tasar +taser +tasks +tasse +taste +tasty +tatar +tater +tates +taths +tatie +tatou +tatts +tatty +tatus +taube +tauld +taunt +tauon +taupe +tauts +tavah +tavas +taver +tawai +tawas +tawed +tawer +tawie +tawny +tawse +tawts +taxed +taxer +taxes +taxis +taxol +taxon +taxor +taxus +tayra +tazza +tazze +teach +teade +teads +teaed +teaks +teals +teams +tears +teary +tease +teats +teaze +techs +techy +tecta +teddy +teels +teems +teend +teene +teens +teeny +teers +teeth +teffs +teggs +tegua +tegus +tehrs +teiid +teils +teind +teins +telae +telco +teles +telex +telia +telic +tells +telly +teloi +telos +temed +temes +tempi +tempo +temps +tempt +temse +tench +tends +tendu +tenes +tenet +tenge +tenia +tenne +tenno +tenny +tenon +tenor +tense +tenth +tents +tenty +tenue +tepal +tepas +tepee +tepid +tepoy +terai +teras +terce +terek +teres +terfe +terfs +terga +terms +terne +terns +terra +terry +terse +terts +tesla +testa +teste +tests +testy +tetes +teths +tetra +tetri +teuch +teugh +tewed +tewel +tewit +texas +texes +texts +thack +thagi +thaim +thale +thali +thana +thane +thang +thank +thans +tharm +thars +thaws +thawy +thebe +theca +theed +theek +thees +theft +thegn +theic +thein +their +thelf +thema +theme +thens +theow +there +therm +these +thesp +theta +thete +thews +thewy +thick +thief +thigh +thigs +thilk +thill +thine +thing +think +thins +thiol +third +thirl +thoft +thole +tholi +thong +thorn +thoro +thorp +those +thous +thowl +thrae +thraw +three +threw +thrid +thrip +throb +throe +throw +thrum +thuds +thugs +thuja +thumb +thump +thunk +thurl +thuya +thyme +thymi +thymy +tians +tiara +tiars +tibia +tical +ticca +ticed +tices +tichy +ticks +ticky +tidal +tiddy +tided +tides +tiers +tiffs +tifts +tiger +tiges +tight +tigon +tikas +tikes +tikis +tikka +tilak +tilde +tiled +tiler +tiles +tills +tilly +tilth +tilts +timbo +timed +timer +times +timid +timon +timps +tinas +tinct +tinds +tinea +tined +tines +tinge +tings +tinks +tinny +tints +tinty +tipis +tippy +tipsy +tired +tires +tirls +tiros +tirrs +titan +titch +titer +tithe +titis +title +titre +titty +titup +tiyin +tizzy +toads +toady +toast +toaze +tocks +tocky +tocos +today +todde +toddy +toeas +toffs +toffy +tofts +tofus +togae +togas +toged +toges +togue +toile +toils +toing +toise +toits +tokay +toked +token +toker +tokes +tokos +tolan +tolar +tolas +toled +toles +tolls +tolly +tolts +tolus +tolyl +toman +tombs +tomes +tomia +tommy +tomos +tonal +tondi +tondo +toned +toner +tones +toney +tonga +tongs +tonic +tonka +tonks +tonne +tonus +tools +tooms +toons +tooth +toots +topaz +toped +topee +topek +toper +topes +tophe +tophi +tophs +topic +topis +topoi +topos +toppy +toque +torah +toran +toras +torch +torcs +tores +toric +torii +toros +torot +torrs +torse +torsi +torsk +torso +torta +torte +torts +torus +tosas +tosed +toses +toshy +tossy +total +toted +totem +toter +totes +totty +touch +tough +touks +touns +tours +touse +tousy +touts +touze +touzy +towed +towel +tower +towie +towns +towny +towse +towsy +towts +towze +towzy +toxic +toxin +toyed +toyer +toyon +toyos +tozed +tozes +tozie +trabs +trace +track +tract +trade +trads +tragi +traik +trail +train +trait +tramp +trams +trank +tranq +trans +trant +trape +traps +trapt +trash +trass +trats +tratt +trave +trawl +trays +tread +treat +treck +treed +treen +trees +trefa +treif +treks +trema +trend +tress +trest +trets +trews +treys +triac +triad +trial +tribe +trice +trick +tride +tried +trier +tries +triff +trigo +trigs +trike +trild +trill +trims +trine +trins +triol +trior +trios +tripe +trips +tripy +trist +trite +troad +troak +troat +trock +trode +trods +trogs +trois +troke +troll +tromp +trona +tronc +trone +tronk +trons +troop +trooz +trope +troth +trots +trout +trove +trows +troys +truce +truck +trued +truer +trues +trugo +trugs +trull +truly +trump +trunk +truss +trust +truth +tryer +tryke +tryma +tryps +tryst +tsade +tsadi +tsars +tsked +tsuba +tuans +tuart +tuath +tubae +tubal +tubar +tubas +tubby +tubed +tuber +tubes +tucks +tufas +tuffe +tuffs +tufts +tufty +tugra +tuina +tuism +tuktu +tules +tulip +tulle +tulpa +tumid +tummy +tumor +tumps +tumpy +tunas +tunds +tuned +tuner +tunes +tungs +tunic +tunny +tupek +tupik +tuple +tuque +turbo +turds +turfs +turfy +turks +turme +turms +turns +turps +tushy +tusks +tusky +tutee +tutor +tutti +tutty +tutus +tuxes +tuyer +twaes +twain +twals +twang +twank +twats +tways +tweak +tweed +tweel +tween +tweer +tweet +twerk +twerp +twice +twier +twigs +twill +twilt +twine +twink +twins +twiny +twire +twirl +twirp +twist +twite +twits +twixt +twoer +twyer +tyees +tyers +tying +tyiyn +tykes +tyler +tymps +tynde +tyned +tynes +typal +typed +types +typey +typic +typos +typps +typto +tyran +tyred +tyres +tyros +tythe +tzars +udals +udder +udons +ugali +ugged +uhlan +uhuru +ukase +ulama +ulans +ulcer +ulema +ulmin +ulnad +ulnae +ulnar +ulnas +ulpan +ultra +ulvas +ulyie +ulzie +umami +umbel +umber +umble +umbos +umbra +umbre +umiac +umiak +umiaq +ummah +ummas +ummed +umped +umpie +umpty +umrah +umras +unais +unapt +unarm +unary +unaus +unbag +unban +unbar +unbox +uncap +unces +uncia +uncle +uncos +uncoy +uncus +uncut +undam +undee +under +undid +uneth +unify +union +unite +units +unity +unjam +unked +unket +unkid +unlaw +unlay +unled +unlet +unlid +unlit +unman +unmet +unmew +unmix +unpay +unpeg +unpen +unpin +unred +unrid +unrig +unrip +unsay +unset +unsew +unsod +untax +untie +until +untin +unwed +unwet +unwit +unwon +upbow +upbye +updos +updry +upend +upjet +uplay +upled +uplit +upped +upper +upran +uprun +upsee +upset +upsey +uptak +upter +uptie +uraei +urali +uraos +urare +urari +urate +urban +urbia +urdee +uredo +urent +urged +urger +urges +urman +urnal +urned +urped +ursae +ursid +urson +urubu +urvas +usage +users +usher +using +usnea +usque +usual +usure +usurp +usury +uteri +utile +utter +uveal +uveas +uvula +vacua +vaded +vades +vague +vagus +vails +vaire +vairs +vairy +vakas +vakil +vales +valet +valid +valis +valor +valse +value +valve +vamps +vampy +vanda +vaned +vanes +vangs +vants +vapid +vapor +varan +varas +vardy +varec +vares +varia +varix +varna +varus +varve +vasal +vases +vasts +vasty +vatic +vatus +vauch +vault +vaunt +vaute +vauts +vawte +veale +veals +vealy +veena +veeps +veers +veery +vegan +vegas +veges +vegie +vegos +vehme +veils +veily +veins +veiny +velar +velds +veldt +veles +vells +velum +venae +venal +vends +veney +venge +venin +venom +vents +venue +venus +verbs +verge +verra +verry +verse +verso +verst +verts +vertu +verve +vespa +vesta +vests +vetch +vexed +vexer +vexes +vexil +vezir +vials +viand +vibes +vibex +vibey +vicar +viced +vices +vichy +video +viers +views +viewy +vifda +vigas +vigia +vigil +vigor +vilde +viler +villa +villi +vills +vimen +vinal +vinas +vinca +vined +viner +vines +vinew +vinic +vinos +vints +vinyl +viola +viold +viols +viper +viral +vired +vireo +vires +virga +virge +virid +virls +virtu +virus +visas +vised +vises +visie +visit +visne +vison +visor +vista +visto +vitae +vital +vitas +vitex +vitta +vivas +vivat +vivda +viver +vives +vivid +vixen +vizir +vizor +vleis +vlies +vlogs +voars +vocab +vocal +voces +voddy +vodka +vodou +vodun +voema +vogie +vogue +voice +voids +voila +voile +voips +volae +volar +voled +voles +volet +volks +volta +volte +volti +volts +volva +volve +vomer +voted +voter +votes +vouch +vouge +voulu +vowed +vowel +vower +voxel +vozhd +vraic +vrils +vroom +vrous +vrouw +vrows +vuggs +vuggy +vughs +vughy +vulgo +vulns +vutty +vying +waacs +wacke +wacky +wadds +waddy +waded +wader +wades +wadis +wadts +wafer +waffs +wafts +waged +wager +wages +wagga +wagon +wagyu +wahoo +waide +waifs +waift +wails +wains +wairs +waist +waite +waits +waive +wakas +waked +waken +waker +wakes +wakfs +waldo +walds +waled +waler +wales +walis +walks +walla +walls +wally +walty +waltz +wamed +wames +wamus +wands +waned +wanes +waney +wanle +wanly +wanna +wants +wanty +wanze +waqfs +warbs +warby +wards +wared +wares +warez +warks +warms +warns +warps +warre +warst +warts +warty +wases +washy +wasps +waspy +waste +wasts +watap +watch +water +watts +wauff +waugh +wauks +waulk +wauls +waurs +waved +waver +waves +wavey +wawas +wawes +wawls +waxed +waxen +waxer +waxes +wayed +wazir +wazoo +weald +weals +weamb +weans +wears +weary +weave +webby +weber +wecht +wedel +wedge +wedgy +weeds +weedy +weeke +weeks +weels +weems +weens +weeny +weeps +weepy +weest +weete +weets +wefte +wefts +weids +weigh +weils +weird +weirs +weise +weize +wekas +welch +welds +welke +welks +welkt +wells +welly +welsh +welts +wembs +wench +wends +wenge +wenny +wents +weros +wersh +wests +wetas +wetly +wexed +wexes +whack +whale +whamo +whams +whang +whaps +whare +wharf +whata +whats +whaup +whaur +wheal +whear +wheat +wheel +wheen +wheep +wheft +whelk +whelm +whelp +whens +where +whets +whews +wheys +which +whids +whiff +whift +whigs +while +whilk +whims +whine +whins +whiny +whios +whips +whipt +whirl +whirr +whirs +whish +whisk +whiss +whist +white +whits +whity +whizz +whole +whomp +whoof +whoop +whoot +whops +whorl +whort +whose +whoso +whump +whups +wicca +wicks +wicky +widdy +widen +wider +wides +widow +width +wield +wiels +wifed +wifey +wifie +wifty +wigan +wigga +wiggy +wight +wikis +wilco +wilds +wiled +wiles +wilga +wilis +wilja +wills +willy +wilts +wimps +wimpy +wince +winch +winds +windy +wined +wines +winey +winge +wings +wingy +winks +winna +winns +winos +winze +wiped +wiper +wipes +wired +wirer +wires +wirra +wised +wiser +wises +wisha +wisht +wisps +wispy +wists +witan +witch +wited +wites +withe +withs +withy +witty +wived +wiver +wives +wizen +wizes +woads +woald +wodge +woken +wokka +wolds +wolfs +wolly +wolve +wonga +wongi +wonks +wonky +wonts +woods +woody +wooed +wooer +woofs +woofy +woold +wools +wooly +woons +woops +woose +woosh +wootz +woozy +words +wordy +works +world +worry +worth +worts +would +wound +woven +wowed +wowee +woxen +wrack +wrang +wraps +wrapt +wrast +wrate +wrath +wrawl +wreak +wreck +wrens +wrest +wrick +wried +wrier +wries +wring +wrist +write +writs +wroke +wrong +wroot +wrote +wroth +wrung +wryer +wryly +wudus +wulls +wurst +wuses +wushu +wussy +wuxia +wyled +wyles +wynds +wynns +wyted +wytes +xebec +xenia +xenic +xenon +xeric +xerox +xerus +xoana +xrays +xylan +xylem +xylic +xylol +xylyl +xysti +xysts +yaars +yabas +yabba +yabby +yacca +yacht +yacka +yacks +yaffs +yager +yagis +yahoo +yaird +yakka +yakow +yales +yamen +yampy +yamun +yangs +yanks +yapok +yapon +yapps +yappy +yarco +yards +yarer +yarfa +yarks +yarns +yarrs +yarta +yarto +yates +yauds +yauld +yaups +yawed +yawey +yawls +yawns +yawny +yawps +ybore +yclad +ycled +ycond +ydrad +ydred +yeads +yeahs +yealm +yeans +yeard +yearn +years +yeast +yecch +yechs +yechy +yedes +yeeds +yeggs +yelks +yells +yelms +yelps +yelts +yenta +yente +yerba +yerds +yerks +yeses +yesks +yests +yesty +yetis +yetts +yeuks +yeuky +yeven +yeves +yewen +yexed +yexes +yfere +yield +yiked +yikes +yills +yince +yipes +yippy +yirds +yirks +yirrs +yirth +yites +yitie +ylems +ylike +ylkes +ymolt +ympes +yobbo +yodel +yodhs +yodle +yogas +yogee +yoghs +yogic +yogin +yogis +yoick +yojan +yoked +yokel +yoker +yokes +yokul +yolks +yolky +yomim +yomps +yonic +yonis +yonks +yoofs +yoops +yores +yorks +yorps +youks +young +yourn +yours +yourt +youse +youth +yowed +yowes +yowie +yowls +yrapt +yrent +yrivd +yrneh +ysame +ytost +yuans +yucas +yucca +yucch +yufts +yugas +yuked +yukes +yukky +yukos +yulan +yules +yummo +yummy +yumps +yupon +yuppy +yurta +yurts +yuzus +zabra +zacks +zaire +zakat +zaman +zambo +zamia +zanja +zante +zanza +zanze +zappy +zarfs +zaris +zatis +zaxes +zayin +zazen +zeals +zebec +zebra +zebub +zebus +zeins +zerda +zerks +zeros +zests +zesty +zetas +zexes +zezes +zibet +ziffs +zigan +zilas +zilch +zilla +zills +zimbi +zimbs +zinco +zincs +zincy +zineb +zines +zings +zingy +zinke +zinky +zippo +zippy +ziram +zitis +zizel +zizit +zlote +zloty +zoaea +zobos +zobus +zocco +zoeae +zoeal +zoeas +zoism +zoist +zombi +zonae +zonal +zonda +zoned +zoner +zones +zonks +zooea +zooey +zooid +zooks +zooms +zoons +zooty +zoppa +zoppo +zoril +zoris +zorro +zouks +zowie +zupan +zupas +zurfs +zuzim +zygal +zygon +zymes +zymic From d5a41dd7e7c121b0d38e37404d12d2c34a41af4b Mon Sep 17 00:00:00 2001 From: Jonathan Cobb Date: Thu, 18 Jun 2020 17:43:36 -0400 Subject: [PATCH 3/8] auto-assign network name. add nickname field --- .../src/main/java/bubble/ApiConstants.java | 14 +++++++- .../bubble/dao/cloud/BubbleNetworkDAO.java | 1 + .../model/account/AccountLoginRequest.java | 4 +++ .../java/bubble/model/bill/AccountPlan.java | 5 +++ .../bubble/model/cloud/BubbleNetwork.java | 36 +++++++++++-------- .../resources/bill/AccountPlansResource.java | 14 +++++++- .../META-INF/bubble/bubble.properties | 2 +- .../main/resources/bubble/host-prefixes.txt | 27 -------------- .../post_auth/ResourceMessages.properties | 2 +- bubble-web | 2 +- utils/cobbzilla-utils | 2 +- 11 files changed, 61 insertions(+), 48 deletions(-) diff --git a/bubble-server/src/main/java/bubble/ApiConstants.java b/bubble-server/src/main/java/bubble/ApiConstants.java index 1791b34b..c342c615 100644 --- a/bubble-server/src/main/java/bubble/ApiConstants.java +++ b/bubble-server/src/main/java/bubble/ApiConstants.java @@ -11,6 +11,7 @@ import com.warrenstrange.googleauth.GoogleAuthenticator; import lombok.Getter; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.RandomUtils; +import org.cobbzilla.util.daemon.ZillaRuntime; import org.cobbzilla.util.io.FileUtil; import org.glassfish.grizzly.http.server.Request; import org.glassfish.jersey.server.ContainerRequest; @@ -232,7 +233,10 @@ public class ApiConstants { return val == null ? null : val.textValue(); } - @Getter(lazy=true) private static final String[] hostPrefixes = stream2string("bubble/host-prefixes.txt").split("\n"); + @Getter(lazy=true) private static final String[] hostPrefixes = Arrays.stream(stream2string("bubble/host-prefixes.txt") + .split("\n")) + .filter(ZillaRuntime::notEmpty) + .toArray(String[]::new); public static String newNodeHostname() { final String rand0 = getHostPrefixes()[RandomUtils.nextInt(0, getHostPrefixes().length)]; @@ -243,6 +247,14 @@ public class ApiConstants { return rand0+"-"+(rand1 < 10 ? "0"+rand1 : rand1)+rand2+"-"+rand3+rand4; } + public static String newNetworkName() { + final String rand0 = getHostPrefixes()[RandomUtils.nextInt(0, getHostPrefixes().length)]; + final String rand1 = randomAlphanumeric(2).toLowerCase() + RandomUtils.nextInt(10, 100) + randomAlphanumeric(1).toLowerCase(); + final String rand2 = randomAlphanumeric(2).toLowerCase() + RandomUtils.nextInt(10, 100) + randomAlphanumeric(1).toLowerCase(); + final String rand3 = randomAlphanumeric(2).toLowerCase() + RandomUtils.nextInt(10, 100) + randomAlphanumeric(1).toLowerCase(); + return rand0+"-"+rand1+"-"+rand2+"-"+rand3; + } + public static String getRemoteHost(Request req) { final String xff = req.getHeader("X-Forwarded-For"); final String remoteHost = xff == null ? req.getRemoteAddr() : xff; diff --git a/bubble-server/src/main/java/bubble/dao/cloud/BubbleNetworkDAO.java b/bubble-server/src/main/java/bubble/dao/cloud/BubbleNetworkDAO.java index 75e7c1ad..aaf06721 100644 --- a/bubble-server/src/main/java/bubble/dao/cloud/BubbleNetworkDAO.java +++ b/bubble-server/src/main/java/bubble/dao/cloud/BubbleNetworkDAO.java @@ -45,6 +45,7 @@ public class BubbleNetworkDAO extends AccountOwnedEntityDAO { if (errors.isInvalid()) throw invalidEx(errors); if (errors.hasSuggestedName()) network.setName(errors.getSuggestedName()); } + if (!network.hasNickname()) network.setNickname(network.getName()); final AnsibleInstallType installType = network.hasForkHost() && configuration.isSageLauncher() ? AnsibleInstallType.sage : AnsibleInstallType.node; diff --git a/bubble-server/src/main/java/bubble/model/account/AccountLoginRequest.java b/bubble-server/src/main/java/bubble/model/account/AccountLoginRequest.java index 5fac2c17..b4d0b9f7 100644 --- a/bubble-server/src/main/java/bubble/model/account/AccountLoginRequest.java +++ b/bubble-server/src/main/java/bubble/model/account/AccountLoginRequest.java @@ -1,3 +1,7 @@ +/** + * Copyright (c) 2020 Bubble, Inc. All rights reserved. + * For personal (non-commercial) use, see license: https://getbubblenow.com/bubble-license/ + */ package bubble.model.account; import org.cobbzilla.wizard.auth.LoginRequest; diff --git a/bubble-server/src/main/java/bubble/model/bill/AccountPlan.java b/bubble-server/src/main/java/bubble/model/bill/AccountPlan.java index 9bbe33be..6a723231 100644 --- a/bubble-server/src/main/java/bubble/model/bill/AccountPlan.java +++ b/bubble-server/src/main/java/bubble/model/bill/AccountPlan.java @@ -132,6 +132,10 @@ public class AccountPlan extends IdentifiableBase implements HasNetwork { @Getter @Setter private String refundError; // Fields below are used when creating a new plan, to also create the network associated with it + @Size(max=NAME_MAXLEN, message="err.nick.tooLong") + @Transient @Getter @Setter private transient String nickname; + public boolean hasNickname () { return !empty(nickname); } + @Size(max=10000, message="err.description.length") @Transient @Getter @Setter private transient String description; @@ -171,6 +175,7 @@ public class AccountPlan extends IdentifiableBase implements HasNetwork { CloudService storage) { return new BubbleNetwork() .setName(getName()) + .setNickname(getNickname()) .setDescription(getDescription()) .setLocale(getLocale()) .setTimezone(getTimezone()) diff --git a/bubble-server/src/main/java/bubble/model/cloud/BubbleNetwork.java b/bubble-server/src/main/java/bubble/model/cloud/BubbleNetwork.java index 7197bf20..fb8be710 100644 --- a/bubble-server/src/main/java/bubble/model/cloud/BubbleNetwork.java +++ b/bubble-server/src/main/java/bubble/model/cloud/BubbleNetwork.java @@ -61,7 +61,7 @@ import static org.cobbzilla.wizard.model.crypto.EncryptedTypes.ENC_PAD; public class BubbleNetwork extends IdentifiableBase implements HasNetwork, HasBubbleTags { public static final String[] UPDATE_FIELDS = { - "footprint", "description", "locale", "timezone", "state", "syncPassword", "launchLock" + "nickname", "footprint", "description", "locale", "timezone", "state", "syncPassword", "launchLock" }; public static final String[] CREATE_FIELDS = ArrayUtil.append(UPDATE_FIELDS, "name", "domain", "sendErrors", "sendMetrics"); @@ -110,7 +110,13 @@ public class BubbleNetwork extends IdentifiableBase implements HasNetwork, HasBu @Transient @JsonIgnore public String getNetworkDomain () { return name + "." + domainName; } - @Column(nullable=false) @ECField(index=50) + @ECSearchable(filter=true) @ECField(index=50) + @ECIndex @Column(nullable=false, length=NAME_MAXLEN) + @Size(min=1, max=NAME_MAXLEN, message="err.nick.tooLong") + @Getter @Setter private String nickname; + public boolean hasNickname () { return !empty(nickname); } + + @Column(nullable=false) @ECField(index=60) @Getter @Setter private Integer sslPort; @Transient @JsonIgnore public String getPublicUri() { @@ -121,37 +127,37 @@ public class BubbleNetwork extends IdentifiableBase implements HasNetwork, HasBu return getUuid().equals(ROOT_NETWORK_UUID) ? configuration.getPublicUriBase() : getPublicUri(); } - @ECIndex @Column(nullable=false, updatable=false, length=60) + @ECIndex @Column(nullable=false, updatable=false, length=60) @ECField(index=70) @Enumerated(EnumType.STRING) @Getter @Setter private AnsibleInstallType installType; - @ECSearchable @ECField(index=70) + @ECSearchable @ECField(index=80) @ECForeignKey(entity=AccountSshKey.class) @Column(length=UUID_MAXLEN) @Getter @Setter private String sshKey; public boolean hasSshKey () { return !empty(sshKey); } - @ECSearchable @ECField(index=80) + @ECSearchable @ECField(index=90) @ECIndex @Column(nullable=false, updatable=false, length=20) @Enumerated(EnumType.STRING) @Getter @Setter private ComputeNodeSizeType computeSizeType; - @ECSearchable @ECField(index=90) + @ECSearchable @ECField(index=100) @ECForeignKey(entity=BubbleFootprint.class) @Column(nullable=false, length=UUID_MAXLEN) @Getter @Setter private String footprint; public boolean hasFootprint () { return footprint != null; } - @ECSearchable @ECField(index=100) + @ECSearchable @ECField(index=110) @ECForeignKey(entity=CloudService.class) @Column(nullable=false, updatable=false, length=UUID_MAXLEN) @Getter @Setter private String storage; - @ECSearchable(filter=true) @ECField(index=110) + @ECSearchable(filter=true) @ECField(index=120) @Size(max=10000, message="err.description.length") @Type(type=ENCRYPTED_STRING) @Column(columnDefinition="varchar("+(10000+ENC_PAD)+")") @Getter @Setter private String description; - @ECSearchable @ECField(index=120) + @ECSearchable @ECField(index=130) @Size(max=20, message="err.locale.length") @Type(type=ENCRYPTED_STRING) @Column(columnDefinition="varchar("+(20+ENC_PAD)+") NOT NULL") @Getter @Setter private String locale = getDEFAULT_LOCALE(); @@ -159,27 +165,27 @@ public class BubbleNetwork extends IdentifiableBase implements HasNetwork, HasBu // A unicode timezone alias from: cobbzilla-utils/src/main/resources/org/cobbzilla/util/time/unicode-timezones.xml // All unicode aliases are guaranteed to map to a Linux timezone and a Java timezone - @ECSearchable @ECField(index=130) + @ECSearchable @ECField(index=140) @Size(max=100, message="err.timezone.length") @Type(type=ENCRYPTED_STRING) @Column(columnDefinition="varchar("+(100+ENC_PAD)+") NOT NULL") @Getter @Setter private String timezone = "America/New_York"; - @ECSearchable @ECField(index=140) + @ECSearchable @ECField(index=150) @Column(nullable=false) @ECIndex @Getter @Setter private Boolean syncPassword; public boolean syncPassword() { return bool(syncPassword); } - @ECSearchable @ECField(index=150) + @ECSearchable @ECField(index=160) @Column(nullable=false) @ECIndex @Getter @Setter private Boolean launchLock; public boolean launchLock() { return bool(launchLock); } - @ECSearchable @ECField(index=160) + @ECSearchable @ECField(index=170) @Column(nullable=false) @ECIndex @Getter @Setter private Boolean sendErrors; public boolean sendErrors() { return bool(sendErrors); } - @ECSearchable @ECField(index=170) + @ECSearchable @ECField(index=180) @Column(nullable=false) @ECIndex @Getter @Setter private Boolean sendMetrics; public boolean sendMetrics() { return bool(sendMetrics); } @@ -190,7 +196,7 @@ public class BubbleNetwork extends IdentifiableBase implements HasNetwork, HasBu public boolean hasForkHost () { return !empty(forkHost); } public boolean fork() { return hasForkHost(); } - @ECSearchable @ECField(index=160) + @ECSearchable @ECField(index=190) @Column(length=20) @Enumerated(EnumType.STRING) @Getter @Setter private BubbleNetworkState state = created; diff --git a/bubble-server/src/main/java/bubble/resources/bill/AccountPlansResource.java b/bubble-server/src/main/java/bubble/resources/bill/AccountPlansResource.java index 3359d5a0..ddd30dbd 100644 --- a/bubble-server/src/main/java/bubble/resources/bill/AccountPlansResource.java +++ b/bubble-server/src/main/java/bubble/resources/bill/AccountPlansResource.java @@ -45,6 +45,7 @@ import static bubble.model.cloud.BubbleNetwork.validateHostname; import static org.cobbzilla.util.daemon.ZillaRuntime.empty; import static org.cobbzilla.util.string.ValidationRegexes.HOST_PATTERN; import static org.cobbzilla.util.string.ValidationRegexes.validateRegexMatches; +import static org.cobbzilla.wizard.model.NamedEntity.NAME_MAXLEN; import static org.cobbzilla.wizard.resources.ResourceUtil.*; @Slf4j @@ -144,7 +145,18 @@ public class AccountPlansResource extends AccountOwnedResource NAME_MAXLEN) { + errors.addViolation("err.name.tooLong"); + } + // assign a random name for the network + request.setName(newNetworkName()); } log.info("setReferences: after calling validateName, request.name="+request.getName()); diff --git a/bubble-server/src/main/resources/META-INF/bubble/bubble.properties b/bubble-server/src/main/resources/META-INF/bubble/bubble.properties index baefaeaa..d1685e3b 100644 --- a/bubble-server/src/main/resources/META-INF/bubble/bubble.properties +++ b/bubble-server/src/main/resources/META-INF/bubble/bubble.properties @@ -1 +1 @@ -bubble.version=0.11.1 +bubble.version=0.11.2 diff --git a/bubble-server/src/main/resources/bubble/host-prefixes.txt b/bubble-server/src/main/resources/bubble/host-prefixes.txt index f3d0a7a2..615a2c8e 100644 --- a/bubble-server/src/main/resources/bubble/host-prefixes.txt +++ b/bubble-server/src/main/resources/bubble/host-prefixes.txt @@ -537,7 +537,6 @@ arret arris arrow arsed -arses arsey arsis arson @@ -2024,7 +2023,6 @@ clint clipe clips clipt -clits cloak cloam clock @@ -2413,8 +2411,6 @@ cumec cumin cundy cunei -cunts -cunty cupel cupid cuppa @@ -2514,7 +2510,6 @@ daman damar dames damme -damns damps dampy dance @@ -3103,9 +3098,6 @@ dwine dyads dyers dying -dyked -dykes -dykey dykon dynel dynes @@ -4748,7 +4740,6 @@ heles helio helix hello -hells helms helos helot @@ -5577,7 +5568,6 @@ kiers kieve kievs kight -kikes kikoi kiley kilim @@ -6618,8 +6608,6 @@ miaul micas miche micht -micks -micky micos micra micro @@ -6895,7 +6883,6 @@ muddy mudge mudir mudra -muffs mufti mugga muggs @@ -7949,7 +7936,6 @@ pisco pises pisky pisos -pissy piste pitas pitch @@ -8098,7 +8084,6 @@ pooja pooka pooks pools -poons poori poort poots @@ -8364,7 +8349,6 @@ purty puses pushy pusle -pussy putid puton putti @@ -9860,7 +9844,6 @@ slurp slurs sluse slush -sluts slyer slyly slype @@ -10155,16 +10138,12 @@ spelt spend spent speos -sperm spets speug spews spewy spial -spica spice -spick -spics spicy spide spied @@ -10515,7 +10494,6 @@ swami swamp swamy swang -swank swans swaps swapt @@ -10701,8 +10679,6 @@ tapis tappa tapus taras -tardo -tardy tared tares targa @@ -11015,7 +10991,6 @@ tithe titis title titre -titty titup tiyin tizzy @@ -11344,8 +11319,6 @@ twaes twain twals twang -twank -twats tways tweak tweed diff --git a/bubble-server/src/main/resources/message_templates/en_US/server/post_auth/ResourceMessages.properties b/bubble-server/src/main/resources/message_templates/en_US/server/post_auth/ResourceMessages.properties index 229a29d0..0f389941 100644 --- a/bubble-server/src/main/resources/message_templates/en_US/server/post_auth/ResourceMessages.properties +++ b/bubble-server/src/main/resources/message_templates/en_US/server/post_auth/ResourceMessages.properties @@ -738,7 +738,7 @@ err.tgzB64.invalid.missingTasksMainYml=No tasks/main.yml file found for role in err.tgzB64.invalid.writingToStorage=Error writing tgz to storage err.tgzB64.invalid.readingFromStorage=Error reading tgz from storage err.tgzB64.required=tgzB64 is required -err.totpKey.length=TOTP key is required +err.totpKey.length=TOTP key is too long err.type.notVerifiable=Type is not verifiable err.type.invalid=Type is invalid err.type.required=Type is required diff --git a/bubble-web b/bubble-web index 02818344..038e36e1 160000 --- a/bubble-web +++ b/bubble-web @@ -1 +1 @@ -Subproject commit 02818344a7b034eb0ce136e9446af2e3383c7740 +Subproject commit 038e36e10eb90cab0b9d33c5d25ab5d529292c2d diff --git a/utils/cobbzilla-utils b/utils/cobbzilla-utils index b1273943..e5d7abc4 160000 --- a/utils/cobbzilla-utils +++ b/utils/cobbzilla-utils @@ -1 +1 @@ -Subproject commit b1273943835c8002c7aae24b880f2038fa71e73c +Subproject commit e5d7abc4b58a339a5da90fcfe53ba21c20e40c75 From c4f04f5a4450c71b52987f49da1d6f142148b7f6 Mon Sep 17 00:00:00 2001 From: Jonathan Cobb Date: Thu, 18 Jun 2020 18:12:21 -0400 Subject: [PATCH 4/8] trim host prefix list --- .../main/resources/bubble/host-prefixes.txt | 53 ------------------- 1 file changed, 53 deletions(-) diff --git a/bubble-server/src/main/resources/bubble/host-prefixes.txt b/bubble-server/src/main/resources/bubble/host-prefixes.txt index 615a2c8e..394fac72 100644 --- a/bubble-server/src/main/resources/bubble/host-prefixes.txt +++ b/bubble-server/src/main/resources/bubble/host-prefixes.txt @@ -920,7 +920,6 @@ bekah belah belar belay -belch belee belga belie @@ -3514,7 +3513,6 @@ fehme feign feint feist -felch felid fella fells @@ -3587,7 +3585,6 @@ fidge fidos fiefs field -fiend fient fiere fiers @@ -3601,9 +3598,7 @@ fifty fight figos fiked -fikes filar -filch filed filer files @@ -4332,7 +4327,6 @@ goody gooey goofs goofy -googs goold gools gooly @@ -4373,7 +4367,6 @@ gowks gowls gowns goxes -goyim goyle graal grabs @@ -4381,7 +4374,6 @@ grace grade grads graff -graft grail grain graip @@ -5175,7 +5167,6 @@ irade irate irids iring -irked iroko irone irons @@ -5204,12 +5195,8 @@ izzat jaaps jabot jacal -jacks -jacky jaded jades -jafas -jaffa jagas jager jaggs @@ -5221,10 +5208,7 @@ jakes jakey jalap jalop -jambe -jambo jambs -jambu james jammy jamon @@ -5232,7 +5216,6 @@ janes janns janny janty -japan japed japer japes @@ -5245,7 +5228,6 @@ jasey jaspe jasps jatos -jauks jaunt jaups javas @@ -5261,11 +5243,8 @@ jedis jeels jeely jeeps -jeers jefes jeffs -jehad -jehus jelab jello jells @@ -5274,19 +5253,14 @@ jembe jemmy jenny jerid -jerks -jerky jerry jesse jests -jesus jetes jeton jetty jeune -jewed jewel -jewie jhala jiaos jibba @@ -5398,7 +5372,6 @@ kabab kabar kabob kacha -kacks kades kadis kafir @@ -5582,10 +5555,7 @@ kinda kinds kindy kines -kings kinin -kinks -kinky kinos kiore kiosk @@ -5661,7 +5631,6 @@ koffs kofta kogal kohas -kohen kohls koine kojis @@ -5675,8 +5644,6 @@ kombu konbu kondo konks -kooks -kooky koori kopek kophs @@ -5702,16 +5669,12 @@ krait krang krans kranz -kraut -kreep kreng -krewe krill krona krone kroon krubi -krunk ksars kudos kudus @@ -5721,7 +5684,6 @@ kugel kuias kukri kukus -kulak kulan kulas kulfi @@ -6062,7 +6024,6 @@ linos lints linty linum -linux lions lipas lipid @@ -6347,7 +6308,6 @@ maids maiko maiks maile -maill mails maims mains @@ -6396,12 +6356,10 @@ manga mange mango mangs -mangy mania manic manis manky -manly manna manor manos @@ -6628,7 +6586,6 @@ mihis miked mikes mikra -milch milds miler miles @@ -8377,10 +8334,8 @@ pyxes pyxie pyxis pzazz -qadis qaids qanat -qibla qophs qorma quack @@ -8407,8 +8362,6 @@ quayd quays qubit quean -queen -queer quell queme quena @@ -8418,7 +8371,6 @@ quest queue queyn queys -quich quick quids quiet @@ -11733,8 +11685,6 @@ volta volte volti volts -volva -volve vomer voted voter @@ -11757,7 +11707,6 @@ vuggs vuggy vughs vughy -vulgo vulns vutty vying @@ -11780,7 +11729,6 @@ wages wagga wagon wagyu -wahoo waide waifs waift @@ -12174,7 +12122,6 @@ yacks yaffs yager yagis -yahoo yaird yakka yakow From df5dd5e37748b9c8d29fe67e5b1d7730f697791c Mon Sep 17 00:00:00 2001 From: Jonathan Cobb Date: Thu, 18 Jun 2020 18:12:32 -0400 Subject: [PATCH 5/8] fix network nickname assignment --- .../main/java/bubble/resources/bill/AccountPlansResource.java | 2 +- bubble-web | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bubble-server/src/main/java/bubble/resources/bill/AccountPlansResource.java b/bubble-server/src/main/java/bubble/resources/bill/AccountPlansResource.java index ddd30dbd..e76a6d24 100644 --- a/bubble-server/src/main/java/bubble/resources/bill/AccountPlansResource.java +++ b/bubble-server/src/main/java/bubble/resources/bill/AccountPlansResource.java @@ -147,7 +147,7 @@ public class AccountPlansResource extends AccountOwnedResource Date: Fri, 19 Jun 2020 00:52:00 -0400 Subject: [PATCH 6/8] verify email in welcome message. add support info. --- .../java/bubble/dao/account/AccountDAO.java | 2 +- .../dao/account/AccountInitializer.java | 25 ++++++++++++------- .../account/message/AccountMessageDAO.java | 12 +++++++++ .../model/account/message/AccountMessage.java | 18 +++++++------ .../resources/account/AuthResource.java | 2 +- .../bubble/server/BubbleConfiguration.java | 9 +++---- .../StandardAccountMessageService.java | 9 +++++-- .../src/main/resources/bubble-config.yml | 4 +++ .../email/notice/welcome/account/message.hbs | 6 +++-- .../email/request/verify/account/message.hbs | 16 +----------- .../post_auth/ResourceMessages.properties | 4 +-- .../pre_auth/ResourceMessages.properties | 8 ++++++ .../sms/notice/welcome/account/message.hbs | 2 +- .../sms/request/verify/account/message.hbs | 3 ++- .../tests/auth/account_registration.json | 4 +-- bubble-web | 2 +- utils/cobbzilla-wizard | 2 +- 17 files changed, 78 insertions(+), 50 deletions(-) diff --git a/bubble-server/src/main/java/bubble/dao/account/AccountDAO.java b/bubble-server/src/main/java/bubble/dao/account/AccountDAO.java index 59e3e9bd..ec3e1d94 100644 --- a/bubble-server/src/main/java/bubble/dao/account/AccountDAO.java +++ b/bubble-server/src/main/java/bubble/dao/account/AccountDAO.java @@ -162,7 +162,7 @@ public class AccountDAO extends AbstractCRUDDAO implements SqlViewSearc } if (account.hasParent()) { - final AccountInitializer init = new AccountInitializer(account, this, messageDAO, selfNodeService); + final AccountInitializer init = new AccountInitializer(account, this, policyDAO, messageDAO, selfNodeService); account.setAccountInitializer(init); daemon(init); } diff --git a/bubble-server/src/main/java/bubble/dao/account/AccountInitializer.java b/bubble-server/src/main/java/bubble/dao/account/AccountInitializer.java index 4323b5db..1c14e988 100644 --- a/bubble-server/src/main/java/bubble/dao/account/AccountInitializer.java +++ b/bubble-server/src/main/java/bubble/dao/account/AccountInitializer.java @@ -6,6 +6,7 @@ package bubble.dao.account; import bubble.dao.account.message.AccountMessageDAO; import bubble.model.account.Account; +import bubble.model.account.AccountPolicy; import bubble.model.account.message.AccountAction; import bubble.model.account.message.AccountMessage; import bubble.model.account.message.AccountMessageType; @@ -31,6 +32,7 @@ public class AccountInitializer implements Runnable { private Account account; private AccountDAO accountDAO; + private AccountPolicyDAO policyDAO; private AccountMessageDAO messageDAO; private SelfNodeService selfNodeService; @@ -50,9 +52,14 @@ public class AccountInitializer implements Runnable { public Exception getError() { return error.get(); } public boolean hasError () { return getError() != null; } - public AccountInitializer(Account account, AccountDAO accountDAO, AccountMessageDAO messageDAO, SelfNodeService selfNodeService) { + public AccountInitializer(Account account, + AccountDAO accountDAO, + AccountPolicyDAO policyDAO, + AccountMessageDAO messageDAO, + SelfNodeService selfNodeService) { this.account = account; this.accountDAO = accountDAO; + this.policyDAO = policyDAO; this.messageDAO = messageDAO; this.selfNodeService = selfNodeService; } @@ -73,10 +80,6 @@ public class AccountInitializer implements Runnable { log.warn("aborting!"); return; } - - if (account.hasPolicy() && account.getPolicy().hasAccountContacts()) { - messageDAO.sendVerifyRequest(account.getRemoteHost(), account, account.getPolicy().getAccountContacts()[0]); - } success = true; break; } catch (Exception e) { @@ -87,18 +90,22 @@ public class AccountInitializer implements Runnable { if (!success) throw lastEx; if (account.sendWelcomeEmail()) { final BubbleNetwork thisNetwork = selfNodeService.getThisNetwork(); + final String accountUuid = account.getUuid(); + final AccountPolicy policy = policyDAO.findSingleByAccount(accountUuid); + final String contact = policy != null && policy.hasAccountContacts() ? policy.getAccountContacts()[0].getUuid() : null; + if (contact == null) die("no contact found for welcome message: account="+accountUuid); messageDAO.create(new AccountMessage() .setRemoteHost(account.getRemoteHost()) - .setAccount(account.getUuid()) - .setName(account.getUuid()) + .setAccount(accountUuid) + .setName(accountUuid) .setNetwork(thisNetwork.getUuid()) .setMessageType(AccountMessageType.notice) .setAction(AccountAction.welcome) - .setTarget(ActionTarget.account)); + .setTarget(ActionTarget.account) + .setContact(contact)); } } catch (Exception e) { error.set(e); - // todo: send to errbit die("error: "+e, e); } finally { completed.set(true); diff --git a/bubble-server/src/main/java/bubble/dao/account/message/AccountMessageDAO.java b/bubble-server/src/main/java/bubble/dao/account/message/AccountMessageDAO.java index 76a66cc7..c5442061 100644 --- a/bubble-server/src/main/java/bubble/dao/account/message/AccountMessageDAO.java +++ b/bubble-server/src/main/java/bubble/dao/account/message/AccountMessageDAO.java @@ -166,6 +166,9 @@ public class AccountMessageDAO extends AccountOwnedEntityDAO { } public AccountMessage findOperationRequest(AccountMessage basis) { + if (basis.getAction() == AccountAction.welcome && basis.getTarget() == ActionTarget.account) { + return findWelcomeNotice(basis); + } return findByUniqueFields("account", basis.getAccount(), "name", basis.getName(), "requestId", basis.getRequestId(), @@ -174,6 +177,15 @@ public class AccountMessageDAO extends AccountOwnedEntityDAO { "target", basis.getTarget()); } + public AccountMessage findWelcomeNotice(AccountMessage basis) { + return findByUniqueFields("account", basis.getAccount(), + "name", basis.getName(), + "requestId", basis.getRequestId(), + "messageType", AccountMessageType.notice, + "action", AccountAction.welcome, + "target", ActionTarget.account); + } + public List findOperationDenials(AccountMessage basis) { if (basis == null) { return Collections.emptyList(); diff --git a/bubble-server/src/main/java/bubble/model/account/message/AccountMessage.java b/bubble-server/src/main/java/bubble/model/account/message/AccountMessage.java index fd7340a7..60deb681 100644 --- a/bubble-server/src/main/java/bubble/model/account/message/AccountMessage.java +++ b/bubble-server/src/main/java/bubble/model/account/message/AccountMessage.java @@ -97,13 +97,17 @@ public class AccountMessage extends IdentifiableBase implements HasAccount { public String templateName(String basename) { return getMessageType()+"/"+ getAction()+"/"+getTarget()+"/"+basename+".hbs"; } public long tokenTimeoutSeconds(AccountPolicy policy) { - if (getMessageType() != AccountMessageType.request) return -1; - switch (getTarget()) { - case account: return policy.getAccountOperationTimeout()/1000; - case network: return policy.getNodeOperationTimeout()/1000; - default: - log.warn("tokenTimeout: invalid target: "+getTarget()); - return -1; + // only requests and welcome message get tokens (welcome messages also verify the initial email address) + if (getMessageType() == AccountMessageType.request || (getMessageType() == AccountMessageType.notice && getAction() == AccountAction.welcome)) { + switch (getTarget()) { + case account: return policy.getAccountOperationTimeout()/1000; + case network: return policy.getNodeOperationTimeout()/1000; + default: + log.warn("tokenTimeout: invalid target: "+getTarget()); + return -1; + } + } else { + return -1; } } diff --git a/bubble-server/src/main/java/bubble/resources/account/AuthResource.java b/bubble-server/src/main/java/bubble/resources/account/AuthResource.java index 404ad064..f0ca0569 100644 --- a/bubble-server/src/main/java/bubble/resources/account/AuthResource.java +++ b/bubble-server/src/main/java/bubble/resources/account/AuthResource.java @@ -214,7 +214,7 @@ public class AuthResource { final ValidationResult errors = request.validateEmail(); if (errors.isValid()) { final Account existing = accountDAO.findByEmail(request.getEmail()); - if (existing != null) errors.addViolation("err.name.registered", "Name is already registered: ", request.getEmail()); + if (existing != null) errors.addViolation("err.email.registered", "Email is already registered: ", request.getEmail()); } final ConstraintViolationBean passwordViolation = validatePassword(request.getPassword()); diff --git a/bubble-server/src/main/java/bubble/server/BubbleConfiguration.java b/bubble-server/src/main/java/bubble/server/BubbleConfiguration.java index 5ac9b19f..99b38130 100644 --- a/bubble-server/src/main/java/bubble/server/BubbleConfiguration.java +++ b/bubble-server/src/main/java/bubble/server/BubbleConfiguration.java @@ -38,10 +38,7 @@ import org.cobbzilla.wizard.cache.redis.HasRedisConfiguration; import org.cobbzilla.wizard.cache.redis.RedisConfiguration; import org.cobbzilla.wizard.client.ApiClientBase; import org.cobbzilla.wizard.server.RestServerHarness; -import org.cobbzilla.wizard.server.config.HasDatabaseConfiguration; -import org.cobbzilla.wizard.server.config.LegalInfo; -import org.cobbzilla.wizard.server.config.PgRestServerConfiguration; -import org.cobbzilla.wizard.server.config.RecaptchaConfig; +import org.cobbzilla.wizard.server.config.*; import org.cobbzilla.wizard.util.ClasspathScanner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -87,6 +84,7 @@ public class BubbleConfiguration extends PgRestServerConfiguration public static final String TAG_SSL_PORT = "sslPort"; public static final String TAG_PROMO_CODE_POLICY = "promoCodePolicy"; public static final String TAG_REQUIRE_SEND_METRICS = "requireSendMetrics"; + public static final String TAG_SUPPORT = "support"; public static final String DEFAULT_LOCAL_STORAGE_DIR = HOME_DIR + "/.bubble_local_storage"; @@ -294,7 +292,8 @@ public class BubbleConfiguration extends PgRestServerConfiguration {TAG_CLOUD_CONFIGS, accountDAO.activated() ? null : activationService.getCloudDefaults()}, {TAG_LOCKED, accountDAO.locked()}, {TAG_LAUNCH_LOCK, isSageLauncher() || thisNetwork == null ? null : thisNetwork.launchLock()}, - {TAG_SSL_PORT, getDefaultSslPort()} + {TAG_SSL_PORT, getDefaultSslPort()}, + {TAG_SUPPORT, getSupport()} })); } return publicSystemConfigs.get(); diff --git a/bubble-server/src/main/java/bubble/service/account/StandardAccountMessageService.java b/bubble-server/src/main/java/bubble/service/account/StandardAccountMessageService.java index 0e871427..c6564958 100644 --- a/bubble-server/src/main/java/bubble/service/account/StandardAccountMessageService.java +++ b/bubble-server/src/main/java/bubble/service/account/StandardAccountMessageService.java @@ -52,7 +52,8 @@ public class StandardAccountMessageService implements AccountMessageService { final Account account = accountDAO.findByUuid(accountUuid); AccountPolicy policy = policyDAO.findSingleByAccount(accountUuid); if (policy == null) { - policy = policyDAO.create(new AccountPolicy().setAccount(accountUuid)); + log.warn("send("+message+"): no policy for account"); + return false; } final List contacts = policy.getAllowedContacts(message); if (contacts.isEmpty()) { @@ -136,9 +137,11 @@ public class StandardAccountMessageService implements AccountMessageService { if (account == null) account = accountDAO.findByUuid(approval.getAccount()); final AccountMessageApprovalStatus approvalStatus = messageDAO.requestApproved(account, approval, token, data); if (approvalStatus == AccountMessageApprovalStatus.ok_confirmed) { + final AccountMessage request = messageDAO.findOperationRequest(approval); + if (request == null) throw invalidEx("err.approvalToken.invalid", "Request could not be found for approval: "+approval); final AccountPolicy policy = policyDAO.findSingleByAccount(account.getUuid()); final AccountMessage confirm = messageDAO.create(new AccountMessage(approval).setMessageType(AccountMessageType.confirmation)); - approval.setRequest(messageDAO.findOperationRequest(approval)); + approval.setRequest(request); approval.setRequestContact(policy.findContactByUuid(approval.getRequest().getContact())); getCompletionHandler(approval).confirm(approval, data); @@ -158,6 +161,7 @@ public class StandardAccountMessageService implements AccountMessageService { throw invalidEx("err.approvalToken.invalid", "Approval cannot proceed: "+approvalStatus, approvalStatus.name()); } + @Getter(lazy=true) private final AccountMessageCompletionHandler accountWelcomeHandler = configuration.autowire(new AccountVerifyHandler()); @Getter(lazy=true) private final AccountMessageCompletionHandler accountLoginHandler = configuration.autowire(new AccountLoginHandler()); @Getter(lazy=true) private final AccountMessageCompletionHandler accountPasswordHandler = configuration.autowire(new AccountPasswordHandler()); @Getter(lazy=true) private final AccountMessageCompletionHandler accountVerifyHandler = configuration.autowire(new AccountVerifyHandler()); @@ -170,6 +174,7 @@ public class StandardAccountMessageService implements AccountMessageService { @Getter(lazy=true) private final Map confirmationHandlers = initConfirmationHandlers(); private HashMap initConfirmationHandlers() { final HashMap handlers = new HashMap<>(); + handlers.put(ActionTarget.account+":"+AccountAction.welcome, getAccountWelcomeHandler()); handlers.put(ActionTarget.account+":"+AccountAction.login, getAccountLoginHandler()); handlers.put(ActionTarget.account+":"+AccountAction.password, getAccountPasswordHandler()); handlers.put(ActionTarget.account+":"+AccountAction.verify, getAccountVerifyHandler()); diff --git a/bubble-server/src/main/resources/bubble-config.yml b/bubble-server/src/main/resources/bubble-config.yml index 063aedcb..8b1e6689 100644 --- a/bubble-server/src/main/resources/bubble-config.yml +++ b/bubble-server/src/main/resources/bubble-config.yml @@ -71,6 +71,10 @@ errorApi: key: {{ERRBIT_KEY}} env: {{ERRBIT_ENV}} +support: + email: '{{SUPPORT_EMAIL}}' + site: '{{SUPPORT_SITE}}' + localNotificationStrategy: {{#exists BUBBLE_LOCAL_NOTIFY}}{{BUBBLE_LOCAL_NOTIFY}}{{else}}inline{{/exists}} letsencryptEmail: {{LETSENCRYPT_EMAIL}} diff --git a/bubble-server/src/main/resources/message_templates/en_US/email/notice/welcome/account/message.hbs b/bubble-server/src/main/resources/message_templates/en_US/email/notice/welcome/account/message.hbs index 6e83c215..9dafcc65 100644 --- a/bubble-server/src/main/resources/message_templates/en_US/email/notice/welcome/account/message.hbs +++ b/bubble-server/src/main/resources/message_templates/en_US/email/notice/welcome/account/message.hbs @@ -2,8 +2,10 @@ Hello {{account.name}}, Welcome to Bubble! -You can login with your username and password here: {{publicUri}}/login +Please confirm your email address using this link: -If you have any questions, please contact your Bubble Administrator. +{{publicUri}}/me/action?approve={{confirmationToken}} + +{{#if configuration.hasSupportInfo}}If you have any questions or need help, please {{#if configuration.support.hasEmailAndSite}}contact {{configuration.support.email}} or visit {{configuration.support.site}}{{else}}{{#if configuration.support.hasEmail}}contact {{configuration.support.email}}{{else}}visit {{configuration.support.site}}{{/if}}{{/if}}{{/if}} Happy bubbling! diff --git a/bubble-server/src/main/resources/message_templates/en_US/email/request/verify/account/message.hbs b/bubble-server/src/main/resources/message_templates/en_US/email/request/verify/account/message.hbs index 01075276..6652b8f9 100644 --- a/bubble-server/src/main/resources/message_templates/en_US/email/request/verify/account/message.hbs +++ b/bubble-server/src/main/resources/message_templates/en_US/email/request/verify/account/message.hbs @@ -3,24 +3,10 @@ Hello {{account.name}}, Contact information has been added to your account named '{{account.name}}' on {{network.networkDomain}} {{#string_compare contact.uuid '==' message.contact}}{{contact.type}} - {{contact.info}}{{else}}{{message.requestContact.type}}{{#if message.requestContact.isSms}}{{message.requestContact.info}}{{/if}}{{/string_compare}} {{#if message.requestContact.nick}}({{message.requestContact.nick}}){{/if}} - ----------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------- - -If you did not make this request or would like to cancel this request, please click this link: - -{{publicUri}}/me/action?deny={{confirmationToken}} - ----------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------- {{#string_compare contact.uuid '==' message.contact}} -If you DID make this request and are ready to verify this contact information, click the link below, -or enter the value {{confirmationToken}} when the verification code is requested. +To confirm this contact information, follow this link: {{publicUri}}/me/action?approve={{confirmationToken}} - ----------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------- {{/string_compare}} Thank you for using Bubble! diff --git a/bubble-server/src/main/resources/message_templates/en_US/server/post_auth/ResourceMessages.properties b/bubble-server/src/main/resources/message_templates/en_US/server/post_auth/ResourceMessages.properties index 0f389941..2fd4d33b 100644 --- a/bubble-server/src/main/resources/message_templates/en_US/server/post_auth/ResourceMessages.properties +++ b/bubble-server/src/main/resources/message_templates/en_US/server/post_auth/ResourceMessages.properties @@ -184,8 +184,8 @@ label_field_nodes_ip6=IPv6 # New Network page message_no_contacts=No authorized contact info found link_label_no_contacts=Add an email address or SMS-enabled phone number -message_no_verified_contacts=No verified contact info found -message_no_verified_contacts_subtext=Before creating your first Bubble, please verify the contact information shown below +message_no_verified_contacts=Please verify your email address +message_no_verified_contacts_subtext=Check your email and follow the link to verify your email address form_title_new_network=New Bubble field_label_network_name=Name diff --git a/bubble-server/src/main/resources/message_templates/en_US/server/pre_auth/ResourceMessages.properties b/bubble-server/src/main/resources/message_templates/en_US/server/pre_auth/ResourceMessages.properties index 327fbe8c..383c9bdb 100644 --- a/bubble-server/src/main/resources/message_templates/en_US/server/pre_auth/ResourceMessages.properties +++ b/bubble-server/src/main/resources/message_templates/en_US/server/pre_auth/ResourceMessages.properties @@ -12,6 +12,13 @@ message_undefined=undefined # Display of percent values has localized variations label_percent={{percent}}% +# Support +title_support=Bubble Support +support_preamble=To get help with Bubble: +support_site_link=Visit our Support Website +support_email_link=Send us an email +support_not_available=Sorry, no support options are available + # Legal page links title_legal_topics=Legal Stuff legal_topics=terms,privacy,source,license,3rdParty_licenses @@ -262,6 +269,7 @@ err.storage.unknownError=Error connecting to Storage service form_title_login=Login field_label_username=Username field_label_password=Password +field_label_password_guidance=Password must be at least 8 characters long.
Password must contain at least one letter, one number, and one special character. field_label_confirm_password=Confirm Password field_label_unlock_key=Unlock Key form_title_register=Register diff --git a/bubble-server/src/main/resources/message_templates/en_US/sms/notice/welcome/account/message.hbs b/bubble-server/src/main/resources/message_templates/en_US/sms/notice/welcome/account/message.hbs index df10525b..88fce205 100644 --- a/bubble-server/src/main/resources/message_templates/en_US/sms/notice/welcome/account/message.hbs +++ b/bubble-server/src/main/resources/message_templates/en_US/sms/notice/welcome/account/message.hbs @@ -1,2 +1,2 @@ {{network.networkDomain}}: Welcome to Bubble, {{account.name}}! -Login here: {{publicUri}}/login \ No newline at end of file +Verify your email: {{publicUri}}/me/action?approve={{confirmationToken}} \ No newline at end of file diff --git a/bubble-server/src/main/resources/message_templates/en_US/sms/request/verify/account/message.hbs b/bubble-server/src/main/resources/message_templates/en_US/sms/request/verify/account/message.hbs index 39cf32f9..fafafde4 100644 --- a/bubble-server/src/main/resources/message_templates/en_US/sms/request/verify/account/message.hbs +++ b/bubble-server/src/main/resources/message_templates/en_US/sms/request/verify/account/message.hbs @@ -1 +1,2 @@ -{{network.networkDomain}}: {{#string_compare contact.uuid '==' message.contact}}SMS Phone added: {{contact.info}} - To approve, use code {{confirmationToken}} or use: {{publicUri}}/me/action?approve={{confirmationToken}} - To deny: {{publicUri}}/me/action?deny={{confirmationToken}}{{else}}{{#if message.requestContact.isEmail}}Email added: {{message.requestContact.info}}{{else}}Auth added: {{message.requestContact.type}}{{/if}} - To deny: {{publicUri}}/me/action?deny={{confirmationToken}}{{/string_compare}} \ No newline at end of file +{{network.networkDomain}}: {{#string_compare contact.uuid '==' message.contact}}SMS Phone added: {{contact.info}} +To approve: {{publicUri}}/me/action?approve={{confirmationToken}}{{else}}{{#if message.requestContact.isEmail}}Email added: {{message.requestContact.info}}{{else}}Auth added: {{message.requestContact.type}}{{/if}}{{/string_compare}} \ No newline at end of file diff --git a/bubble-server/src/test/resources/models/tests/auth/account_registration.json b/bubble-server/src/test/resources/models/tests/auth/account_registration.json index dec2c545..f86e18d8 100644 --- a/bubble-server/src/test/resources/models/tests/auth/account_registration.json +++ b/bubble-server/src/test/resources/models/tests/auth/account_registration.json @@ -195,7 +195,7 @@ }, { - "comment": "new session, register new user, fails because username is already used", + "comment": "new session, register new user, fails because email is already used", "request": { "session": "new", "uri": "auth/register", @@ -207,7 +207,7 @@ }, "response": { "status": 422, - "check": [ {"condition": "json.has('err.name.registered')"} ] + "check": [ {"condition": "json.has('err.email.registered')"} ] } }, diff --git a/bubble-web b/bubble-web index 8eafe494..96df4c3b 160000 --- a/bubble-web +++ b/bubble-web @@ -1 +1 @@ -Subproject commit 8eafe494bfd5266d5c1b2d91a0d5e8e25d9d27be +Subproject commit 96df4c3bc3df0de1b9703a6aa119acddf2d97e22 diff --git a/utils/cobbzilla-wizard b/utils/cobbzilla-wizard index 3b1649f0..c8c831c1 160000 --- a/utils/cobbzilla-wizard +++ b/utils/cobbzilla-wizard @@ -1 +1 @@ -Subproject commit 3b1649f05991edaf82d117ecf3080e46a16b63b4 +Subproject commit c8c831c10c9d31957cc99f72662530bcb38f9af8 From 72ae1bc667c0411ad065025d633a8e8baf8d755f Mon Sep 17 00:00:00 2001 From: Jonathan Cobb Date: Fri, 19 Jun 2020 01:04:29 -0400 Subject: [PATCH 7/8] update web --- bubble-web | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bubble-web b/bubble-web index 96df4c3b..1e401672 160000 --- a/bubble-web +++ b/bubble-web @@ -1 +1 @@ -Subproject commit 96df4c3bc3df0de1b9703a6aa119acddf2d97e22 +Subproject commit 1e401672da0816e388b9c5ad5531d9bb2894c2e4 From d7c9aba919112275ab45ea9b225bbc4b38bd8951 Mon Sep 17 00:00:00 2001 From: Jonathan Cobb Date: Fri, 19 Jun 2020 01:25:01 -0400 Subject: [PATCH 8/8] fix multifactor_auth test --- .../models/tests/auth/multifactor_auth.json | 112 +++++++++++++----- 1 file changed, 80 insertions(+), 32 deletions(-) diff --git a/bubble-server/src/test/resources/models/tests/auth/multifactor_auth.json b/bubble-server/src/test/resources/models/tests/auth/multifactor_auth.json index 9b0e5201..26843237 100644 --- a/bubble-server/src/test/resources/models/tests/auth/multifactor_auth.json +++ b/bubble-server/src/test/resources/models/tests/auth/multifactor_auth.json @@ -3,7 +3,55 @@ "comment": "create new account and login", "include": "new_account", "params": { - "email": "user-multifactor_auth@example.com" + "email": "user-multifactor_auth_registered@example.com" + } + }, + + { + "comment": "resend verification message for registration email", + "request": { + "uri": "users/{{userAccount.name}}/policy/contacts/verify", + "entity": { + "type": "email", + "info": "user-multifactor_auth_registered@example.com" + } + } + }, + + { + "before": "sleep 1s", + "comment": "as root, check inbox for email verification message for registration email", + "request": { + "session": "rootSession", + "uri": "debug/inbox/email/user-multifactor_auth_registered@example.com?action=verify" + }, + "response": { + "store": "userInbox", + "check": [ + {"condition": "'{{json.[0].ctx.message.messageType}}' == 'request'"}, + {"condition": "'{{json.[0].ctx.message.action}}' == 'verify'"}, + {"condition": "'{{json.[0].ctx.message.target}}' == 'account'"} + ] + } + }, + + { + "comment": "as user, approve email verification request for registration email", + "request": { + "session": "userSession", + "uri": "auth/approve/{{userInbox.[0].ctx.confirmationToken}}", + "entity": [{"name": "account", "value": "user-multifactor_auth_registered@example.com"}] + } + }, + + { + "comment": "add second email to account policy", + "request": { + "uri": "users/{{userAccount.name}}/policy/contacts", + "entity": { + "type": "email", + "info": "user-multifactor_auth@example.com" + } } }, @@ -14,9 +62,9 @@ "store": "policy", "check": [ {"condition": "json.getAccountContacts() != null"}, - {"condition": "json.getAccountContacts().length == 1"}, - {"condition": "!json.getAccountContacts()[0].authFactor()"}, - {"condition": "!json.getAccountContacts()[0].verified()"} + {"condition": "json.getAccountContacts().length == 2"}, + {"condition": "!json.getAccountContacts()[1].authFactor()"}, + {"condition": "!json.getAccountContacts()[1].verified()"} ] } }, @@ -72,7 +120,7 @@ "request": { "session": "userSession", "uri": "auth/approve/{{userInbox.[0].ctx.confirmationToken}}", - "entity": [{"name": "account", "value": "user-multifactor_auth@example.com"}] + "entity": [{"name": "account", "value": "user-multifactor_auth_registered@example.com"}] } }, @@ -84,9 +132,9 @@ "store": "policy", "check": [ {"condition": "json.getAccountContacts() != null"}, - {"condition": "json.getAccountContacts().length == 1"}, - {"condition": "!json.getAccountContacts()[0].authFactor()"}, - {"condition": "json.getAccountContacts()[0].verified()"} + {"condition": "json.getAccountContacts().length == 2"}, + {"condition": "!json.getAccountContacts()[1].authFactor()"}, + {"condition": "json.getAccountContacts()[1].verified()"} ] } }, @@ -117,8 +165,8 @@ "store": "policy", "check": [ {"condition": "json.getAccountContacts() != null"}, - {"condition": "json.getAccountContacts().length == 1"}, - {"condition": "json.getAccountContacts()[0].requiredAuthFactor()"} + {"condition": "json.getAccountContacts().length == 2"}, + {"condition": "json.getAccountContacts()[1].requiredAuthFactor()"} ] } }, @@ -170,7 +218,7 @@ "request": { "session": "userSession", "uri": "auth/approve/{{userInbox.[0].ctx.confirmationToken}}", - "entity": [{"name": "account", "value": "user-multifactor_auth@example.com"}] + "entity": [{"name": "account", "value": "user-multifactor_auth_registered@example.com"}] }, "response": { "sessionName": "userSession", @@ -194,9 +242,9 @@ "store": "policy", "check": [ {"condition": "json.getAccountContacts() != null"}, - {"condition": "json.getAccountContacts().length == 2"}, - {"condition": "json.getAccountContacts()[0].requiredAuthFactor()"}, - {"condition": "json.getAccountContacts()[1].requiredAuthFactor()"} + {"condition": "json.getAccountContacts().length == 3"}, + {"condition": "json.getAccountContacts()[1].requiredAuthFactor()"}, + {"condition": "json.getAccountContacts()[2].requiredAuthFactor()"} ] } }, @@ -248,7 +296,7 @@ "request": { "session": "userSession", "uri": "auth/approve/{{userInbox.[0].ctx.confirmationToken}}", - "entity": [{"name": "account", "value": "user-multifactor_auth@example.com"}] + "entity": [{"name": "account", "value": "user-multifactor_auth_registered@example.com"}] }, "response": { "status": 422, @@ -262,7 +310,7 @@ "session": "userSession", "uri": "auth/approve/{{userInbox.[0].ctx.confirmationToken}}", "entity": [ - {"name": "account", "value": "user-multifactor_auth@example.com"}, + {"name": "account", "value": "user-multifactor_auth_registered@example.com"}, {"name": "totpToken", "value": "{{authenticator_token authenticator.totpKey}}"} ] }, @@ -308,8 +356,8 @@ "store": "policy", "check": [ {"condition": "json.getAccountContacts() != null"}, - {"condition": "json.getAccountContacts().length == 1"}, - {"condition": "json.getAccountContacts()[0].requiredAuthFactor()"} + {"condition": "json.getAccountContacts().length == 2"}, + {"condition": "json.getAccountContacts()[1].requiredAuthFactor()"} ] } }, @@ -372,7 +420,7 @@ "request": { "session": "userSession", "uri": "auth/approve/{{smsInbox.[0].ctx.confirmationToken}}", - "entity": [{"name": "account", "value": "user-multifactor_auth@example.com"}] + "entity": [{"name": "account", "value": "user-multifactor_auth_registered@example.com"}] } }, @@ -384,10 +432,10 @@ "store": "policy", "check": [ {"condition": "json.getAccountContacts() != null"}, - {"condition": "json.getAccountContacts().length == 2"}, - {"condition": "json.getAccountContacts()[1].getType().name() == 'sms'"}, - {"condition": "!json.getAccountContacts()[1].authFactor()"}, - {"condition": "json.getAccountContacts()[1].verified()"} + {"condition": "json.getAccountContacts().length == 3"}, + {"condition": "json.getAccountContacts()[2].getType().name() == 'sms'"}, + {"condition": "!json.getAccountContacts()[2].authFactor()"}, + {"condition": "json.getAccountContacts()[2].verified()"} ] } }, @@ -459,7 +507,7 @@ "request": { "session": "userSession", "uri": "auth/approve/{{smsInbox.[0].ctx.confirmationToken}}", - "entity": [{"name": "account", "value": "user-multifactor_auth@example.com"}] + "entity": [{"name": "account", "value": "user-multifactor_auth_registered@example.com"}] }, "response": { "status": 422, @@ -473,7 +521,7 @@ "session": "userSession", "uri": "auth/approve/{{smsInbox.[0].ctx.confirmationToken}}", "entity": [ - {"name": "account", "value": "user-multifactor_auth@example.com"}, + {"name": "account", "value": "user-multifactor_auth_registered@example.com"}, {"name": "totpToken", "value": "{{authenticator_token authenticator.totpKey}}"} ] }, @@ -505,8 +553,8 @@ "store": "policy", "check": [ {"condition": "json.getAccountContacts() != null"}, - {"condition": "json.getAccountContacts().length == 1"}, - {"condition": "json.getAccountContacts()[0].getType().name() == 'sms'"} + {"condition": "json.getAccountContacts().length == 2"}, + {"condition": "json.getAccountContacts()[1].getType().name() == 'sms'"} ] } }, @@ -550,7 +598,7 @@ "request": { "session": "userSession", "uri": "auth/approve/{{userInbox.[0].ctx.confirmationToken}}", - "entity": [{"name": "account", "value": "user-multifactor_auth@example.com"}] + "entity": [{"name": "account", "value": "user-multifactor_auth_registered@example.com"}] } }, @@ -619,7 +667,7 @@ "request": { "session": "userSession", "uri": "auth/approve/{{userInbox.[0].ctx.confirmationToken}}", - "entity": [{"name": "account", "value": "user-multifactor_auth@example.com"}] + "entity": [{"name": "account", "value": "user-multifactor_auth_registered@example.com"}] }, "response": { "sessionName": "userSession", @@ -736,9 +784,9 @@ "store": "policy", "check": [ {"condition": "json.getAccountContacts() != null"}, - {"condition": "json.getAccountContacts().length == 2"}, - {"condition": "!json.getAccountContacts()[0].getInfo().startsWith('bar')"}, - {"condition": "!json.getAccountContacts()[1].getInfo().startsWith('bar')"} + {"condition": "json.getAccountContacts().length == 3"}, + {"condition": "!json.getAccountContacts()[1].getInfo().startsWith('bar')"}, + {"condition": "!json.getAccountContacts()[2].getInfo().startsWith('bar')"} ] } }