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

Commit 89a45e5

Browse files
author
Marcelo Amancio de Lima Santos
committed
WIP
1 parent df3b440 commit 89a45e5

44 files changed

Lines changed: 3245 additions & 121 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

lib/account/websocket/channel/account.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ channel Helix.Account.Websocket.Channel.Account do
2727
authenticated on the socket.
2828
+ base errors
2929
"""
30-
join _, AccountJoin
30+
join "account:" <> _, AccountJoin
3131

3232
@doc """
3333
Forces a bootstrap to happen. It is the exact same operation ran during join.

lib/core/validator/validator.ex

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ defmodule Helix.Core.Validator do
88

99
@regex_hostname ~r/^[a-zA-Z0-9-_.@#]{1,20}$/
1010

11+
@regex_token ~r/^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/
12+
1113
@spec validate_input(input :: String.t, input_type, opts :: term) ::
1214
{:ok, validated_input :: String.t}
1315
| :error
@@ -24,6 +26,9 @@ defmodule Helix.Core.Validator do
2426
def validate_input(input, :password, _),
2527
do: validate_password(input)
2628

29+
def validate_input(input, :money, _),
30+
do: validate_money(input)
31+
2732
def validate_input(input, :hostname, _),
2833
do: validate_hostname(input)
2934

@@ -33,6 +38,9 @@ defmodule Helix.Core.Validator do
3338
def validate_input(input, :reply_id, _),
3439
do: validate_reply_id(input)
3540

41+
def validate_input(input, :token, _),
42+
do: validate_token(input)
43+
3644
defp validate_hostname(v) when not is_binary(v),
3745
do: :error
3846
defp validate_hostname(v) do
@@ -43,6 +51,16 @@ defmodule Helix.Core.Validator do
4351
end
4452
end
4553

54+
defp validate_token(v) when not is_binary(v),
55+
do: :error
56+
defp validate_token(v) do
57+
if Regex.match?(@regex_token, v) do
58+
{:ok, v}
59+
else
60+
:error
61+
end
62+
end
63+
4664
defp validate_password(input),
4765
do: validate_hostname(input) # TODO
4866

@@ -51,4 +69,7 @@ defmodule Helix.Core.Validator do
5169

5270
defp validate_reply_id(v),
5371
do: validate_hostname(v) # TODO
72+
73+
defp validate_money(v),
74+
do: validate_hostname(v)
5475
end

lib/event/dispatcher.ex

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,10 +301,18 @@ defmodule Helix.Event.Dispatcher do
301301
BankHandler.Bank.Account,
302302
:password_reveal_processed
303303

304+
event BankEvent.ChangePassword.Processed,
305+
BankHandler.Bank.Account,
306+
:password_change_processed
307+
304308
event BankEvent.Bank.Account.Password.Revealed,
305309
EntityHandler.Database,
306310
:bank_password_revealed
307311

312+
event BankEvent.Bank.Account.Password.Changed,
313+
BankHandler.Bank.Account,
314+
:bank_password_changed
315+
308316
event BankEvent.Bank.Account.Login,
309317
EntityHandler.Database,
310318
:bank_account_login

lib/process/executable.ex

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -318,18 +318,25 @@ defmodule Helix.Process.Executable do
318318
src_acc_number: BankAccount.account | nil
319319
}
320320
@doc false
321-
defp get_source_bank_account(_, _, _, _),
322-
do: %{src_atm_id: nil, src_acc_number: nil}
321+
defp get_source_bank_account(_, _, _, meta) do
322+
%{
323+
src_atm_id: Map.get(meta, :src_atm_id, nil),
324+
src_acc_number: Map.get(meta, :src_acc_number, nil)
325+
}
326+
end
323327

324328
@spec get_target_bank_account(Server.t, Server.t, params, meta) ::
325329
%{
326330
tgt_atm_id: Server.t | nil,
327331
tgt_acc_number: BankAccount.account | nil
328332
}
329333
@doc false
330-
defp get_target_bank_account(_, _, _, _),
331-
do: %{tgt_atm_id: nil, tgt_acc_number: nil}
332-
334+
defp get_target_bank_account(_, _, _, meta) do
335+
%{
336+
tgt_atm_id: Map.get(meta, :tgt_atm_id, nil),
337+
tgt_acc_number: Map.get(meta, :tgt_acc_number, nil)
338+
}
339+
end
333340
@spec get_target_process(Server.t, Server.t, params, meta) ::
334341
%{tgt_process_id: Process.t | nil}
335342
@doc false

