Skip to content
This repository has been archived by the owner on Jun 11, 2023. It is now read-only.

Commit

Permalink
Merge 8f09ae5 into 3dc40ee
Browse files Browse the repository at this point in the history
  • Loading branch information
renatomassaro committed Sep 28, 2017
2 parents 3dc40ee + 8f09ae5 commit 8e8c22c
Show file tree
Hide file tree
Showing 67 changed files with 1,526 additions and 408 deletions.
2 changes: 1 addition & 1 deletion config/dev.exs
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,5 @@ config :helix, Helix.Endpoint,
certfile: "priv/dev/ssl.crt"
],
debug_errors: true,
code_reloader: true,
code_reloader: false,
check_origin: false
120 changes: 120 additions & 0 deletions events.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
{
"handlers": {
"Account.Account": {
"receives": ["Account.Create"],
"emits": []
},
"Bank.Account": {
"receives": ["Bank.Account.Password.Reveal.Processed"],
"emits": ["Bank.Account.Password.Revealed"]
},
"Bank.Transfer": {
"receives": [
"Bank.Transfer.Completed",
"Bank.Transfer.Aborted"
],
"emits": []
},
"Entity.Database": {
"receives": [
"Server.Password.Acquired",
"Bank.Account.Password.Revealed",
"Bank.Token.Acquired",
"Bank.Account.Login"
],
"emits": []
},
"Software.File.Transfer": {
"receives": ["File.Transfer.Processed"],
"emits": [
"File.Downloaded",
"File.DownloadFailed",
"File.Uploaded",
"File.UploadFailed"
]
},
"Software.Cracker": {
"receives": [
"Cracker.Bruteforce.Conclusion",
"Cracker.Overflow.Conclusion"
],
"emits": [
"Server.Password.Acquired",
"Cracker.Bruteforce.Failed",
"Bank.Token.Acquired"
]
},
"Software.Filesystem": {
"receives": [
"File.Downloaded",
"File.Uploaded"
],
"emits": ["Filesystem.Changed"]
},
"Log.Log": {
"receives": [
"File.Downloaded",
"File.Uploaded",
"Log.Forge.Edited",
"Log.Forge.Created",
"Bank.Transfer.Completed",
"Connection.Started"
],
"emits": [
"Log.Created",
"Log.Modified",
"Log.Deleted"
]
},
"Process.TOP": {
"receives": ["Connection.Closed"],
"emits": []
},
"Network.Connection": {
"receives": [
"Bank.Transfer.Completed"
],
"emits": [
"Connection.Closed"
]
},
"Tunnel.Connection": {
"receives": ["Connection.Closed"],
"emits": []
}
},
"flows": {
"Bank.Account": [
"Bank.Account.Login",
"Connection.Started"
],
"Bank.Transfer": [
"Connection.Started",
"Process.Created"
],
"Software.File.Transfer": [
"Connection.Started",
"Process.Created"
],
"Software.Software.Cracker": [
"Connection.Started",
"Process.Created"
],
"Software.Software.Firewall": [
"Process.Created",
"Firewall.Started"
],
"Software.Software.LogForger": [
"Process.Created"
]
},
"notifiable": [
"Log.Created",
"Log.Modified",
"Log.Deleted",
"Server.Password.Acquired",
"Process.Created",
"Process.Conclusion",
"File.Uploaded"
]
}
57 changes: 57 additions & 0 deletions graph.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import json
from graphviz import Digraph

with open('events.json') as events_file:
events = json.load(events_file)

handlers = events["handlers"]
flows = events["flows"]
notifiable = events["notifiable"]

def is_notifiable(name):
return name in notifiable

def node_event(g, name):
color = 'lightblue4' if is_notifiable(name) else 'lightblue2'
g.node(name, shape='box', color=color, style='filled')

def node_handler(g, name):
g.node(name, color='cornsilk', style='filled')

def node_flow(g, name):
g.node(name, color='khaki', style='filled')

def handler_graph(g):
for entry in handlers:
handler = entry + ' Handler'

