aboutsummaryrefslogtreecommitdiff
path: root/hotline
diff options
context:
space:
mode:
authorJeff Halter <868228+jhalter@users.noreply.github.com>2022-06-25 21:46:08 -0700
committerGitHub <noreply@github.com>2022-06-25 21:46:08 -0700
commit1632959187e9c7d8946126914af99270fc14d40a (patch)
tree2c5e3316c800ad49248bf4d6b31bcb86f0993913 /hotline
parent889a8f76762b2cb924e74a6b18f1283afcceaa93 (diff)
parent1f34616efc9fa4b028892d4edb04af9da5b50a1a (diff)
Merge pull request #47 from jhalter/implement_access_send_priv_msg
Implement "Can Send Messages" permission
Diffstat (limited to 'hotline')
-rw-r--r--hotline/access.go77
-rw-r--r--hotline/transaction_handlers.go5
-rw-r--r--hotline/transaction_handlers_test.go47
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{