lib/process/model/process.ex

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ defmodule Helix.Process.Model.Process do
7777
| :cracker_bruteforce
7878
| :cracker_overflow
7979
| :install_virus
80+
| :bank_change_password
8081

8182
@typedoc """
8283
List of signals a process may receive during its lifetime.

lib/server/websocket/channel/server.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ channel Helix.Server.Websocket.Channel.Server do
293293
Disables the PublicFTP server of the player.
294294
295295
Params: none
296-
296+
297297
Returns: %{}
298298
299299
Errors:

lib/universe/bank/action/bank.ex

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ defmodule Helix.Universe.Bank.Action.Bank do
1010
alias Helix.Universe.Bank.Internal.BankAccount, as: BankAccountInternal
1111
alias Helix.Universe.Bank.Internal.BankToken, as: BankTokenInternal
1212
alias Helix.Universe.Bank.Internal.BankTransfer, as: BankTransferInternal
13+
alias Helix.Universe.Bank.Henforcer.Bank, as: BankHenforcer
1314
alias Helix.Universe.Bank.Model.ATM
1415
alias Helix.Universe.Bank.Model.BankAccount
1516
alias Helix.Universe.Bank.Model.BankToken
@@ -22,6 +23,8 @@ defmodule Helix.Universe.Bank.Action.Bank do
2223
as: BankAccountUpdatedEvent
2324
alias Helix.Universe.Bank.Event.Bank.Account.Password.Revealed,
2425
as: BankAccountPasswordRevealedEvent
26+
alias Helix.Universe.Bank.Event.Bank.Account.Password.Changed,
27+
as: BankAccountPasswordChangedEvent
2528
alias Helix.Universe.Bank.Event.Bank.Account.Token.Acquired,
2629
as: BankAccountTokenAcquiredEvent
2730

@@ -185,9 +188,7 @@ defmodule Helix.Universe.Bank.Action.Bank do
185188
"""
186189
def reveal_password(account, token_id, revealed_by) do
187190
with \
188-
token = %{} <- BankQuery.fetch_token(token_id),
189-
true <- account.account_number == token.account_number,
190-
true <- account.atm_id == token.atm_id
191+
{true, relay} <- BankHenforcer.token_valid?(account, token_id)
191192
do
192193
event = BankAccountPasswordRevealedEvent.new(account, revealed_by)
193194

@@ -198,6 +199,21 @@ defmodule Helix.Universe.Bank.Action.Bank do
198199
end
199200
end
200201

202+
@spec change_password(BankAccount.t, Entity.id) ::
203+
{:ok, BankAccount.t, [BankAccountPasswordChangedEvent.t]}
204+
| {:error, :internal}
205+
def change_password(account, changed_by) do
206+
event = BankAccountPasswordChangedEvent.new(account, changed_by)
207+
{:ok, account, [event]}
208+
end
209+
210+
@spec update_password(BankAccount.t) ::
211+
{:ok, BankAccount.t}
212+
| {:error, :internal}
213+
defdelegate update_password(account),
214+
to: BankAccountInternal,
215+
as: :change_password
216+
201217
@spec login_password(BankAccount.t, String.t, Entity.idt) ::
202218
{:ok, BankAccount.t, [BankAccountLoginEvent.t]}
203219
| term
@@ -226,12 +242,14 @@ defmodule Helix.Universe.Bank.Action.Bank do
226242
| term
227243
def login_token(account, token_id, login_by) do
228244
with \
229-
token = %{} <- BankQuery.fetch_token(token_id),
230-
true <- token.account_number == account.account_number
245+
{true, relay} <- BankHenforcer.token_valid?(account, token_id)
231246
do
232247
event = BankAccountLoginEvent.new(account, login_by, token_id)
233248

234249
{:ok, account, [event]}
250+
else
251+
{false, reason, _} ->
252+
{:error, reason}
235253
end
236254
end
237255

lib/universe/bank/action/flow/bank_account.ex

Lines changed: 46 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ defmodule Helix.Universe.Bank.Action.Flow.BankAccount do
55
alias Helix.Event
66
alias Helix.Entity.Query.Entity, as: EntityQuery
77
alias Helix.Network.Action.Flow.Tunnel, as: TunnelFlow
8+
alias Helix.Network.Model.Connection
89
alias Helix.Network.Query.Network, as: NetworkQuery
910
alias Helix.Process.Model.Process
1011
alias Helix.Server.Model.Server
@@ -15,6 +16,8 @@ defmodule Helix.Universe.Bank.Action.Flow.BankAccount do
1516