for recv in handlers[entry]['receives']:
node_event(g, recv)
node_handler(g, handler)
g.edge(recv, handler, label='handled by')

for emit in handlers[entry]['emits']:
node_event(g, emit)
node_handler(g, handler)
g.edge(handler, emit, label='emits')

g.render()

def flow_graph(g):
for entry in flows:
flow = entry + ' Flow'

for emit in flows[entry]:
node_event(g, emit)
node_flow(g, flow)
g.edge(flow, emit, label='emits')

g.render()

g1 = Digraph('events_handler', filename='graphs/events_handler.dot')
g1.attr(rankdir='LR')
g2 = Digraph('events_flow', filename='graphs/events_flow.dot')
g2.attr(rankdir='LR')

handler_graph(g1)
flow_graph(g2)
2 changes: 1 addition & 1 deletion lib/cache/query/cache.ex
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ defmodule Helix.Cache.Query.Cache do
Given a server, return the nips (network_id, ip) linked to it.
"""
def from_server_get_nips(server),
do: CacheInternal.lookup({:server, :nips}, {server_to_id(server)})
do: CacheInternal.lookup({:server, :nips}, {server_to_id(server)})

@spec from_server_get_storages(Server.idtb) ::
{:ok, [Storage.id]}
Expand Down
32 changes: 18 additions & 14 deletions lib/event/dispatcher/helix.ex
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,15 @@ defmodule Helix.Event.Dispatcher.Helix do

alias Helix.Account
alias Helix.Entity
alias Helix.Log
alias Helix.Network
alias Helix.Process
alias Helix.Software
alias Helix.Universe

alias Helix.Log.Event.Handler, as: LogHandler
alias Helix.Software.Event, as: SoftwareEvent
alias Helix.Software.Event.Handler, as: SoftwareHandler

##############################################################################
# Account events
##############################################################################
Expand All @@ -29,7 +32,7 @@ defmodule Helix.Event.Dispatcher.Helix do
:connection_closed

event Network.Model.Connection.ConnectionStartedEvent,
Log.Event.Log,
LogHandler.Log,
:connection_started

##############################################################################
Expand All @@ -43,27 +46,28 @@ defmodule Helix.Event.Dispatcher.Helix do
# Software events
##############################################################################
event Software.Model.Software.Cracker.Bruteforce.ConclusionEvent,
Software.Event.Cracker,
SoftwareHandler.Cracker,
:bruteforce_conclusion

event Software.Model.Software.Cracker.Overflow.ConclusionEvent,
Software.Event.Cracker,
SoftwareHandler.Cracker,
:overflow_conclusion

event Software.Model.SoftwareType.Decryptor.ProcessConclusionEvent,
Software.Event.Decryptor,
SoftwareHandler.Decryptor,
:complete

event Software.Model.SoftwareType.Encryptor.ProcessConclusionEvent,
Software.Event.Encryptor,
SoftwareHandler.Encryptor,
:complete

event Software.Model.SoftwareType.FileDownload.ProcessConclusionEvent,
Software.Event.FileDownload,
event SoftwareEvent.File.Transfer.Processed,
SoftwareHandler.File.Transfer,
:complete
event Software.Model.SoftwareType.FileDownload.ProcessConclusionEvent,
Log.Event.Log,
:file_download_conclusion

event SoftwareEvent.File.Downloaded,
LogHandler.Log,
:file_downloaded

event Software.Model.SoftwareType.Firewall.FirewallStartedEvent,
Process.Event.Cracker,
Expand All @@ -74,11 +78,11 @@ defmodule Helix.Event.Dispatcher.Helix do
:firewall_stopped

event Software.Model.SoftwareType.LogForge.Create.ConclusionEvent,
Log.Event.Log,
LogHandler.Log,
:log_forge_conclusion

event Software.Model.SoftwareType.LogForge.Edit.ConclusionEvent,
Log.Event.Log,
LogHandler.Log,
:log_forge_conclusion

##############################################################################
Expand All @@ -96,7 +100,7 @@ defmodule Helix.Event.Dispatcher.Helix do
Universe.Bank.Event.BankTransfer,
:transfer_aborted
event Universe.Bank.Model.BankTransfer.BankTransferAbortedEvent,
Software.Event.Cracker,
SoftwareHandler.Cracker,
:bank_transfer_aborted

event Universe.Bank.Model.BankTokenAcquiredEvent,
Expand Down
11 changes: 11 additions & 0 deletions lib/hell/hell/client_utils.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
defmodule HELL.ClientUtils do

alias HELL.HETypes

@spec to_timestamp(DateTime.t) ::
HETypes.client_timestamp
def to_timestamp(datetime) do
datetime
|> DateTime.to_unix()
end
end
5 changes: 5 additions & 0 deletions lib/hell/hell/pk/hetypes.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
defmodule HELL.HETypes do

@type client_timestamp :: integer

end
67 changes: 35 additions & 32 deletions lib/log/event/log.ex
Original file line number Diff line number Diff line change
@@ -1,53 +1,56 @@
defmodule Helix.Log.Event.Log do
defmodule Helix.Log.Event.Handler.Log do
@moduledoc false

alias Helix.Event
alias Helix.Entity.Query.Entity, as: EntityQuery
alias Helix.Network.Model.Connection.ConnectionStartedEvent
alias Helix.Network.Query.Tunnel, as: TunnelQuery
alias Helix.Server.Query.Server, as: ServerQuery
alias Helix.Software.Query.File, as: FileQuery
alias Helix.Log.Action.Log, as: LogAction
alias Helix.Log.Query.Log, as: LogQuery
alias Helix.Log.Repo

alias Helix.Software.Model.SoftwareType.FileDownload.ProcessConclusionEvent,
as: DownloadComplete
alias Helix.Software.Event.File.Downloaded, as: FileDownloadedEvent
alias Helix.Software.Model.SoftwareType.LogForge.Edit.ConclusionEvent,
as: LogForgeEditComplete
alias Helix.Software.Model.SoftwareType.LogForge.Create.ConclusionEvent,
as: LogForgeCreateComplete

@doc """
Logs that a file was downloaded from a certain server
"""
def file_download_conclusion(event = %DownloadComplete{}) do
from = event.from_server_id
to = event.to_server_id
ip_from = ServerQuery.get_ip(from, event.network_id)
ip_to = ServerQuery.get_ip(to, event.network_id)

entity = EntityQuery.fetch_by_server(to)

file = FileQuery.fetch(event.from_file_id)
# FIXME: move to a view helper
file_name =
file.full_path
|> String.split("/")
|> List.last()

message_from = "File #{file_name} downloaded by #{ip_to}"
message_to = "File #{file_name} downloaded from #{ip_from}"

{:ok, events} = Repo.transaction fn ->
{:ok, _, e1} = LogAction.create(from, entity, message_from)
{:ok, _, e2} = LogAction.create(to, entity, message_to)
e1 ++ e2
end

Event.emit(events)
def file_downloaded(event = %FileDownloadedEvent{}) do
event
# TODO essa coisa horrorosa
end

# @doc """
# Logs that a file was downloaded from a certain server
# """
# def file_download_conclusion(event = %DownloadComplete{}) do
# from = event.from_server_id
# to = event.to_server_id
# ip_from = ServerQuery.get_ip(from, event.network_id)
# ip_to = ServerQuery.get_ip(to, event.network_id)

# entity = EntityQuery.fetch_by_server(to)

# file = FileQuery.fetch(event.from_file_id)
# # FIXME: move to a view helper
# file_name =
# file.full_path
# |> String.split("/")
# |> List.last()

# message_from = "File #{file_name} downloaded by #{ip_to}"
# message_to = "File #{file_name} downloaded from #{ip_from}"

# {:ok, events} = Repo.transaction fn ->
# {:ok, _, e1} = LogAction.create(from, entity, message_from)
# {:ok, _, e2} = LogAction.create(to, entity, message_to)
# e1 ++ e2
# end

# Event.emit(events)
# end

@doc """
Forges a revision onto a log or creates a fake new log
"""
Expand Down
Loading

0 comments on commit 8e8c22c

Please sign in to comment.