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

Commit ba99ad8

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

39 files changed

Lines changed: 3100 additions & 85 deletions

File tree

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/universe/bank/action/bank.ex

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ defmodule Helix.Universe.Bank.Action.Bank do
2222
as: BankAccountUpdatedEvent
2323
alias Helix.Universe.Bank.Event.Bank.Account.Password.Revealed,
2424
as: BankAccountPasswordRevealedEvent
25+
alias Helix.Universe.Bank.Event.Bank.Account.Password.Changed,
26+
as: BankAccountPasswordChangedEvent
2527
alias Helix.Universe.Bank.Event.Bank.Account.Token.Acquired,
2628
as: BankAccountTokenAcquiredEvent
2729

@@ -198,6 +200,21 @@ defmodule Helix.Universe.Bank.Action.Bank do
198200
end
199201
end
200202

203+
@spec change_password(BankAccount.t, Entity.id) ::
204+
{:ok, BankAccount.t, [BankAccountPasswordChangedEvent.t]}
205+
| {:error, :internal}
206+
def change_password(account, changed_by) do
207+
event = BankAccountPasswordChangedEvent.new(account, changed_by)
208+
{:ok, account, [event]}
209+
end
210+
211+
@spec update_password(BankAccount.t) ::
212+
{:ok, BankAccount.t}
213+
| {:error, :internal}
214+
defdelegate update_password(account),
215+
to: BankAccountInternal,
216+
as: :change_password
217+
201218
@spec login_password(BankAccount.t, String.t, Entity.idt) ::
202219
{:ok, BankAccount.t, [BankAccountLoginEvent.t]}
203220
| term

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

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ defmodule Helix.Universe.Bank.Action.Flow.BankAccount do
1515

1616
alias Helix.Universe.Bank.Process.Bank.Account.RevealPassword,
1717
as: BankAccountRevealPasswordProcess
18+
alias Helix.Universe.Bank.Process.Bank.Account.ChangePassword,
19+
as: BankAccountChangePasswordProcess
1820

1921
@typep relay :: Event.relay
2022

@@ -46,6 +48,33 @@ defmodule Helix.Universe.Bank.Action.Flow.BankAccount do
4648
BankAccountRevealPasswordProcess.execute(gateway, atm, params, meta, relay)
4749
end
4850

51+
@spec open(Account.id, ATM.id) ::
52+
{:ok, BankAccount.t}
53+
| {:error, :internal}
54+
def open(account_id, atm_id) do
55+
bank_account =
56+
BankAction.open_account(account_id, atm_id)
57+
case bank_account do
58+
{:ok, bank_account} ->
59+
{:ok, bank_account}
60+
{:error, _} ->
61+
{:error, :internal}
62+
end
63+
end
64+
65+
@spec change_password(BankAccount.t, Server.t, Server.t, relay) ::
66+
{:ok, Process.t}
67+
| BankAccountChangePasswordProcess.executable_error
68+
def change_password(account, gateway, atm, relay) do
69+
meta = %{
70+
network_id: NetworkQuery.internet().network_id,
71+
src_atm_id: atm.server_id,
72+
src_acc_number: account.account_number,
73+
bounce: nil
74+
}
75+
76+
BankAccountChangePasswordProcess.execute(gateway, atm, %{}, meta, relay)
77+
end
4978
@doc """
5079
Logs into a bank account using a password. If the given password matches the
5180
current account password, the login is successful, in which case a BankLogin
@@ -74,9 +103,9 @@ defmodule Helix.Universe.Bank.Action.Flow.BankAccount do
74103
{:ok, _, events} <- BankAction.login_password(acc, password, entity),
75104
on_success(fn -> Event.emit(events) end),
76105

77-
{:ok, _, connection} <- start_connection.()
106+
{:ok, tunnel, connection} <- start_connection.()
78107
do
79-
{:ok, connection}
108+
{:ok, tunnel, connection}
80109
end
81110
end
82111
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
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
defmodule Helix.Universe.Bank.Event.ChangePassword do
2+
3+
import Helix.Event
4+
5+
event Processed do
6+
7+
alias Helix.Process.Model.Process
8+
alias Helix.Server.Model.Server
9+
alias Helix.Universe.Bank.Model.BankAccount
10+
alias Helix.Universe.Bank.Process.Bank.Account.ChangePassword,
11+
as: ChangePasswordProcess
12+
alias Helix.Universe.Bank.Query.Bank, as: BankQuery
13+
14+
@type t :: %__MODULE__{
15+
gateway_id: Server.id,
16+
account: BankAccount.t
17+
}
18+
19+
event_struct [:gateway_id, :account]
20+
21+
@spec new(BankAccount.t, Server.id) ::
22+
t
23+
def new(account = %BankAccount{}, gateway_id) do
24+
%__MODULE__{
25+
gateway_id: gateway_id,
26+
account: account
27+
}
28+
end
29+
30+
@spec new(Process.t, ChangePasswordProcess.t) ::
31+
t
32+
def new(process = %Process{}, _data = %ChangePasswordProcess{}) do
33+
atm_id = process.src_atm_id
34+
account_number = process.src_acc_number
35+
account = BankQuery.fetch_account(atm_id, account_number)
36+
37+
%__MODULE__{
38+
gateway_id: process.gateway_id,
39+
account: account
40+
}
41+
end
42+
end
43+
end

0 commit comments

Comments
 (0)