1617
alias Helix.Universe.Bank.Process.Bank.Account.RevealPassword,
1718
as: BankAccountRevealPasswordProcess
19+
alias Helix.Universe.Bank.Process.Bank.Account.ChangePassword,
20+
as: BankAccountChangePasswordProcess
1821

1922
@typep relay :: Event.relay
2023

@@ -29,7 +32,12 @@ defmodule Helix.Universe.Bank.Action.Flow.BankAccount do
2932
3033
Emits: ProcessCreatedEvent
3134
"""
32-
@spec reveal_password(BankAccount.t, BankToken.id, Server.t, Server.t, relay) ::
35+
@spec reveal_password(
36+
BankAccount.t,
37+
BankToken.id,
38+
Server.t,
39+
Server.t,
40+
relay) ::
3341
{:ok, Process.t}
3442
| BankAccountRevealPasswordProcess.executable_error
3543
def reveal_password(account, token_id, gateway, atm, relay) do
@@ -46,6 +54,41 @@ defmodule Helix.Universe.Bank.Action.Flow.BankAccount do
4654
BankAccountRevealPasswordProcess.execute(gateway, atm, params, meta, relay)
4755
end
4856

57+
@spec open(Account.id, ATM.id) ::
58+
{:ok, BankAccount.t}
59+
| {:error, :internal}
60+
@doc """
61+
Opens a new BankAccount to given Account.id
62+
"""
63+
def open(account_id, atm_id) do
64+
bank_account =
65+
BankAction.open_account(account_id, atm_id)
66+
case bank_account do
67+
{:ok, bank_account} ->
68+
{:ok, bank_account}
69+
{:error, _} ->
70+
{:error, :internal}
71+
end
72+
end
73+
74+
@spec change_password(BankAccount.t, Server.t, Server.t, relay) ::
75+
{:ok, Process.t}
76+
| BankAccountChangePasswordProcess.executable_error
77+
@doc """
78+
Starts a ChangePasswordProcess
79+
80+
Emits: ProcessCreatedEvent
81+
"""
82+
def change_password(account, gateway, atm, relay) do
83+
meta = %{
84+
network_id: NetworkQuery.internet().network_id,
85+
src_atm_id: atm.server_id,
86+
src_acc_number: account.account_number,
87+
bounce: nil
88+
}
89+
90+
BankAccountChangePasswordProcess.execute(gateway, atm, %{}, meta, relay)
91+
end
4992
@doc """
5093
Logs into a bank account using a password. If the given password matches the
5194
current account password, the login is successful, in which case a BankLogin
@@ -74,9 +117,9 @@ defmodule Helix.Universe.Bank.Action.Flow.BankAccount do
74117
{:ok, _, events} <- BankAction.login_password(acc, password, entity),
75118
on_success(fn -> Event.emit(events) end),
76119

77-
{:ok, _, connection} <- start_connection.()
120+
{:ok, tunnel, connection} <- start_connection.()
78121
do
79-
{:ok, connection}
122+
{:ok, tunnel, connection}
80123
end
81124
end
82125
end

lib/universe/bank/action/flow/bank_transfer.ex

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,11 @@ defmodule Helix.Universe.Bank.Action.Flow.BankTransfer do
6363

6464
meta = %{
6565
network_id: tunnel.network_id,
66-
bounce: tunnel.bounce_id
66+
bounce: tunnel.bounce_id,
67+
src_atm_id: from_account.atm_id,
68+
src_acc_number: from_account.account_number,
69+
tgt_atm_id: to_account.atm_id,
70+
tgt_acc_number: to_account.account_number
6771
}
6872

6973
BankTransferProcess.execute(gateway, target_atm, params, meta, relay)

lib/universe/bank/event/bank/account/password.ex

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,26 @@ defmodule Helix.Universe.Bank.Event.Bank.Account.Password do
2323
}
2424
end
2525
end
26+
27+
event Changed do
28+
29+
alias Helix.Entity.Model.Entity
30+
alias Helix.Universe.Bank.Model.BankAccount
31+
32+
@type t :: %__MODULE__{
33+
entity_id: Entity.id,
34+
account: BankAccount.t
35+
}
36+
37+
event_struct [:entity_id, :account]
38+
39+
@spec new(BankAccount.t, Entity.id) ::
40+
t
41+
def new(account = %BankAccount{}, entity_id) do
42+
%__MODULE__{
43+
entity_id: entity_id,
44+
account: account
45+
}
46+
end
47+
end
2648
end

0 commit comments

Comments
 (0)