diff --git a/namegen/bad_word_list.txt b/namegen/bad_word_list.txt new file mode 100644 index 000000000..fdad14e6d --- /dev/null +++ b/namegen/bad_word_list.txt @@ -0,0 +1,335 @@ +ahole +anus +asholes +ass +assface +asshole +assholes +assholz +asswipe +azzhole +bassterds +bastard +bastards +bastardz +basterds +basterdz +biatch +bitch +bitches +boffing +butthole +buttwipe +cawk +cawks +clit +cnts +cntz +cock +cockhead +cocks +cocksucker +crap +cum +cunt +cunts +cuntz +dick +dildo +dildos +dominatricks +dominatrics +dominatrix +dyke +enema +erotic +fag +faget +faggit +faggot +fagit +fags +fagz +faig +faigs +fart +fuck +fucker +fuckin +fucking +fucks +fuk +fukah +fuken +fuker +fukin +fukk +fukkah +fukken +fukker +fukkin +gay +gayboy +gaygirl +gays +gayz +hells +hoar +hoor +hoore +jackoff +jap +japs +jisim +jiss +jizm +jizz +knob +knobs +knobz +kunt +kunts +kuntz +lesbian +lezzian +lipshits +lipshitz +masochist +masokist +massterbait +masstrbait +masstrbate +masterbaiter +masterbate +masterbates +nastt +orafis +orgasm +orgasum +oriface +orifice +orifiss +packi +packie +packy +paki +pakie +paky +pecker +peeenus +peeenusss +peenus +peinus +penas +penis +penus +penuus +phuc +phuck +phuk +phuker +phukker +polac +polack +polak +poonani +pusse +pussee +pussy +puuke +puuker +queer +queers +queerz +qweers +qweerz +qweir +recktum +rectum +retard +sadist +scank +schlong +screwing +semen +sex +sexy +shit +shits +shitter +shitty +shity +shitz +shyt +shyte +shytty +shyty +skanck +skank +skankee +skankey +skanks +skanky +slut +sluts +slutty +slutz +tit +turd +vagiina +vagina +vajina +vullva +vulva +whore +xrated +xxx +bitch +blowjob +clit +arschloch +fuck +shit +ass +asshole +bastard +boiolas +buceta +cawk +chink +cipa +clits +cock +cum +cunt +dildo +dirsa +ejakulate +fatass +fcuk +fuk +hoer +hore +jism +kawk +lesbian +masturbate +motherfucker +mofo +nazi +nigga +nigger +nutsack +phuck +pimpis +pusse +pussy +scrotum +shemale +slut +smut +teets +tits +boobs +teez +testical +testicle +titt +jackoff +wank +whoar +whore +amcik +andskota +assrammer +ayir +breasts +cabron +cazzo +chraa +chuj +daygo +dego +dupa +dziwka +ejackulate +ekto +enculer +faen +fanculo +fanny +feces +feg +felcher +ficken +flikker +foreskin +fotze +futkretzn +gay +gook +guiena +hell +helvete +honkey +huevon +hui +injun +jizz +kike +klootzak +kraut +knulle +kuk +kuksuger +kurac +kurwa +lesbo +mamhoon +mibun +monkleigh +mouliewop +muie +mulkku +muschi +nazis +nepesaurio +orospu +perse +picka +pimmel +pizda +poontsee +poop +porn +preteen +pula +pule +puta +puto +qahbeh +rautenberg +schaffer +schlampe +schmuck +screw +sharmuta +sharmute +shipal +shiz +skribz +skurwysyn +sphencter +spic +spierdalaj +splooge +suka +twat +vittu +wichser +yed +zabourah +tampon +prostitute +hooker +boner \ No newline at end of file diff --git a/namegen/reserved_words.txt b/namegen/reserved_words.txt new file mode 100644 index 000000000..e69de29bb diff --git a/src/services/player/ZoneService.java b/src/services/player/ZoneService.java index 9d6fcdc73..0b38b3998 100644 --- a/src/services/player/ZoneService.java +++ b/src/services/player/ZoneService.java @@ -3,6 +3,7 @@ package services.player; import intents.GalacticIntent; import intents.PlayerEventIntent; +import java.io.File; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.Calendar; @@ -43,6 +44,7 @@ import resources.objects.tangible.TangibleObject; import resources.player.Player; import resources.player.PlayerEvent; import resources.services.Config; +import resources.zone.NameFilter; import services.objects.ObjectManager; import utilities.namegen.SWGNameGenerator; @@ -51,6 +53,7 @@ public class ZoneService extends Service { private SWGNameGenerator nameGenerator; private Map profTemplates; private ClientFactory clientFac; + private NameFilter nameFilter; private PreparedStatement createCharacter; private PreparedStatement getCharacter; @@ -58,6 +61,7 @@ public class ZoneService extends Service { public ZoneService() { nameGenerator = new SWGNameGenerator(); clientFac = new ClientFactory(); + nameFilter = new NameFilter(new File("bad_word_list.txt")); } @Override @@ -67,7 +71,7 @@ public class ZoneService extends Service { getCharacter = getLocalDatabase().prepareStatement("SELECT * FROM characters WHERE name = ?"); nameGenerator.loadAllRules(); loadProfTemplates(); - return super.initialize(); + return nameFilter.load() && super.initialize(); } public void handlePacket(GalacticIntent intent, Player player, long networkId, Packet p) { @@ -108,23 +112,32 @@ public class ZoneService extends Service { } private void handleApproveNameRequest(PlayerManager playerMgr, Player player, ClientVerifyAndLockNameRequest request) { - // TODO: Lore reserved name checks - if (!characterExistsForName(request.getName())) - sendPacket(player.getNetworkId(), new ClientVerifyAndLockNameResponse(request.getName(), ErrorMessage.NAME_APPROVED)); - else - sendPacket(player.getNetworkId(), new ClientVerifyAndLockNameResponse(request.getName(), ErrorMessage.NAME_DECLINED_IN_USE)); + String name = request.getName(); + ErrorMessage err = getNameValidity(name); + if (err == ErrorMessage.NAME_APPROVED_MODIFIED) + name = nameFilter.cleanName(name); + sendPacket(player.getNetworkId(), new ClientVerifyAndLockNameResponse(name, err)); } private void handleCharCreation(ObjectManager objManager, Player player, ClientCreateCharacter create) { System.out.println("ZoneService: Create Character: " + create.getName() + " User: " + player.getUsername() + " IP: " + create.getAddress() + ":" + create.getPort()); long characterId = createCharacter(objManager, player, create); - if (createCharacterInDb(characterId, create.getName(), player)) { + ErrorMessage err = getNameValidity(create.getName()); + if (err == ErrorMessage.NAME_APPROVED && createCharacterInDb(characterId, create.getName(), player)) { sendPacket(player, new CreateCharacterSuccess(characterId)); new PlayerEventIntent(player, PlayerEvent.PE_CREATE_CHARACTER).broadcast(); } else { - System.err.println("ZoneService: Unable to create character and put into database!"); - sendPacket(player, new CreateCharacterFailure(NameFailureReason.NAME_RETRY)); + NameFailureReason reason = NameFailureReason.NAME_SYNTAX; + if (err == ErrorMessage.NAME_APPROVED) { // Then it must have been a database error + err = ErrorMessage.NAME_DECLINED_INTERNAL_ERROR; + reason = NameFailureReason.NAME_RETRY; + } else if (err == ErrorMessage.NAME_DECLINED_IN_USE) + reason = NameFailureReason.NAME_IN_USE; + else if (err == ErrorMessage.NAME_DECLINED_EMPTY) + reason = NameFailureReason.NAME_DECLINED_EMPTY; + System.err.println("ZoneService: Unable to create character [Name: " + create.getName() + " User: " + player.getUsername() + "] and put into database! Reason: " + err); + sendPacket(player, new CreateCharacterFailure(reason)); } } @@ -146,6 +159,21 @@ public class ZoneService extends Service { } } + private ErrorMessage getNameValidity(String name) { + String modified = nameFilter.cleanName(name); + if (nameFilter.isEmpty(modified)) // Empty name + return ErrorMessage.NAME_DECLINED_EMPTY; + if (nameFilter.containsBadCharacters(modified)) // Has non-alphabetic characters + return ErrorMessage.NAME_DECLINED_SYNTAX; + if (nameFilter.isProfanity(modified)) // Contains profanity + return ErrorMessage.NAME_DECLINED_PROFANE; + if (characterExistsForName(modified)) // User already exists + return ErrorMessage.NAME_DECLINED_IN_USE; + if (!modified.equals(name)) // If we needed to remove double spaces, trim the ends, etc + return ErrorMessage.NAME_APPROVED_MODIFIED; + return ErrorMessage.NAME_APPROVED; + } + private boolean characterExistsForName(String name) { synchronized (getCharacter) { try {