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
+ accessNewsReadArt = 20
+ accessNewsPostArt = 21
+ accessDisconUser = 22 // Toggles red user name in user list
+ accessCannotBeDiscon = 23
+ accessGetClientInfo = 24
//accessUploadAnywhere = 25
//accessAnyName = 26
//accessNoAgreement = 27
//accessSetFolderComment = 29
//accessViewDropBoxes = 30
//accessMakeAlias = 31
- accessBroadcast = 32
- accessNewsDeleteArt = 33
- accessNewsCreateCat = 34
+ accessBroadcast = 32
+ accessNewsDeleteArt = 33
+ accessNewsCreateCat = 34
//accessNewsDeleteCat = 35
- accessNewsCreateFldr = 36
+ accessNewsCreateFldr = 36
//accessNewsDeleteFldr = 37
)
+type accessBitmap [8]byte
+
+func (bits *accessBitmap) Set(i int) {
+ bits[i/8] |= 1 << uint(7-i%8)
+}
+
+// authorize checks if 64 bit access slice contain has accessBit set
+// TODO: refactor to use accessBitmap type
func authorize(access *[]byte, accessBit int) bool {
if accessBit == accessAlwaysAllow {
return true
}
- accessBitmap := big.NewInt(int64(binary.BigEndian.Uint64(*access)))
+ bits := big.NewInt(int64(binary.BigEndian.Uint64(*access)))
- return accessBitmap.Bit(63-accessBit) == 1
+ return bits.Bit(63-accessBit) == 1
}
Handler: HandleSetUser,
},
tranUploadFile: {
- Access: accessUploadFile,
+ Access: accessAlwaysAllow,
DenyMsg: "You are not allowed to upload files.",
Name: "tranUploadFile",
Handler: HandleUploadFile,
}
func HandleUploadFile(cc *ClientConn, t *Transaction) (res []Transaction, err error) {
+ // TODO: add permission handing for upload folders and drop boxes
+ if !authorize(cc.Account.Access, accessUploadFile) {
+ res = append(res, cc.NewErrReply(t, "You are not allowed to upload files."))
+ return res, err
+ }
+
fileName := t.GetField(fieldFileName).Data
filePath := t.GetField(fieldFilePath).Data
transactionRef := cc.Server.NewTransactionRef()
data := binary.BigEndian.Uint32(transactionRef)
- fileTransfer := &FileTransfer{
+ cc.Server.FileTransfers[data] = &FileTransfer{
FileName: fileName,
FilePath: filePath,
ReferenceNumber: transactionRef,
Type: FileUpload,
}
- cc.Server.FileTransfers[data] = fileTransfer
-
res = append(res, cc.NewReply(t, NewField(fieldRefNum, transactionRef)))
return res, err
}