Skip to content

Commit

Permalink
fixes to RPC and process status code in responses differently. some o…
Browse files Browse the repository at this point in the history
…lder servers return statuscode 3 instead of 0
  • Loading branch information
Etienne Stalmans committed May 2, 2017
1 parent 22c5f24 commit 80a7509
Show file tree
Hide file tree
Showing 6 changed files with 49 additions and 41 deletions.
4 changes: 3 additions & 1 deletion forms/rulerforms.go
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,9 @@ func CreateFormMessage(suffix string) ([]byte, error) {
}
//the small icon for the message
propertyTagx[4] = mapi.TaggedPropertyValue{PropertyTag: mapi.PidTag6823, PropertyValue: append(utils.COUNT(len(data)), data...)}
_, err = mapi.SetMessageProperties(folderid, msg.MessageID, propertyTagx)
if _, err = mapi.SetMessageProperties(folderid, msg.MessageID, propertyTagx); err != nil {
return nil, err
}

propertyTagx = make([]mapi.TaggedPropertyValue, 4)
data, err = utils.ReadFile("templates/img1.bin")
Expand Down
3 changes: 3 additions & 0 deletions mapi/datastructs.go
Original file line number Diff line number Diff line change
Expand Up @@ -1162,6 +1162,9 @@ func (execResponse *ExecuteResponse) Unmarshal(resp []byte) error {
execResponse.ErrorCode, pos = utils.ReadUint32(pos, resp) //error code if MAPIHTTP else this is also the buffer size
execResponse.Flags, pos = utils.ReadUint32(pos, resp)
execResponse.RopBufferSize, pos = utils.ReadUint32(pos, resp)
if len(resp) < pos+int(execResponse.RopBufferSize) {
return nil
}
buf, pos = utils.ReadBytes(pos, int(execResponse.RopBufferSize), resp)
execResponse.RopBuffer = buf
execResponse.AuxilliaryBufSize, _ = utils.ReadUint32(pos, resp)
Expand Down
60 changes: 28 additions & 32 deletions mapi/mapi.go
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ func Init(config *utils.Session, lid, URL, ABKURL string, transport int) {
AuthSession.Transport = transport
AuthSession.ClientSet = false
AuthSession.ReqCounter = 1
AuthSession.LogonID = 0x09
AuthSession.LogonID = 0x08f
AuthSession.Authenticated = false

//default to Encrypt + Sign for NTLM
Expand Down Expand Up @@ -417,7 +417,7 @@ func AuthenticateFetchMailbox(essdn []byte) (*RopLogonResponse, error) {
return nil, &TransportError{err}
}

if execResponse.StatusCode == 0 || execResponse.StatusCode == 3 {
if execResponse.StatusCode != 255 {
AuthSession.Authenticated = true

logonResponse := RopLogonResponse{}
Expand Down Expand Up @@ -467,7 +467,7 @@ func ReleaseObject(inputHandle byte) (*RopReleaseResponse, error) {
return nil, &TransportError{err}
}

if execResponse.StatusCode == 0 {
if execResponse.StatusCode != 255 {
ropReleaseResponse := RopReleaseResponse{}
if _, e := ropReleaseResponse.Unmarshal(execResponse.RopBuffer[10:]); e != nil {
return nil, e
Expand Down Expand Up @@ -736,7 +736,7 @@ func SetMessageStatus(folderid, messageid []byte) (*RopSetMessageStatusResponse,
return nil, &TransportError{err}
}

if execResponse.StatusCode == 0 {
if execResponse.StatusCode != 255 {
bufPtr := 10

setStatusResp := RopSetMessageStatusResponse{}
Expand Down Expand Up @@ -809,7 +809,7 @@ func CreateMessageRequest(folderID []byte, properties []TaggedPropertyValue, ass
return nil, &TransportError{err}
}

if execResponse.StatusCode == 0 {
if execResponse.StatusCode != 255 {
bufPtr := 10
var p int
var e error
Expand Down Expand Up @@ -901,7 +901,7 @@ func CreateMessageAttachment(folderid, messageid []byte, properties []TaggedProp
return nil, &TransportError{err}
}

if execResponse.StatusCode == 0 {
if execResponse.StatusCode != 255 {
bufPtr := 10
var p int
var e error
Expand Down Expand Up @@ -941,14 +941,6 @@ func CreateMessageAttachment(folderid, messageid []byte, properties []TaggedProp
saveMessageResponse := RopSaveChangesMessageResponse{}
e = saveMessageResponse.Unmarshal(execResponse.RopBuffer[bufPtr:])

/*
utils.Debug.Println("Get Message: ", getMessageResp)
utils.Debug.Println("Get AttachTbl: ", getAttachmentTblResp)
utils.Debug.Println("Create Attach: ", createAttachmentResp)
utils.Debug.Println("Set Props: ", propertiesResponse)
utils.Debug.Println("Save Attach: ", saveAttachmentResp)
utils.Debug.Println("Save Message: ", saveMessageResponse)
*/
return &createAttachmentResp, e
}

Expand Down Expand Up @@ -998,7 +990,7 @@ func WriteAttachmentProperty(folderid, messageid []byte, attachmentid uint32, pr
return nil, &TransportError{err}
}

if execResponse.StatusCode == 0 {
if execResponse.StatusCode != 255 {
bufPtr := 10
var p int
var e error
Expand Down Expand Up @@ -1133,7 +1125,7 @@ func WriteAttachmentProperty(folderid, messageid []byte, attachmentid uint32, pr
return nil, &TransportError{err}
}

if execResponse.StatusCode == 0 {
if execResponse.StatusCode != 255 {
bufPtr := 10
var p int
var e error
Expand Down Expand Up @@ -1163,6 +1155,7 @@ func WriteAttachmentProperty(folderid, messageid []byte, attachmentid uint32, pr
return &RopSaveChangesAttachmentResponse{}, ErrUnknown
}

//SetMessageProperties is used to update the properties of a message
func SetMessageProperties(folderid, messageid []byte, propertyTags []TaggedPropertyValue) (*RopSaveChangesMessageResponse, error) {

execRequest := ExecuteRequest{}
Expand Down Expand Up @@ -1207,7 +1200,7 @@ func SetMessageProperties(folderid, messageid []byte, propertyTags []TaggedPrope
return nil, &TransportError{err}
}

if execResponse.StatusCode == 0 {
if execResponse.StatusCode != 255 {
bufPtr := 10
var p int
var e error
Expand Down Expand Up @@ -1264,7 +1257,7 @@ func SetPropertyFast(folderid []byte, messageid []byte, property TaggedPropertyV
return nil, &TransportError{err}
}

if execResponse.StatusCode == 0 {
if execResponse.StatusCode != 255 {

//we probably need to get the handles here to pass them down into the ServerObjectHandleTable
serverHandles := execResponse.RopBuffer[len(execResponse.RopBuffer)-8:]
Expand Down Expand Up @@ -1350,7 +1343,7 @@ func SaveMessageFast(inputHandle, responseHandle byte, serverHandles []byte) (*R
}

//fmt.Println("Complete")
if execResponse.StatusCode == 0 {
if execResponse.StatusCode != 255 {
bufPtr := 10

saveMessageResponse := RopSaveChangesMessageResponse{}
Expand Down Expand Up @@ -1397,7 +1390,7 @@ func DeleteMessages(folderid []byte, messageIDCount int, messageIDs []byte) (*Ro
return nil, &TransportError{err}
}

if execResponse.StatusCode == 0 {
if execResponse.StatusCode != 255 {
bufPtr := 10
openFolder := RopOpenFolderResponse{}
p, err := openFolder.Unmarshal(execResponse.RopBuffer[bufPtr:])
Expand Down Expand Up @@ -1448,7 +1441,7 @@ func EmptyFolder(folderid []byte) (*RopEmptyFolderResponse, error) {
return nil, &TransportError{err}
}

if execResponse.StatusCode == 0 {
if execResponse.StatusCode != 255 {
bufPtr := 10
openFolder := RopOpenFolderResponse{}
p, err := openFolder.Unmarshal(execResponse.RopBuffer[bufPtr:])
Expand Down Expand Up @@ -1489,7 +1482,7 @@ func DeleteFolder(folderid []byte) (*RopDeleteFolderResponse, error) {
return nil, &TransportError{err}
}

if execResponse.StatusCode == 0 {
if execResponse.StatusCode != 255 {
bufPtr := 10
deleteFolder := RopDeleteFolderResponse{}
if _, e := deleteFolder.Unmarshal(execResponse.RopBuffer[bufPtr:]); e != nil {
Expand Down Expand Up @@ -1604,7 +1597,7 @@ func GetMessage(folderid, messageid []byte, columns []PropertyTag) (*RopGetPrope
return nil, &TransportError{err}
}

if execResponse.StatusCode == 0 {
if execResponse.StatusCode != 255 {

bufPtr := 10
var p int
Expand Down Expand Up @@ -1674,7 +1667,7 @@ func GetMessageFast(folderid, messageid []byte, columns []PropertyTag) (*RopFast
return nil, &TransportError{err}
}

if execResponse.StatusCode == 0 {
if execResponse.StatusCode != 255 {

bufPtr := 10
var p int
Expand Down Expand Up @@ -1741,7 +1734,7 @@ func FastTransferFetchStep(handles []byte) ([]byte, error) {
return nil, &TransportError{err}
}

if execResponse.StatusCode == 0 {
if execResponse.StatusCode != 255 {
if execResponse.RopBuffer[2] == 0x05 { //compression
//decompress
}
Expand Down Expand Up @@ -1818,11 +1811,13 @@ func GetContentsTableRequest(folderid []byte, tableFlags byte) (*RopGetContentsT
return nil, nil, &TransportError{err}
}

if execResponse.StatusCode == 0 {
if execResponse.StatusCode != 255 {
bufPtr := 10
var p int
var e error

if bufPtr > len(execResponse.RopBuffer) {
return nil, nil, fmt.Errorf("Empty table")
}
openFolder := RopOpenFolderResponse{}
if p, e = openFolder.Unmarshal(execResponse.RopBuffer[bufPtr:]); e != nil {
return nil, nil, e
Expand All @@ -1833,7 +1828,8 @@ func GetContentsTableRequest(folderid []byte, tableFlags byte) (*RopGetContentsT
if p, e = ropContents.Unmarshal(execResponse.RopBuffer[bufPtr:]); e != nil {
return nil, nil, e
}
bufPtr += p + 8
bufPtr += p

return &ropContents, execResponse.RopBuffer[bufPtr:], nil
}

Expand Down Expand Up @@ -1869,7 +1865,7 @@ func GetFolderHierarchy(folderid []byte) (*RopGetHierarchyTableResponse, []byte,
return nil, nil, &TransportError{err}
}

if execResponse.StatusCode == 0 {
if execResponse.StatusCode != 255 {
bufPtr := 10
var p int
var e error
Expand Down Expand Up @@ -1923,7 +1919,7 @@ func GetSubFolders(folderid []byte) (*RopQueryRowsResponse, error) {
return nil, &TransportError{err}
}

if execResponse.StatusCode == 0 {
if execResponse.StatusCode != 255 {
bufPtr := 10
var p int
var e error
Expand Down Expand Up @@ -1987,7 +1983,7 @@ func CreateFolder(folderName string, hidden bool) (*RopCreateFolderResponse, err
return nil, ErrTransport //&TransportError{err}
}

if execResponse.StatusCode == 0 {
if execResponse.StatusCode != 255 {
bufPtr := 10
createFolder := RopCreateFolderResponse{}
if _, e := createFolder.Unmarshal(execResponse.RopBuffer[bufPtr:]); e != nil {
Expand Down Expand Up @@ -2068,7 +2064,7 @@ func GetTableContents(folderid []byte, assoc bool, columns []PropertyTag) (*RopQ
return nil, &TransportError{err}
}

if execResponse.StatusCode == 0 {
if execResponse.StatusCode != 255 {
bufPtr := 10
var p int
var e error
Expand Down
3 changes: 3 additions & 0 deletions rpc-http/packets.go
Original file line number Diff line number Diff line change
Expand Up @@ -476,6 +476,9 @@ func (response *RPCResponse) Unmarshal(raw []byte) (int, error) {
} else {
if len(raw) > int(response.Header.FragLen-response.Header.AuthLen-24) {
response.PDU, pos = utils.ReadBytes(pos, int(response.Header.FragLen-response.Header.AuthLen-24), raw)
if len(raw) < pos+int(response.Header.AuthLen) {
return pos, nil
}
response.SecTrailer, pos = utils.ReadBytes(pos, int(response.Header.AuthLen), raw)
} else {

Expand Down
18 changes: 11 additions & 7 deletions rpc-http/rpctransport.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ func setupHTTP(rpctype string, URL string, ntlmAuth bool, full bool) (net.Conn,
}

if err != nil {
utils.Error.Println("RPC Setup Err", err)
return nil, err
}
var request string
Expand Down Expand Up @@ -87,7 +88,7 @@ func setupHTTP(rpctype string, URL string, ntlmAuth bool, full bool) (net.Conn,
if full == false {
return nil, fmt.Errorf("Failed with initial setup for %s : %s\n", rpctype, err)
}
utils.Trace.Printf("Failed with initial setup for %s trying again...\n", rpctype)
//utils.Trace.Printf("Failed with initial setup for %s trying again...\n", rpctype)
return setupHTTP(rpctype, URL, ntlmAuth, false)
}

Expand All @@ -101,7 +102,7 @@ func setupHTTP(rpctype string, URL string, ntlmAuth bool, full bool) (net.Conn,
}
}
}
utils.Trace.Println(string(data))
//utils.Trace.Println(string(data))

ntlmChallengeString := strings.Replace(ntlmChallengeHeader, "NTLM ", "", 1)
challengeBytes, err := utils.DecBase64(ntlmChallengeString)
Expand Down Expand Up @@ -131,7 +132,7 @@ func setupHTTP(rpctype string, URL string, ntlmAuth bool, full bool) (net.Conn,
authenticate, err = session.GenerateAuthenticateMessage()

if err != nil {
//panic(err)
utils.Error.Println("Authentication Err")
return nil, err
}
}
Expand Down Expand Up @@ -183,7 +184,7 @@ func RPCOpen(URL string, readySignal chan bool, errOccurred chan error) (err err
readySignal <- false
errOccurred <- err
return err
case <-time.After(time.Second * 2): // call timed out
case <-time.After(time.Second * 20): // call timed out
readySignal <- true
}

Expand All @@ -194,7 +195,7 @@ func RPCOpen(URL string, readySignal chan bool, errOccurred chan error) (err err
_, err = rpcInConn.Write(data[:n])
}
if err != nil && err != io.EOF {
utils.Error.Println(err)
utils.Error.Println("RPCIN_ERROR: ", err)
break
}
}
Expand Down Expand Up @@ -493,7 +494,9 @@ func RPCWrite(data []byte) {
//RPCOutWrite function writes to the RPC_OUT_DATA channel,
//this should only happen once, for ConnA1
func RPCOutWrite(data []byte) {
rpcOutConn.Write(data)
if rpcOutConn != nil {
rpcOutConn.Write(data)
}
}

//RPCRead function takes a call ID and searches for the response in
Expand All @@ -518,7 +521,8 @@ func RPCRead(callID int) (RPCResponse, error) {
select {
case resp := <-c:
return resp, nil
case <-time.After(time.Second * 10): // call timed out
case <-time.After(time.Second * 15): // call timed out
utils.Error.Println("RPC Timeout")
//check if there is a 401 or other error message
for k, v := range httpResponses {
st := string(v)
Expand Down
2 changes: 1 addition & 1 deletion utils/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,7 @@ func ReadByte(pos int, buff []byte) (byte, int) {
func ReadUnicodeString(pos int, buff []byte) ([]byte, int) {
//stupid hack as using bufio and ReadString(byte) would terminate too early
//would terminate on 0x00 instead of 0x0000
index := bytes.Index(buff[pos:], []byte{0x00, 0x00, 0x00}) + 1
index := bytes.Index(buff[pos:], []byte{0x00, 0x00, 0x00})
str := buff[pos : pos+index]
return []byte(str), pos + index + 2
}
Expand Down

0 comments on commit 80a7509

Please sign in to comment.