diff options
| author | Jeff Halter <868228+jhalter@users.noreply.github.com> | 2022-06-25 21:46:08 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-06-25 21:46:08 -0700 |
| commit | 1632959187e9c7d8946126914af99270fc14d40a (patch) | |
| tree | 2c5e3316c800ad49248bf4d6b31bcb86f0993913 | |
| parent | 889a8f76762b2cb924e74a6b18f1283afcceaa93 (diff) | |
| parent | 1f34616efc9fa4b028892d4edb04af9da5b50a1a (diff) | |
Merge pull request #47 from jhalter/implement_access_send_priv_msg
Implement "Can Send Messages" permission
| -rw-r--r-- | hotline/access.go | 77 | ||||
| -rw-r--r-- | hotline/transaction_handlers.go | 5 | ||||
| -rw-r--r-- | hotline/transaction_handlers_test.go | 47 |
3 files changed, 90 insertions, 39 deletions
diff --git a/hotline/access.go b/hotline/access.go index bc3cb0d..ae72780 100644 --- a/hotline/access.go +++ b/hotline/access.go @@ -6,45 +6,44 @@ import ( ) const ( - // File System Maintenance - accessDeleteFile = 0 - accessUploadFile = 1 - accessDownloadFile = 2 // Can Download Files - accessRenameFile = 3 - accessMoveFile = 4 - accessCreateFolder = 5 - accessDeleteFolder = 6 - accessRenameFolder = 7 - accessMoveFolder = 8 - accessReadChat = 9 - accessSendChat = 10 - accessOpenChat = 11 - // accessCloseChat = 12 // Documented but unused? - // accessShowInList = 13 // Documented but unused? - accessCreateUser = 14 - accessDeleteUser = 15 - accessOpenUser = 16 - accessModifyUser = 17 - // accessChangeOwnPass = 18 // Documented but unused? - // accessSendPrivMsg = 19 // This doesn't do what it seems like it should do. TODO: Investigate - accessNewsReadArt = 20 - accessNewsPostArt = 21 - accessDisconUser = 22 // Toggles red user name in user list - accessCannotBeDiscon = 23 - accessGetClientInfo = 24 - accessUploadAnywhere = 25 - accessAnyName = 26 - accessNoAgreement = 27 - accessSetFileComment = 28 - accessSetFolderComment = 29 - accessViewDropBoxes = 30 - accessMakeAlias = 31 - accessBroadcast = 32 - accessNewsDeleteArt = 33 - accessNewsCreateCat = 34 - // accessNewsDeleteCat = 35 - accessNewsCreateFldr = 36 - // accessNewsDeleteFldr = 37 + accessDeleteFile = 0 // File System Maintenance: Can Delete Files + accessUploadFile = 1 // File System Maintenance: Can Upload Files + accessDownloadFile = 2 // File System Maintenance: Can Download Files + accessRenameFile = 3 // File System Maintenance: Can Rename Files + accessMoveFile = 4 // File System Maintenance: Can Move Files + accessCreateFolder = 5 // File System Maintenance: Can Create Folders + accessDeleteFolder = 6 // File System Maintenance: Can Delete Folders + accessRenameFolder = 7 // File System Maintenance: Can Rename Folders + accessMoveFolder = 8 // File System Maintenance: Can Move Folders + accessReadChat = 9 // Chat: Can Read Chat + accessSendChat = 10 // Chat: Can Send Chat + accessOpenChat = 11 // Chat: Can Initial Private Chat + accessCloseChat = 12 // Present in the Hotline 1.9 protocol documentation, but seemingly unused + accessShowInList = 13 // Present in the Hotline 1.9 protocol documentation, but seemingly unused + accessCreateUser = 14 // User Maintenance: Can Create Accounts + accessDeleteUser = 15 // User Maintenance: Can Delete Accounts + accessOpenUser = 16 // User Maintenance: Can Read Accounts + accessModifyUser = 17 // User Maintenance: Can Modify Accounts + accessChangeOwnPass = 18 // Present in the Hotline 1.9 protocol documentation, but seemingly unused + accessSendPrivMsg = 19 // Messaging: Can Send Messages + accessNewsReadArt = 20 // News: Can Read Articles + accessNewsPostArt = 21 // News: Can Post Articles + accessDisconUser = 22 // User Maintenance: Can Disconnect Users (Note: Turns username red in user list) + accessCannotBeDiscon = 23 // User Maintenance: Cannot be Disconnected + accessGetClientInfo = 24 // User Maintenance: Can Get User Info + accessUploadAnywhere = 25 // File System Maintenance: Can Upload Anywhere + accessAnyName = 26 // Miscellaneous: Can User Any Name + accessNoAgreement = 27 // Miscellaneous: Don't Show Agreement + accessSetFileComment = 28 // File System Maintenance: Can Comment Files + accessSetFolderComment = 29 // File System Maintenance: Can Comment Folders + accessViewDropBoxes = 30 // File System Maintenance: Can View Drop Boxes + accessMakeAlias = 31 // File System Maintenance: Can Make Aliases + accessBroadcast = 32 // Messaging: Can Broadcast + accessNewsDeleteArt = 33 // News: Can Delete Articles + accessNewsCreateCat = 34 // News: Can Create Categories + accessNewsDeleteCat = 35 // News: Can Delete Categories + accessNewsCreateFldr = 36 // News: Can Create News Bundles + accessNewsDeleteFldr = 37 // News: Can Delete News Bundles ) type accessBitmap [8]byte diff --git a/hotline/transaction_handlers.go b/hotline/transaction_handlers.go index 412868c..85879a4 100644 --- a/hotline/transaction_handlers.go +++ b/hotline/transaction_handlers.go @@ -299,6 +299,11 @@ func HandleChatSend(cc *ClientConn, t *Transaction) (res []Transaction, err erro // Fields used in the reply: // None func HandleSendInstantMsg(cc *ClientConn, t *Transaction) (res []Transaction, err error) { + if !cc.Authorize(accessSendPrivMsg) { + res = append(res, cc.NewErrReply(t, "You are not allowed to send private messages.")) + return res, err + } + msg := t.GetField(fieldData) ID := t.GetField(fieldUserID) diff --git a/hotline/transaction_handlers_test.go b/hotline/transaction_handlers_test.go index f43d45f..c504bbe 100644 --- a/hotline/transaction_handlers_test.go +++ b/hotline/transaction_handlers_test.go @@ -2288,9 +2288,48 @@ func TestHandleSendInstantMsg(t *testing.T) { wantErr assert.ErrorAssertionFunc }{ { + name: "without required permission", + args: args{ + cc: &ClientConn{ + Account: &Account{ + Access: func() *[]byte { + var bits accessBitmap + access := bits[:] + return &access + }(), + }, + }, + t: NewTransaction( + tranDelNewsArt, + &[]byte{0, 0}, + ), + }, + wantRes: []Transaction{ + { + Flags: 0x00, + IsReply: 0x01, + Type: []byte{0, 0x00}, + ID: []byte{0, 0, 0, 0}, + ErrorCode: []byte{0, 0, 0, 1}, + Fields: []Field{ + NewField(fieldError, []byte("You are not allowed to send private messages.")), + }, + }, + }, + wantErr: assert.NoError, + }, + { name: "when client 1 sends a message to client 2", args: args{ cc: &ClientConn{ + Account: &Account{ + Access: func() *[]byte { + var bits accessBitmap + bits.Set(accessSendPrivMsg) + access := bits[:] + return &access + }(), + }, ID: &[]byte{0, 1}, UserName: []byte("User1"), Server: &Server{ @@ -2333,6 +2372,14 @@ func TestHandleSendInstantMsg(t *testing.T) { name: "when client 2 has autoreply enabled", args: args{ cc: &ClientConn{ + Account: &Account{ + Access: func() *[]byte { + var bits accessBitmap + bits.Set(accessSendPrivMsg) + access := bits[:] + return &access + }(), + }, ID: &[]byte{0, 1}, UserName: []byte("User1"), Server: &Server{ |