From 2643f24f22c808b5edaab41a716b42bc5d387e18 Mon Sep 17 00:00:00 2001 From: roboltz Date: Mon, 30 Oct 2023 23:30:56 -0400 Subject: [PATCH 1/3] Added school --- bin/main/swot/Compiler.kt | 28 +++++++++++ bin/main/swot/Swot.kt | 56 ++++++++++++++++++++++ bin/test/swot/SwotTest.kt | 59 ++++++++++++++++++++++++ lib/domains/org/whittiertech/student.txt | 1 + 4 files changed, 144 insertions(+) create mode 100644 bin/main/swot/Compiler.kt create mode 100644 bin/main/swot/Swot.kt create mode 100644 bin/test/swot/SwotTest.kt create mode 100644 lib/domains/org/whittiertech/student.txt diff --git a/bin/main/swot/Compiler.kt b/bin/main/swot/Compiler.kt new file mode 100644 index 0000000000..eb97b4669e --- /dev/null +++ b/bin/main/swot/Compiler.kt @@ -0,0 +1,28 @@ +package swot + +import java.io.File + +/** + * @author max + */ + +object CompilationState { + val stoplist = File("lib/domains/stoplist.txt").readLines().toHashSet() + val domains = File("lib/domains/tlds.txt").readLines().toHashSet() +} + +fun main(args: Array) { + val root = File("lib/domains") + root.walkTopDown().forEach { + if (it.isFile) { + val parts = it.toRelativeString(root).replace('\\', '/').removeSuffix(".txt").split('/').toList() + if (!checkSet(CompilationState.stoplist, parts) && !checkSet(CompilationState.domains, parts)) { + CompilationState.domains.add(parts.reversed().joinToString(".")) + } + } + } + + val stoplist = CompilationState.stoplist.map { "-$it" }.sorted().joinToString("\n") + File("out/artifacts").mkdirs() + File("out/artifacts/swot.txt").writeText(stoplist + "\n" + CompilationState.domains.sorted().joinToString("\n")) +} diff --git a/bin/main/swot/Swot.kt b/bin/main/swot/Swot.kt new file mode 100644 index 0000000000..f34ecb36fb --- /dev/null +++ b/bin/main/swot/Swot.kt @@ -0,0 +1,56 @@ +package swot + +import java.io.File + +fun isAcademic(email: String): Boolean { + val parts = domainParts(email) + return !isStoplisted(parts) && (isUnderTLD(parts) || findSchoolNames(parts).isNotEmpty()) +} + +fun findSchoolNames(emailOrDomain: String): List { + return findSchoolNames(domainParts(emailOrDomain)) +} + +fun isUnderTLD(parts: List): Boolean { + return checkSet(Resources.tlds, parts) +} + +fun isStoplisted(parts: List): Boolean { + return checkSet(Resources.stoplist, parts) +} + +private object Resources { + val tlds = readList("/tlds.txt") ?: error("Cannot find /tlds.txt") + val stoplist = readList("/stoplist.txt") ?: error("Cannot find /stoplist.txt") + + fun readList(resource: String) : Set? { + return File("lib/domains/$resource").takeIf { it.exists() }?.bufferedReader()?.lineSequence()?.toHashSet() + } +} + +private fun findSchoolNames(parts: List): List { + val resourcePath = StringBuilder("") + for (part in parts) { + resourcePath.append('/').append(part) + val school = Resources.readList("${resourcePath}.txt") + if (school != null) { + return school.toList() + } + } + + return arrayListOf() +} + +private fun domainParts(emailOrDomain: String): List { + return emailOrDomain.trim().toLowerCase().substringAfter('@').substringAfter("://").substringBefore(':').split('.').reversed() +} + +internal fun checkSet(set: Set, parts: List): Boolean { + val subj = StringBuilder() + for (part in parts) { + subj.insert(0, part) + if (set.contains(subj.toString())) return true + subj.insert(0 ,'.') + } + return false +} diff --git a/bin/test/swot/SwotTest.kt b/bin/test/swot/SwotTest.kt new file mode 100644 index 0000000000..44c73d60cf --- /dev/null +++ b/bin/test/swot/SwotTest.kt @@ -0,0 +1,59 @@ +package swot + +import junit.framework.TestCase + +class SwotTest : TestCase() { + fun testSwot() { + assertEquals (true , isAcademic("lreilly@stanford.edu")) + assertEquals (true , isAcademic("LREILLY@STANFORD.EDU")) + assertEquals (true , isAcademic("Lreilly@Stanford.Edu")) + assertEquals (true , isAcademic("lreilly@slac.stanford.edu")) + assertEquals (true , isAcademic("lreilly@strath.ac.uk")) + assertEquals (true , isAcademic("lreilly@soft-eng.strath.ac.uk")) + assertEquals (true , isAcademic("lee@ugr.es")) + assertEquals (false , isAcademic("lee@uottawa.ca")) + assertEquals (true , isAcademic("lee@ucy.ac.cy")) + assertEquals (false , isAcademic("lee@mother.edu.ru")) + assertEquals (false, isAcademic("lee@leerilly.net")) + assertEquals (false, isAcademic("lee@gmail.com")) + assertEquals (false, isAcademic("lee@stanford.edu.com")) + assertEquals (false, isAcademic("lee@strath.ac.uk.com")) + assertEquals (true , isAcademic("stanford.edu")) + assertEquals (true , isAcademic("slac.stanford.edu")) + assertEquals (true , isAcademic("www.stanford.edu")) + assertEquals (true , isAcademic("http://www.stanford.edu")) + assertEquals (true , isAcademic("http://www.stanford.edu:9393")) + assertEquals (true , isAcademic("strath.ac.uk")) + assertEquals (true , isAcademic("soft-eng.strath.ac.uk")) + assertEquals (true , isAcademic("ugr.es")) + assertEquals (false , isAcademic("uottawa.ca")) + assertEquals (true , isAcademic("ucy.ac.cy")) + assertEquals (false , isAcademic("mother.edu.ru")) + assertEquals (false, isAcademic("leerilly.net")) + assertEquals (false, isAcademic("gmail.com")) + assertEquals (false, isAcademic("stanford.edu.com")) + assertEquals (false, isAcademic("strath.ac.uk.com")) + assertEquals (false, isAcademic("")) + assertEquals (false, isAcademic("the")) + assertEquals (true , isAcademic(" stanford.edu")) + assertEquals (true , isAcademic("lee@strath.ac.uk ")) + assertEquals (false, isAcademic(" gmail.com ")) + assertEquals (true , isAcademic("lee@stud.uni-corvinus.hu")) + assertEquals (true , isAcademic("lee@harvard.edu")) + assertEquals (true , isAcademic("lee@mail.harvard.edu")) + + assertEquals(false, isAcademic("imposter@si.edu")) + assertEquals(false, isAcademic("lee@mdu.edu.rs")) + + // Iran sanctions are lifted + assertEquals(true, isAcademic("lee@acmt.ac.ir")) + } + + fun testSchoolNames() { + assertTrue(findSchoolNames("lreilly@cs.strath.ac.uk").contains("University of Strathclyde")) + assertTrue(findSchoolNames("lreilly@cs.strath.ac.uk").contains("uka tarsadia university,bardoli")) + assertEquals("BRG Fadingerstraße Linz, Austria", findSchoolNames("lreilly@fadi.at").single()) + assertEquals("St. Petersburg State University", findSchoolNames("max@spbu.ru ").single()) + assertEquals(0, findSchoolNames("foo@shop.com").size) + } +} diff --git a/lib/domains/org/whittiertech/student.txt b/lib/domains/org/whittiertech/student.txt new file mode 100644 index 0000000000..cea71dbfd8 --- /dev/null +++ b/lib/domains/org/whittiertech/student.txt @@ -0,0 +1 @@ +Whittier Regional Vocational Technical High School \ No newline at end of file From a40087586f8a7a4106dd5fe0eef62677338e90a2 Mon Sep 17 00:00:00 2001 From: roboltz Date: Tue, 31 Oct 2023 02:48:52 -0400 Subject: [PATCH 2/3] Removed unwanted bin file --- bin/main/swot/Compiler.kt | 28 -------------------- bin/main/swot/Swot.kt | 56 --------------------------------------- 2 files changed, 84 deletions(-) delete mode 100644 bin/main/swot/Compiler.kt delete mode 100644 bin/main/swot/Swot.kt diff --git a/bin/main/swot/Compiler.kt b/bin/main/swot/Compiler.kt deleted file mode 100644 index eb97b4669e..0000000000 --- a/bin/main/swot/Compiler.kt +++ /dev/null @@ -1,28 +0,0 @@ -package swot - -import java.io.File - -/** - * @author max - */ - -object CompilationState { - val stoplist = File("lib/domains/stoplist.txt").readLines().toHashSet() - val domains = File("lib/domains/tlds.txt").readLines().toHashSet() -} - -fun main(args: Array) { - val root = File("lib/domains") - root.walkTopDown().forEach { - if (it.isFile) { - val parts = it.toRelativeString(root).replace('\\', '/').removeSuffix(".txt").split('/').toList() - if (!checkSet(CompilationState.stoplist, parts) && !checkSet(CompilationState.domains, parts)) { - CompilationState.domains.add(parts.reversed().joinToString(".")) - } - } - } - - val stoplist = CompilationState.stoplist.map { "-$it" }.sorted().joinToString("\n") - File("out/artifacts").mkdirs() - File("out/artifacts/swot.txt").writeText(stoplist + "\n" + CompilationState.domains.sorted().joinToString("\n")) -} diff --git a/bin/main/swot/Swot.kt b/bin/main/swot/Swot.kt deleted file mode 100644 index f34ecb36fb..0000000000 --- a/bin/main/swot/Swot.kt +++ /dev/null @@ -1,56 +0,0 @@ -package swot - -import java.io.File - -fun isAcademic(email: String): Boolean { - val parts = domainParts(email) - return !isStoplisted(parts) && (isUnderTLD(parts) || findSchoolNames(parts).isNotEmpty()) -} - -fun findSchoolNames(emailOrDomain: String): List { - return findSchoolNames(domainParts(emailOrDomain)) -} - -fun isUnderTLD(parts: List): Boolean { - return checkSet(Resources.tlds, parts) -} - -fun isStoplisted(parts: List): Boolean { - return checkSet(Resources.stoplist, parts) -} - -private object Resources { - val tlds = readList("/tlds.txt") ?: error("Cannot find /tlds.txt") - val stoplist = readList("/stoplist.txt") ?: error("Cannot find /stoplist.txt") - - fun readList(resource: String) : Set? { - return File("lib/domains/$resource").takeIf { it.exists() }?.bufferedReader()?.lineSequence()?.toHashSet() - } -} - -private fun findSchoolNames(parts: List): List { - val resourcePath = StringBuilder("") - for (part in parts) { - resourcePath.append('/').append(part) - val school = Resources.readList("${resourcePath}.txt") - if (school != null) { - return school.toList() - } - } - - return arrayListOf() -} - -private fun domainParts(emailOrDomain: String): List { - return emailOrDomain.trim().toLowerCase().substringAfter('@').substringAfter("://").substringBefore(':').split('.').reversed() -} - -internal fun checkSet(set: Set, parts: List): Boolean { - val subj = StringBuilder() - for (part in parts) { - subj.insert(0, part) - if (set.contains(subj.toString())) return true - subj.insert(0 ,'.') - } - return false -} From 9bf784d4d30d9d81c5010151561a320417d5361e Mon Sep 17 00:00:00 2001 From: roboltz <77972303+roboltz@users.noreply.github.com> Date: Tue, 31 Oct 2023 02:54:46 -0400 Subject: [PATCH 3/3] Delete bin directory --- bin/test/swot/SwotTest.kt | 59 --------------------------------------- 1 file changed, 59 deletions(-) delete mode 100644 bin/test/swot/SwotTest.kt diff --git a/bin/test/swot/SwotTest.kt b/bin/test/swot/SwotTest.kt deleted file mode 100644 index 44c73d60cf..0000000000 --- a/bin/test/swot/SwotTest.kt +++ /dev/null @@ -1,59 +0,0 @@ -package swot - -import junit.framework.TestCase - -class SwotTest : TestCase() { - fun testSwot() { - assertEquals (true , isAcademic("lreilly@stanford.edu")) - assertEquals (true , isAcademic("LREILLY@STANFORD.EDU")) - assertEquals (true , isAcademic("Lreilly@Stanford.Edu")) - assertEquals (true , isAcademic("lreilly@slac.stanford.edu")) - assertEquals (true , isAcademic("lreilly@strath.ac.uk")) - assertEquals (true , isAcademic("lreilly@soft-eng.strath.ac.uk")) - assertEquals (true , isAcademic("lee@ugr.es")) - assertEquals (false , isAcademic("lee@uottawa.ca")) - assertEquals (true , isAcademic("lee@ucy.ac.cy")) - assertEquals (false , isAcademic("lee@mother.edu.ru")) - assertEquals (false, isAcademic("lee@leerilly.net")) - assertEquals (false, isAcademic("lee@gmail.com")) - assertEquals (false, isAcademic("lee@stanford.edu.com")) - assertEquals (false, isAcademic("lee@strath.ac.uk.com")) - assertEquals (true , isAcademic("stanford.edu")) - assertEquals (true , isAcademic("slac.stanford.edu")) - assertEquals (true , isAcademic("www.stanford.edu")) - assertEquals (true , isAcademic("http://www.stanford.edu")) - assertEquals (true , isAcademic("http://www.stanford.edu:9393")) - assertEquals (true , isAcademic("strath.ac.uk")) - assertEquals (true , isAcademic("soft-eng.strath.ac.uk")) - assertEquals (true , isAcademic("ugr.es")) - assertEquals (false , isAcademic("uottawa.ca")) - assertEquals (true , isAcademic("ucy.ac.cy")) - assertEquals (false , isAcademic("mother.edu.ru")) - assertEquals (false, isAcademic("leerilly.net")) - assertEquals (false, isAcademic("gmail.com")) - assertEquals (false, isAcademic("stanford.edu.com")) - assertEquals (false, isAcademic("strath.ac.uk.com")) - assertEquals (false, isAcademic("")) - assertEquals (false, isAcademic("the")) - assertEquals (true , isAcademic(" stanford.edu")) - assertEquals (true , isAcademic("lee@strath.ac.uk ")) - assertEquals (false, isAcademic(" gmail.com ")) - assertEquals (true , isAcademic("lee@stud.uni-corvinus.hu")) - assertEquals (true , isAcademic("lee@harvard.edu")) - assertEquals (true , isAcademic("lee@mail.harvard.edu")) - - assertEquals(false, isAcademic("imposter@si.edu")) - assertEquals(false, isAcademic("lee@mdu.edu.rs")) - - // Iran sanctions are lifted - assertEquals(true, isAcademic("lee@acmt.ac.ir")) - } - - fun testSchoolNames() { - assertTrue(findSchoolNames("lreilly@cs.strath.ac.uk").contains("University of Strathclyde")) - assertTrue(findSchoolNames("lreilly@cs.strath.ac.uk").contains("uka tarsadia university,bardoli")) - assertEquals("BRG Fadingerstraße Linz, Austria", findSchoolNames("lreilly@fadi.at").single()) - assertEquals("St. Petersburg State University", findSchoolNames("max@spbu.ru ").single()) - assertEquals(0, findSchoolNames("foo@shop.com").size) - } -}