core_seeker
"""
Copyright (C) 2020 New Entity Operations Inc.
ALL RIGHTS RESERVED
core_seeker gives a basic seek system for text-mode
"""
from core_middlelayer import (
ACCESS_CONTROL_DS, ACCESS_CONTROL_PATH,
COREES,
DIRDATA,
RING_KEY_LOCATION
)
class Locate:
"""
Locate, return, or filter a match in core.es
based off of the prototype critera - here, a skeleton
"""
def seek_by_date():
"""
Filter the seeker to a specific date
Function: incomplete, pass
"""
Sought_In_Core = input(
"What date are you looking for?: ") + ' \n'
def seek_by_time():
"""
Filter the seeker to a specific time
Function: incomplete, pass
"""
Sought_In_Core = input(
"What time are you looking for?: ") + ' \n'
def seek_by_member():
"""
Filter the seeker to a specific member
Function: incomplete, pass
"""
Sought_In_Core = input(
"What name are you looking for?: ") + ' \n'
def seek_by_text():
"""
Filter the seeker to locate a specific text field
Function: incomplete, pass
"""
Sought_In_Core = input(
"What text entry are you looking for?: ") + ' \n'
def seek_full_match():
"""
Seek and return an exact line match
"""
Sought_In_Core = input(
"What exact full text are you looking for?: ") + ' \n'
with open (DIRDATA+COREES, 'rt') as SEARCH_SLUG:
for line in SEARCH_SLUG:
if Sought_In_Core != line:
print('No Matches Found')
elif Sought_In_Core == line:
print(line)
else:
print('Hm, error in the search...')
SEARCH_SLUG.close()
class IPDVS:
BINGO_BUCKET = []
WAS_VALID = []
class ACCESS:
conflict_bucket = []
match_bucket = []
relational_key_bucket = []
config_setter_bucket = []
def access_IPDVS(vcnkey, vcnkey_hash):
with open(ACCESS_CONTROL_PATH+ACCESS_CONTROL_DS, 'r') as IPDVS_ACCESS:
row_counter = 0
for row in IPDVS_ACCESS:
if row_counter == 0:
print("Skipping Header")
row_counter+=1
else:
# print(row)
element_list_row = row.replace('"', '').split(',')
print(element_list_row)
vcnkey_match = element_list_row[2]
vcnkey_key_match = element_list_row[5]
vcnkey_config_setter = element_list_row[0]
if vcnkey_match == vcnkey:
print("attempting to grant the member access.")
IPDVS.ACCESS.match_bucket.append(vcnkey_match)
IPDVS.ACCESS.relational_key_bucket.append(vcnkey_key_match)
IPDVS.ACCESS.config_setter_bucket.append(vcnkey_config_setter)
else:
print("Not found...")
# return("Not found...")
IPDVS_ACCESS.close()
try:
IPDVS.ACCESS.match_bucket[0]
print(IPDVS.ACCESS.match_bucket[0]+" Found")
if IPDVS.ACCESS.relational_key_bucket[0] == vcnkey_hash:
print("Access granted to the member...")
# return("Access granted to the member...")
IPDVS.ACCESS.relational_key_bucket.clear()
IPDVS.ACCESS.match_bucket.clear()
IPDVS.ACCESS.conflict_bucket.clear()
from core_settings import not_admin_check
not_admin_check.make_config(
key_id=IPDVS.ACCESS.config_setter_bucket[0]
)
else:
print("Seems like you may have a key mismatch.")
# return("Seems like you may have a key mismatch.")
except:
IndexError
print("We weren't able to match those credentials.")
# return("We weren't able to match those credentials.")
row_counter = 0
def add_member(vcnkey, vcnkey_hash):
vcnkey = vcnkey.lower()
if len(vcnkey) < 3:
print("This needs to be longer than 3 characters")
# return("This needs to be longer than 3 characters")
elif len(vcnkey) > 64:
print("Wow... that's a... too long. 64 is the max member name length.")
# return("Wow... that's a... too long. 64 is the max member name length.")
elif len(vcnkey_hash) < 10:
print("The key should be stronger/longer")
# return("The key should be stronger/longer")
elif len(vcnkey_hash) > 100:
print("Passwords are limited to 100 characters.")
# return("Passwords are limited to 100 characters.")
else:
print("Looks clean, running Member setup...")
import re
if not re.match("^[a-zA-Z0-9]+$", vcnkey):
print(
"Only letters and numbers are allowed in Member names."
)
# return("Only letters and numbers are allowed in Member names.")
else:
with open(ACCESS_CONTROL_PATH+ACCESS_CONTROL_DS, 'r') as IPDVS_ACCESS:
for row in IPDVS_ACCESS:
if IPDVS.ACCESS.row_counter == 0:
print("Skipping Header")
IPDVS.ACCESS.row_counter+=1
else:
IPDVS.ACCESS.row_counter+=1
print(row)
element_list_row = row.replace('"', '').split(',')
print(element_list_row)
if element_list_row[2] == vcnkey:
print("That name wasn't available.")
# return("That name wasn't available.")
IPDVS.ACCESS.conflict_bucket.append("CONFLICT")
else:
print("Not found...")
# return("Not found...")
IPDVS_ACCESS.close()
try:
IPDVS.ACCESS.conflict_bucket[0]
print("Not a success. Conflict deteched.")
IPDVS.ACCESS.conflict_bucket.clear()
# return("Not a success. Conflict deteched.")
except:
IndexError
IPDVS.BINGO_BUCKET.append("BINGO")
quote = '"'
comma = ','
DEFAULT_LOCAL_NAME = "anon"
DEFAULT_PUBLIC_SLUG = "NOT PUBLIC"
from core_operations import AlienVault
ENCRYPTED_HASH = AlienVault.make_ALIEN_VAULT_CODES(
HASHED_LOGIN_KEY=vcnkey_hash
)
# Offet by -1 to account for the header control logic
new_member_id = str(IPDVS.ACCESS.row_counter-1)
with open(ACCESS_CONTROL_PATH+ACCESS_CONTROL_DS, 'a') as IPDVS_ACCESS:
IPDVS_ACCESS.write(
str(new_member_id)+comma+\
'1'+comma+\
quote+vcnkey+quote+comma+\
quote+DEFAULT_LOCAL_NAME+quote+comma+\
quote+DEFAULT_LOCAL_NAME+quote+comma+\
quote+ENCRYPTED_HASH+quote+comma+\
quote+DEFAULT_PUBLIC_SLUG+quote+comma+\
quote+'NEVER'+quote+comma+\
quote+"IDENTITY/PHOTO/badges/triangle_portfolio.png"+quote+comma+\
quote+"RING/ENTITY/ALIAS/VCN_DIRECTORY/"+vcnkey+"/DEFAULT_ALIAS.vcn"+quote+'\n'
)
# Reset the member que in case you want to add mulitiple new identities
IPDVS.ACCESS.row_counter = 0
IPDVS_ACCESS.close()
IPDVS_ATTRIBUTE_DEFAULTS = [
"## DEFAULT ALIAS",
"DA: NO",
"## DEFAULT UNBOUND ALIAS",
"DUA: ANON",
"## DEFAULT SLUG, . for the default location or put the full relative path here for the member sets",
"## A symlink will be used to point all the relative paths inside of their 'ALIAS' folder",
"DSLUG: RING/ENTITY/ALIAS/VCN_DIRECTORY/"+vcnkey+"/",
"HOST: No Access",
"PORT: No Port Specified",
"USERNAME: Anon",
"KEY_HASH: Defer to ACS",
"PROTOCOL: TCP",
"SSL: YES",
"RANK: NOT RANKED",
"MAX_CONNECTIONS: 0",
"KEY_MASTER_LOCATION: DATA/KEY.es",
"KEY_ACCESS_Location: "+RING_KEY_LOCATION
]
class TEMPLATE:
def construct_RING_template():
from os import mkdir
mkdir("RING/ENTITY/ALIAS/VCN_DIRECTORY/"+vcnkey)
with open("RING/ENTITY/ALIAS/VCN_DIRECTORY/"+\
vcnkey+"/DEFAULT_ALIAS.vcn", 'w') as RING_template:
for i in IPDVS_ATTRIBUTE_DEFAULTS:
RING_template.write('%s\n' % i)
RING_template.close()
print("Ring Template Construction: Success.")
# we provide a formated datetime object to use on conflicts
# conflicts may occur if you delete a username and save data, then
# if you create the same username, the data is moved to a "checkpoint"
from datetime import datetime as dt
TIME_NOW = dt.now()
TIME_NOW.strftime("%Y-%m%-d_%H-%M-%S")
TIME_NOW = str(TIME_NOW)
from os import path
from shutil import move
if path.exists("RING/ENTITY/ALIAS/VCN_DIRECTORY/"+vcnkey+"/DEFAULT_ALIAS.vcn") == True:
move(
"RING/ENTITY/ALIAS/VCN_DIRECTORY/"+vcnkey,
"RING/ENTITY/ALIAS/VCN_DIRECTORY/"+vcnkey+"_"+TIME_NOW
)
TEMPLATE.construct_RING_template()
else:
TEMPLATE.construct_RING_template()
print("The Member "+vcnkey+" was added to the system.")
element_list_row = []
def validate_member(vcnkey, vcnkey_hash):
print("Validating Member Credentials...")
with open(ACCESS_CONTROL_PATH+ACCESS_CONTROL_DS, 'r') as IPDVS_ACCESS:
row_counter = 0
for row in IPDVS_ACCESS:
if row_counter == 0:
print("Skipping Header")
row_counter+=1
else:
print(row)
IPDVS.ACCESS.element_list_row = row.replace('"', '').split(',')
print(IPDVS.ACCESS.element_list_row)
if IPDVS.ACCESS.element_list_row[2] == vcnkey:
print("We found the member...")
IPDVS.BINGO_BUCKET.append(vcnkey)
# Now, import the hashing mechanism to check the keys.
from core_operations import AlienVault, KEY_TEMP
KEY_TEMP.key_holder_plain.append(IPDVS.ACCESS.element_list_row[5])
HASH_NEEDED = AlienVault.get_ALIEN_VAULT_CODES(
HASHED_LOGIN_KEY=vcnkey_hash
)
print("The Hash was: "+str(HASH_NEEDED))
if HASH_NEEDED == True:
print("Credentials: Matched...")
IPDVS.WAS_VALID.append("YES")
else:
print("Credentials: Mismatched... Try another key.")
else:
print("Member unable to be located...")
IPDVS_ACCESS.close()
Return HOME