Skip to content

Commit

Permalink
Add new capabilities to SDK: user related functions: create, delete, …
Browse files Browse the repository at this point in the history
…pw-change, set rigths, get rights
  • Loading branch information
halacs committed Jan 20, 2024
1 parent 573a095 commit 0cfe4da
Show file tree
Hide file tree
Showing 14 changed files with 812 additions and 12 deletions.
65 changes: 62 additions & 3 deletions sdk/Client.go
Original file line number Diff line number Diff line change
Expand Up @@ -410,14 +410,73 @@ func (c *Client) GetTransition(portID byte) (*payload.HmGetTransitionResponse, e
return transitionResponse, nil
}

func (c *Client) AddUser(username string, password string) error {
func (c *Client) AddUser(userName string, password string) (userId byte, err error) {
tc := c.getTransmissionContainer(COMMANDID_ADD_USER, payload.LoginPayload(userName, password))
response, err := c.transmitCommandWithResponse(tc)
if err != nil {
return 0, fmt.Errorf("failed to encode packet. %v", err)
}

if response == nil {
return 0, fmt.Errorf("unexpected nil response value")
}

if !response.isResponseFor(tc) {
return 0, fmt.Errorf("received unexpected packet: %s", response)
}

transitionResponse := response.Packet.payload.(*payload.AddUserResponse)
newUserId := transitionResponse.GetUserId()
return newUserId, nil
}

func (c *Client) RemoveUser(userId byte) error {
tc := c.getTransmissionContainer(COMMANDID_REMOVE_USER, payload.RemoveUserPayload(userId))
response, err := c.transmitCommandWithResponse(tc)
if err != nil {
return fmt.Errorf("failed to encode packet. %v", err)
}

if response == nil {
return fmt.Errorf("unexpected nil response value")
}

if !response.isResponseFor(tc) {
return fmt.Errorf("received unexpected packet: %s", response)
}

transitionResponse := response.Packet.payload.(*payload.RemoveUserResponse)
if transitionResponse.GetUserId() != userId {
return fmt.Errorf("failed to remove user. %v", transitionResponse)
}

return nil
}

func (c *Client) PasswordChange(userId byte, newPassword string) error {
tc := c.getTransmissionContainer(COMMANDID_CHANGE_PASSWD, payload.ChangeUserPasswordPayload(userId, newPassword))
response, err := c.transmitCommandWithResponse(tc)
if err != nil {
return fmt.Errorf("failed to encode packet. %v", err)
}

if response == nil {
return fmt.Errorf("unexpected nil response value")
}

if !response.isResponseFor(tc) {
return fmt.Errorf("received unexpected packet: %s", response)
}

return nil
}

func (c *Client) DeleteUser(username string) error {
/*
func (c *Client) SetUserRights(userId byte, ???) error {
return nil
}
func (c *Client) PasswordChange(username string, newPassword string) error {
func (c *Client) GetUserRights(userId byte, ???) error {
return nil
}
*/
84 changes: 77 additions & 7 deletions sdk/Consts.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,60 @@
package sdk

/*
Source: https://github.com/skelsec/pysecur3/blob/master/pysecur3/MCP.py
PING = 0
ERROR = 1
GET_MAC = 2
SET_VALUE = 3
GET_VALUE = 4
DEBUG = 5
JMCP = 6
GET_GW_VERSION = 7
LOGIN = 16
LOGOUT = 17
GET_USER_IDS = 32
GET_USER_NAME = 33
ADD_USER = 34
CHANGE_PASSWD = 35
REMOVE_USER = 36
SET_USER_RIGHTS = 37
GET_NAME = 38
SET_NAME = 39
GET_USER_RIGHTS = 40
ADD_PORT = 41
ADD_GROUP = 42
REMOVE_GROUP = 43
SET_GROUP_NAME = 44
GET_GROUP_NAME = 45
SET_GROUPED_PORTS = 46
GET_GROUPED_PORTS = 47
GET_PORTS = 48
GET_TYPE = 49
GET_STATE = 50
SET_STATE = 51
GET_PORT_NAME = 52
SET_PORT_NAME = 53
SET_TYPE = 54
GET_GROUP_IDS = 64
INHERIT_PORT = 65
REMOVE_PORT = 66
SET_SSL = 80
SCAN_WIFI = 81
WIFI_FOUND = 82
GET_WIFI_STATE = 83
HM_GET_TRANSITION = 112
CHANGE_USER_NAME = 67
CHANGE_USER_NAME_OF_USER = 68
CHANGE_PASSWORD_OF_USER = 69
*/

const (
RESPONSE_MASK = 0x80

Expand All @@ -13,14 +68,29 @@ const (
COMMANDID_SET_STATE = 0x33
COMMANDID_HM_GET_TRANSITION = 0x70

COMMANDID_PING_RESPONSE = COMMANDID_PING | RESPONSE_MASK
COMMANDID_GET_MAC_RESPONSE = COMMANDID_GET_MAC | RESPONSE_MASK
COMMANDID_JMCP_RESPONSE = COMMANDID_JMCP | RESPONSE_MASK
COMMANDID_LOGIN_RESPONSE = COMMANDID_LOGIN | RESPONSE_MASK
COMMANDID_LOGOUT_RESPONSE = COMMANDID_LOGOUT | RESPONSE_MASK
COMMANDID_GET_NAME_RESPONSE = COMMANDID_GET_NAME | RESPONSE_MASK
COMMANDID_SET_STATE_RESPONSE = COMMANDID_SET_STATE | RESPONSE_MASK
COMMANDID_GET_USER_IDS = 32
COMMANDID_GET_USER_NAME = 33
COMMANDID_ADD_USER = 0x22
COMMANDID_CHANGE_PASSWD = 0x45 // Original value: 0x23 == 35
COMMANDID_REMOVE_USER = 0x24
COMMANDID_SET_USER_RIGHTS = 0x25
COMMANDID_GET_USER_RIGHTS = 0x28

COMMANDID_PING_RESPONSE = COMMANDID_PING | RESPONSE_MASK
COMMANDID_GET_MAC_RESPONSE = COMMANDID_GET_MAC | RESPONSE_MASK
COMMANDID_JMCP_RESPONSE = COMMANDID_JMCP | RESPONSE_MASK
COMMANDID_LOGIN_RESPONSE = COMMANDID_LOGIN | RESPONSE_MASK
COMMANDID_LOGOUT_RESPONSE = COMMANDID_LOGOUT | RESPONSE_MASK
COMMANDID_GET_NAME_RESPONSE = COMMANDID_GET_NAME | RESPONSE_MASK
//COMMANDID_SET_STATE_RESPONSE = COMMANDID_SET_STATE | RESPONSE_MASK
COMMANDID_HM_GET_TRANSITION_RESPONSE = COMMANDID_HM_GET_TRANSITION | RESPONSE_MASK
COMMANDID_GET_USER_IDS_RESPONSE = COMMANDID_GET_USER_IDS | RESPONSE_MASK
COMMANDID_GET_USER_NAME_RESPONSE = COMMANDID_GET_USER_NAME | RESPONSE_MASK
COMMANDID_ADD_USER_RESPONSE = COMMANDID_ADD_USER | RESPONSE_MASK
COMMANDID_CHANGE_PASSWD_RESPONSE = COMMANDID_CHANGE_PASSWD | RESPONSE_MASK
COMMANDID_REMOVE_USER_RESPONSE = COMMANDID_REMOVE_USER | RESPONSE_MASK
COMMANDID_SET_USER_RIGHTS_RESPONSE = COMMANDID_SET_USER_RIGHTS | RESPONSE_MASK
COMMANDID_GET_USER_RIGHTS_RESPONSE = COMMANDID_GET_USER_RIGHTS | RESPONSE_MASK

PORT_TYPE_NONE = 0
PORT_TYPE_IMPULS = 1
Expand Down
54 changes: 54 additions & 0 deletions sdk/Packet.go
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,60 @@ func DecodePacket(packetLength uint16, buffer *bytes.Buffer) (*Packet, error) {
return nil, err2
}
p.payload = pl
case COMMANDID_ADD_USER:
pl, err2 := payload.DecodeLoginPayload(payloadBytes)
if err2 != nil {
return nil, err2
}
p.payload = pl
case COMMANDID_ADD_USER_RESPONSE:
pl, err2 := payload.DecodeAddUserResponsePayload(payloadBytes)
if err2 != nil {
return nil, err2
}
p.payload = pl
case COMMANDID_GET_USER_RIGHTS:
pl, err2 := payload.DecodeGetUserRightsPayload(payloadBytes)
if err2 != nil {
return nil, err2
}
p.payload = pl
case COMMANDID_GET_USER_RIGHTS_RESPONSE:
pl, err2 := payload.DecodeGetUserRightsResponsePayload(payloadBytes)
if err2 != nil {
return nil, err2
}
p.payload = pl
case COMMANDID_SET_USER_RIGHTS_RESPONSE:
pl, err2 := payload.DecodeSetUserRightsResponsePayload(payloadBytes)
if err2 != nil {
return nil, err2
}
p.payload = pl
case COMMANDID_SET_USER_RIGHTS:
pl, err2 := payload.DecodeSetUserRightsPayload(payloadBytes)
if err2 != nil {
return nil, err2
}
p.payload = pl
case COMMANDID_REMOVE_USER:
pl, err2 := payload.DecodeRemoveUserPayload(payloadBytes)
if err2 != nil {
return nil, err2
}
p.payload = pl
case COMMANDID_REMOVE_USER_RESPONSE:
pl, err2 := payload.DecodeRemoveUserResponsePayload(payloadBytes)
if err2 != nil {
return nil, err2
}
p.payload = pl
case COMMANDID_CHANGE_PASSWD:
pl, err2 := payload.DecodeChangeUserPasswordPayload(payloadBytes)
if err2 != nil {
return nil, err2
}
p.payload = pl
default:
p.payload = payload.EmptyPayload()
}
Expand Down
Loading

0 comments on commit 0cfe4da

Please sign in to comment.