codekingpro/portable-devtools
114k
1#!/usr/bin/env python32'''3@author: David Shaw, shawd@vmware.com4 5Inspired by EAS Inspector for Fiddler6https://easinspectorforfiddler.codeplex.com7 8----- The MIT License (MIT) ----- 9Filename: ASWBXML.py10Copyright (c) 2014, David P. Shaw11 12Permission is hereby granted, free of charge, to any person obtaining a copy13of this software and associated documentation files (the "Software"), to deal14in the Software without restriction, including without limitation the rights15to use, copy, modify, merge, publish, distribute, sublicense, and/or sell16copies of the Software, and to permit persons to whom the Software is17furnished to do so, subject to the following conditions:18 19The above copyright notice and this permission notice shall be included in20all copies or substantial portions of the Software.21 22THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR23IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,24FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE25AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER26LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,27OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN28THE SOFTWARE.29'''30import xml.dom.minidom31import logging32 33from .ASWBXMLCodePage import ASWBXMLCodePage34from .ASWBXMLByteQueue import ASWBXMLByteQueue35from .GlobalTokens import GlobalTokens36from .InvalidDataException import InvalidDataException37 38class ASWBXML:39 versionByte = 0x0340 publicIdentifierByte = 0x0141 characterSetByte = 0x6A42 stringTableLengthByte = 0x0043 44 def __init__(self):45 46 # empty on init47 self.xmlDoc = xml.dom.minidom.Document()48 self.currentCodePage = 049 self.defaultCodePage = -150 51 # Load up code pages52 # Currently there are 25 code pages as per MS-ASWBXML53 self.codePages = []54 55 # region Code Page Initialization56 # Code Page 0: AirSync57 # region AirSync Code Page58 page = ASWBXMLCodePage()59 page.namespace = "AirSync:"60 page.xmlns = "airsync"61 62 page.addToken(0x05, "Sync")63 page.addToken(0x06, "Responses")64 page.addToken(0x07, "Add")65 page.addToken(0x08, "Change")66 page.addToken(0x09, "Delete")67 page.addToken(0x0A, "Fetch")68 page.addToken(0x0B, "SyncKey")69 page.addToken(0x0C, "ClientId")70 page.addToken(0x0D, "ServerId")71 page.addToken(0x0E, "Status")72 page.addToken(0x0F, "Collection")73 page.addToken(0x10, "Class")74 page.addToken(0x12, "CollectionId")75 page.addToken(0x13, "GetChanges")76 page.addToken(0x14, "MoreAvailable")77 page.addToken(0x15, "WindowSize")78 page.addToken(0x16, "Commands")79 page.addToken(0x17, "Options")80 page.addToken(0x18, "FilterType")81 page.addToken(0x1B, "Conflict")82 page.addToken(0x1C, "Collections")83 page.addToken(0x1D, "ApplicationData")84 page.addToken(0x1E, "DeletesAsMoves")85 page.addToken(0x20, "Supported")86 page.addToken(0x21, "SoftDelete")87 page.addToken(0x22, "MIMESupport")88 page.addToken(0x23, "MIMETruncation")89 page.addToken(0x24, "Wait")90 page.addToken(0x25, "Limit")91 page.addToken(0x26, "Partial")92 page.addToken(0x27, "ConversationMode")93 page.addToken(0x28, "MaxItems")94 page.addToken(0x29, "HeartbeatInterval")95 self.codePages.append(page)96 # endregion97 98 # Code Page 1: Contacts99 # region Contacts Code Page100 page = ASWBXMLCodePage()101 page.namespace = "Contacts:"102 page.xmlns = "contacts"103 104 page.addToken(0x05, "Anniversary")105 page.addToken(0x06, "AssistantName")106 page.addToken(0x07, "AssistantTelephoneNumber")107 page.addToken(0x08, "Birthday")108 page.addToken(0x0C, "Business2PhoneNumber")109 page.addToken(0x0D, "BusinessCity")110 page.addToken(0x0E, "BusinessCountry")111 page.addToken(0x0F, "BusinessPostalCode")112 page.addToken(0x10, "BusinessState")113 page.addToken(0x11, "BusinessStreet")114 page.addToken(0x12, "BusinessFaxNumber")115 page.addToken(0x13, "BusinessPhoneNumber")116 page.addToken(0x14, "CarPhoneNumber")117 page.addToken(0x15, "Categories")118 page.addToken(0x16, "Category")119 page.addToken(0x17, "Children")120 page.addToken(0x18, "Child")121 page.addToken(0x19, "CompanyName")122 page.addToken(0x1A, "Department")123 page.addToken(0x1B, "Email1Address")124 page.addToken(0x1C, "Email2Address")125 page.addToken(0x1D, "Email3Address")126 page.addToken(0x1E, "FileAs")127 page.addToken(0x1F, "FirstName")128 page.addToken(0x20, "Home2PhoneNumber")129 page.addToken(0x21, "HomeCity")130 page.addToken(0x22, "HomeCountry")131 page.addToken(0x23, "HomePostalCode")132 page.addToken(0x24, "HomeState")133 page.addToken(0x25, "HomeStreet")134 page.addToken(0x26, "HomeFaxNumber")135 page.addToken(0x27, "HomePhoneNumber")136 page.addToken(0x28, "JobTitle")137 page.addToken(0x29, "LastName")138 page.addToken(0x2A, "MiddleName")139 page.addToken(0x2B, "MobilePhoneNumber")140 page.addToken(0x2C, "OfficeLocation")141 page.addToken(0x2D, "OtherCity")142 page.addToken(0x2E, "OtherCountry")143 page.addToken(0x2F, "OtherPostalCode")144 page.addToken(0x30, "OtherState")145 page.addToken(0x31, "OtherStreet")146 page.addToken(0x32, "PagerNumber")147 page.addToken(0x33, "RadioPhoneNumber")148 page.addToken(0x34, "Spouse")149 page.addToken(0x35, "Suffix")150 page.addToken(0x36, "Title")151 page.addToken(0x37, "Webpage")152 page.addToken(0x38, "YomiCompanyName")153 page.addToken(0x39, "YomiFirstName")154 page.addToken(0x3A, "YomiLastName")155 page.addToken(0x3C, "Picture")156 page.addToken(0x3D, "Alias")157 page.addToken(0x3E, "WeightedRank")158 self.codePages.append(page)159 # endregion160 161 # Code Page 2: Email162 # region Email Code Page163 page = ASWBXMLCodePage()164 page.namespace = "Email:"165 page.xmlns = "email"166 167 page.addToken(0x0F, "DateReceived")168 page.addToken(0x11, "DisplayTo")169 page.addToken(0x12, "Importance")170 page.addToken(0x13, "MessageClass")171 page.addToken(0x14, "Subject")172 page.addToken(0x15, "Read")173 page.addToken(0x16, "To")174 page.addToken(0x17, "CC")175 page.addToken(0x18, "From")176 page.addToken(0x19, "ReplyTo")177 page.addToken(0x1A, "AllDayEvent")178 page.addToken(0x1B, "Categories")179 page.addToken(0x1C, "Category")180 page.addToken(0x1D, "DTStamp")181 page.addToken(0x1E, "EndTime")182 page.addToken(0x1F, "InstanceType")183 page.addToken(0x20, "BusyStatus")184 page.addToken(0x21, "Location")185 page.addToken(0x22, "MeetingRequest")186 page.addToken(0x23, "Organizer")187 page.addToken(0x24, "RecurrenceId")188 page.addToken(0x25, "Reminder")189 page.addToken(0x26, "ResponseRequested")190 page.addToken(0x27, "Recurrences")191 page.addToken(0x28, "Recurrence")192 page.addToken(0x29, "Recurrence_Type")193 page.addToken(0x2A, "Recurrence_Until")194 page.addToken(0x2B, "Recurrence_Occurrences")195 page.addToken(0x2C, "Recurrence_Interval")196 page.addToken(0x2D, "Recurrence_DayOfWeek")197 page.addToken(0x2E, "Recurrence_DayOfMonth")198 page.addToken(0x2F, "Recurrence_WeekOfMonth")199 page.addToken(0x30, "Recurrence_MonthOfYear")200 page.addToken(0x31, "StartTime")201 page.addToken(0x32, "Sensitivity")202 page.addToken(0x33, "TimeZone")203 page.addToken(0x34, "GlobalObjId")204 page.addToken(0x35, "ThreadTopic")205 page.addToken(0x39, "InternetCPID")206 page.addToken(0x3A, "Flag")207 page.addToken(0x3B, "FlagStatus")208 page.addToken(0x3C, "ContentClass")209 page.addToken(0x3D, "FlagType")210 page.addToken(0x3E, "CompleteTime")211 page.addToken(0x3F, "DisallowNewTimeProposal")212 self.codePages.append(page)213 # endregion214 215 # Code Page 3: AirNotify - retired216 # region AirNotify Code Page217 page = ASWBXMLCodePage()218 page.namespace = ""219 page.xmlns = ""220 self.codePages.append(page)221 # endregion222 223 # Code Page 4: Calendar224 # region Calendar Code Page225 page = ASWBXMLCodePage()226 page.namespace = "Calendar:"227 page.xmlns = "calendar"228 229 page.addToken(0x05, "TimeZone")230 page.addToken(0x06, "AllDayEvent")231 page.addToken(0x07, "Attendees")232 page.addToken(0x08, "Attendee")233 page.addToken(0x09, "Attendee_Email")234 page.addToken(0x0A, "Attendee_Name")235 page.addToken(0x0D, "BusyStatus")236 page.addToken(0x0E, "Categories")237 page.addToken(0x0F, "Category")238 page.addToken(0x11, "DTStamp")239 page.addToken(0x12, "EndTime")240 page.addToken(0x13, "Exception")241 page.addToken(0x14, "Exceptions")242 page.addToken(0x15, "Exception_Deleted")243 page.addToken(0x16, "Exception_StartTime")244 page.addToken(0x17, "Location")245 page.addToken(0x18, "MeetingStatus")246 page.addToken(0x19, "Organizer_Email")247 page.addToken(0x1A, "Organizer_Name")248 page.addToken(0x1B, "Recurrence")249 page.addToken(0x1C, "Recurrence_Type")250 page.addToken(0x1D, "Recurrence_Until")251 page.addToken(0x1E, "Recurrence_Occurrences")252 page.addToken(0x1F, "Recurrence_Interval")253 page.addToken(0x20, "Recurrence_DayOfWeek")254 page.addToken(0x21, "Recurrence_DayOfMonth")255 page.addToken(0x22, "Recurrence_WeekOfMonth")256 page.addToken(0x23, "Recurrence_MonthOfYear")257 page.addToken(0x24, "Reminder")258 page.addToken(0x25, "Sensitivity")259 page.addToken(0x26, "Subject")260 page.addToken(0x27, "StartTime")261 page.addToken(0x28, "UID")262 page.addToken(0x29, "Attendee_Status")263 page.addToken(0x2A, "Attendee_Type")264 page.addToken(0x33, "DisallowNewTimeProposal")265 page.addToken(0x34, "ResponseRequested")266 page.addToken(0x35, "AppointmentReplyTime")267 page.addToken(0x36, "ResponseType")268 page.addToken(0x37, "CalendarType")269 page.addToken(0x38, "IsLeapMonth")270 page.addToken(0x39, "FirstDayOfWeek")271 page.addToken(0x3A, "OnlineMeetingConfLink")272 page.addToken(0x3B, "OnlineMeetingExternalLink")273 self.codePages.append(page)274 # endregion275 276 # Code Page 5: Move277 # region Move Code Page278 page = ASWBXMLCodePage()279 page.namespace = "Move:"280 page.xmlns = "move"281 282 page.addToken(0x05, "MoveItems")283 page.addToken(0x06, "Move")284 page.addToken(0x07, "SrcMsgId")285 page.addToken(0x08, "SrcFldId")286 page.addToken(0x09, "DstFldId")287 page.addToken(0x0A, "Response")288 page.addToken(0x0B, "Status")289 page.addToken(0x0C, "DstMsgId")290 self.codePages.append(page)291 # endregion292 293 # Code Page 6: ItemEstimate294 # region ItemEstimate Code Page295 page = ASWBXMLCodePage()296 page.namespace = "GetItemEstimate:"297 page.xmlns = "getitemestimate"298 299 page.addToken(0x05, "GetItemEstimate")300 page.addToken(0x06, "Version")301 page.addToken(0x07, "Collections")302 page.addToken(0x08, "Collection")303 page.addToken(0x09, "Class")304 page.addToken(0x0A, "CollectionId")305 page.addToken(0x0B, "DateTime")306 page.addToken(0x0C, "Estimate")307 page.addToken(0x0D, "Response")308 page.addToken(0x0E, "Status")309 self.codePages.append(page)310 # endregion311 312 # Code Page 7: FolderHierarchy313 # region FolderHierarchy Code Page314 page = ASWBXMLCodePage()315 page.namespace = "FolderHierarchy:"316 page.xmlns = "folderhierarchy"317 318 page.addToken(0x07, "DisplayName")319 page.addToken(0x08, "ServerId")320 page.addToken(0x09, "ParentId")321 page.addToken(0x0A, "Type")322 page.addToken(0x0C, "Status")323 page.addToken(0x0E, "Changes")324 page.addToken(0x0F, "Add")325 page.addToken(0x10, "Delete")326 page.addToken(0x11, "Update")327 page.addToken(0x12, "SyncKey")328 page.addToken(0x13, "FolderCreate")329 page.addToken(0x14, "FolderDelete")330 page.addToken(0x15, "FolderUpdate")331 page.addToken(0x16, "FolderSync")332 page.addToken(0x17, "Count")333 334 self.codePages.append(page)335 # endregion336 337 # Code Page 8: MeetingResponse338 # region MeetingResponse Code Page339 page = ASWBXMLCodePage()340 page.namespace = "MeetingResponse:"341 page.xmlns = "meetingresponse"342 343 page.addToken(0x05, "CalendarId")344 page.addToken(0x06, "CollectionId")345 page.addToken(0x07, "MeetingResponse")346 page.addToken(0x08, "RequestId")347 page.addToken(0x09, "Request")348 page.addToken(0x0A, "Result")349 page.addToken(0x0B, "Status")350 page.addToken(0x0C, "UserResponse")351 page.addToken(0x0E, "InstanceId")352 self.codePages.append(page)353 # endregion354 355 # Code Page 9: Tasks356 # region Tasks Code Page357 page = ASWBXMLCodePage()358 page.namespace = "Tasks:"359 page.xmlns = "tasks"360 361 page.addToken(0x08, "Categories")362 page.addToken(0x09, "Category")363 page.addToken(0x0A, "Complete")364 page.addToken(0x0B, "DateCompleted")365 page.addToken(0x0C, "DueDate")366 page.addToken(0x0D, "UTCDueDate")367 page.addToken(0x0E, "Importance")368 page.addToken(0x0F, "Recurrence")369 page.addToken(0x10, "Recurrence_Type")370 page.addToken(0x11, "Recurrence_Start")371 page.addToken(0x12, "Recurrence_Until")372 page.addToken(0x13, "Recurrence_Occurrences")373 page.addToken(0x14, "Recurrence_Interval")374 page.addToken(0x15, "Recurrence_DayOfMonth")375 page.addToken(0x16, "Recurrence_DayOfWeek")376 page.addToken(0x17, "Recurrence_WeekOfMonth")377 page.addToken(0x18, "Recurrence_MonthOfYear")378 page.addToken(0x19, "Recurrence_Regenerate")379 page.addToken(0x1A, "Recurrence_DeadOccur")380 page.addToken(0x1B, "ReminderSet")381 page.addToken(0x1C, "ReminderTime")382 page.addToken(0x1D, "Sensitivity")383 page.addToken(0x1E, "StartDate")384 page.addToken(0x1F, "UTCStartDate")385 page.addToken(0x20, "Subject")386 page.addToken(0x22, "OrdinalDate")387 page.addToken(0x23, "SubOrdinalDate")388 page.addToken(0x24, "CalendarType")389 page.addToken(0x25, "IsLeapMonth")390 page.addToken(0x26, "FirstDayOfWeek")391 self.codePages.append(page)392 # endregion393 394 # Code Page 10: ResolveRecipients395 # region ResolveRecipients Code Page396 page = ASWBXMLCodePage()397 page.namespace = "ResolveRecipients:"398 page.xmlns = "resolverecipients"399 400 page.addToken(0x05, "ResolveRecipients")401 page.addToken(0x06, "Response")402 page.addToken(0x07, "Status")403 page.addToken(0x08, "Type")404 page.addToken(0x09, "Recipient")405 page.addToken(0x0A, "DisplayName")406 page.addToken(0x0B, "EmailAddress")407 page.addToken(0x0C, "Certificates")408 page.addToken(0x0D, "Certificate")409 page.addToken(0x0E, "MiniCertificate")410 page.addToken(0x0F, "Options")411 page.addToken(0x10, "To")412 page.addToken(0x11, "CertificateRetrieval")413 page.addToken(0x12, "RecipientCount")414 page.addToken(0x13, "MaxCertificates")415 page.addToken(0x14, "MaxAmbiguousRecipients")416 page.addToken(0x15, "CertificateCount")417 page.addToken(0x16, "Availability")418 page.addToken(0x17, "StartTime")419 page.addToken(0x18, "EndTime")420 page.addToken(0x19, "MergedFreeBusy")421 page.addToken(0x1A, "Picture")422 page.addToken(0x1B, "MaxSize")423 page.addToken(0x1C, "Data")424 page.addToken(0x1D, "MaxPictures")425 self.codePages.append(page)426 # endregion427 428 # Code Page 11: ValidateCert429 # region ValidateCert Code Page430 page = ASWBXMLCodePage()431 page.namespace = "ValidateCert:"432 page.xmlns = "validatecert"433 434 page.addToken(0x05, "ValidateCert")435 page.addToken(0x06, "Certificates")436 page.addToken(0x07, "Certificate")437 page.addToken(0x08, "CertificateChain")438 page.addToken(0x09, "CheckCRL")439 page.addToken(0x0A, "Status")440 self.codePages.append(page)441 # endregion442 443 # Code Page 12: Contacts2444 # region Contacts2 Code Page445 page = ASWBXMLCodePage()446 page.namespace = "Contacts2:"447 page.xmlns = "contacts2"448 449 page.addToken(0x05, "CustomerId")450 page.addToken(0x06, "GovernmentId")451 page.addToken(0x07, "IMAddress")452 page.addToken(0x08, "IMAddress2")453 page.addToken(0x09, "IMAddress3")454 page.addToken(0x0A, "ManagerName")455 page.addToken(0x0B, "CompanyMainPhone")456 page.addToken(0x0C, "AccountName")457 page.addToken(0x0D, "NickName")458 page.addToken(0x0E, "MMS")459 self.codePages.append(page)460 # endregion461 462 # Code Page 13: Ping463 # region Ping Code Page464 page = ASWBXMLCodePage()465 page.namespace = "Ping:"466 page.xmlns = "ping"467 468 page.addToken(0x05, "Ping")469 page.addToken(0x06, "AutdState") # Per MS-ASWBXML, this tag is not used by protocol470 page.addToken(0x07, "Status")471 page.addToken(0x08, "HeartbeatInterval")472 page.addToken(0x09, "Folders")473 page.addToken(0x0A, "Folder")474 page.addToken(0x0B, "Id")475 page.addToken(0x0C, "Class")476 page.addToken(0x0D, "MaxFolders")477 self.codePages.append(page)478 # endregion479 480 # Code Page 14: Provision481 # region Provision Code Page482 page = ASWBXMLCodePage()483 page.namespace = "Provision:"484 page.xmlns = "provision"485 486 page.addToken(0x05, "Provision")487 page.addToken(0x06, "Policies")488 page.addToken(0x07, "Policy")489 page.addToken(0x08, "PolicyType")490 page.addToken(0x09, "PolicyKey")491 page.addToken(0x0A, "Data")492 page.addToken(0x0B, "Status")493 page.addToken(0x0C, "RemoteWipe")494 page.addToken(0x0D, "EASProvisionDoc")495 page.addToken(0x0E, "DevicePasswordEnabled")496 page.addToken(0x0F, "AlphanumericDevicePasswordRequired")497 page.addToken(0x10, "RequireStorageCardEncryption")498 page.addToken(0x11, "PasswordRecoveryEnabled")499 page.addToken(0x13, "AttachmentsEnabled")500 page.addToken(0x14, "MinDevicePasswordLength")501 page.addToken(0x15, "MaxInactivityTimeDeviceLock")502 page.addToken(0x16, "MaxDevicePasswordFailedAttempts")503 page.addToken(0x17, "MaxAttachmentSize")504 page.addToken(0x18, "AllowSimpleDevicePassword")505 page.addToken(0x19, "DevicePasswordExpiration")506 page.addToken(0x1A, "DevicePasswordHistory")507 page.addToken(0x1B, "AllowStorageCard")508 page.addToken(0x1C, "AllowCamera")509 page.addToken(0x1D, "RequireDeviceEncryption")510 page.addToken(0x1E, "AllowUnsignedApplications")511 page.addToken(0x1F, "AllowUnsignedInstallationPackages")512 page.addToken(0x20, "MinDevicePasswordComplexCharacters")513 page.addToken(0x21, "AllowWiFi")514 page.addToken(0x22, "AllowTextMessaging")515 page.addToken(0x23, "AllowPOPIMAPEmail")516 page.addToken(0x24, "AllowBluetooth")517 page.addToken(0x25, "AllowIrDA")518 page.addToken(0x26, "RequireManualSyncWhenRoaming")519 page.addToken(0x27, "AllowDesktopSync")520 page.addToken(0x28, "MaxCalendarAgeFilter")521 page.addToken(0x29, "AllowHTMLEmail")522 page.addToken(0x2A, "MaxEmailAgeFilter")523 page.addToken(0x2B, "MaxEmailBodyTruncationSize")524 page.addToken(0x2C, "MaxEmailHTMLBodyTruncationSize")525 page.addToken(0x2D, "RequireSignedSMIMEMessages")526 page.addToken(0x2E, "RequireEncryptedSMIMEMessages")527 page.addToken(0x2F, "RequireSignedSMIMEAlgorithm")528 page.addToken(0x30, "RequireEncryptionSMIMEAlgorithm")529 page.addToken(0x31, "AllowSMIMEEncryptionAlgorithmNegotiation")530 page.addToken(0x32, "AllowSMIMESoftCerts")531 page.addToken(0x33, "AllowBrowser")532 page.addToken(0x34, "AllowConsumerEmail")533 page.addToken(0x35, "AllowRemoteDesktop")534 page.addToken(0x36, "AllowInternetSharing")535 page.addToken(0x37, "UnapprovedInROMApplicationList")536 page.addToken(0x38, "ApplicationName")537 page.addToken(0x39, "ApprovedApplicationList")538 page.addToken(0x3A, "Hash")539 self.codePages.append(page)540 # endregion541 542 # Code Page 15: Search543 # region Search Code Page544 page = ASWBXMLCodePage()545 page.namespace = "Search:"546 page.xmlns = "search"547 548 page.addToken(0x05, "Search")549 page.addToken(0x07, "Store")550 page.addToken(0x08, "Name")551 page.addToken(0x09, "Query")552 page.addToken(0x0A, "Options")553 page.addToken(0x0B, "Range")554 page.addToken(0x0C, "Status")555 page.addToken(0x0D, "Response")556 page.addToken(0x0E, "Result")557 page.addToken(0x0F, "Properties")558 page.addToken(0x10, "Total")559 page.addToken(0x11, "EqualTo")560 page.addToken(0x12, "Value")561 page.addToken(0x13, "And")562 page.addToken(0x14, "Or")563 page.addToken(0x15, "FreeText")564 page.addToken(0x17, "DeepTraversal")565 page.addToken(0x18, "LongId")566 page.addToken(0x19, "RebuildResults")567 page.addToken(0x1A, "LessThan")568 page.addToken(0x1B, "GreaterThan")569 page.addToken(0x1E, "UserName")570 page.addToken(0x1F, "Password")571 page.addToken(0x20, "ConversationId")572 page.addToken(0x21, "Picture")573 page.addToken(0x22, "MaxSize")574 page.addToken(0x23, "MaxPictures")575 self.codePages.append(page)576 # endregion577 578 # Code Page 16: GAL579 # region GAL Code Page580 page = ASWBXMLCodePage()581 page.namespace = "GAL:"582 page.xmlns = "gal"583 584 page.addToken(0x05, "DisplayName")585 page.addToken(0x06, "Phone")586 page.addToken(0x07, "Office")587 page.addToken(0x08, "Title")588 page.addToken(0x09, "Company")589 page.addToken(0x0A, "Alias")590 page.addToken(0x0B, "FirstName")591 page.addToken(0x0C, "LastName")592 page.addToken(0x0D, "HomePhone")593 page.addToken(0x0E, "MobilePhone")594 page.addToken(0x0F, "EmailAddress")595 page.addToken(0x10, "Picture")596 page.addToken(0x11, "Status")597 page.addToken(0x12, "Data")598 self.codePages.append(page)599 # endregion600 601 # Code Page 17: AirSyncBase602 # region AirSyncBase Code Page603 page = ASWBXMLCodePage()604 page.namespace = "AirSyncBase:"605 page.xmlns = "airsyncbase"606 607 page.addToken(0x05, "BodyPreference")608 page.addToken(0x06, "Type")609 page.addToken(0x07, "TruncationSize")610 page.addToken(0x08, "AllOrNone")611 page.addToken(0x0A, "Body")612 page.addToken(0x0B, "Data")613 page.addToken(0x0C, "EstimatedDataSize")614 page.addToken(0x0D, "Truncated")615 page.addToken(0x0E, "Attachments")616 page.addToken(0x0F, "Attachment")617 page.addToken(0x10, "DisplayName")618 page.addToken(0x11, "FileReference")619 page.addToken(0x12, "Method")620 page.addToken(0x13, "ContentId")621 page.addToken(0x14, "ContentLocation")622 page.addToken(0x15, "IsInline")623 page.addToken(0x16, "NativeBodyType")624 page.addToken(0x17, "ContentType")625 page.addToken(0x18, "Preview")626 page.addToken(0x19, "BodyPartPreference")627 page.addToken(0x1A, "BodyPart")628 page.addToken(0x1B, "Status")629 self.codePages.append(page)630 # endregion631 632 # Code Page 18: Settings633 # region Settings Code Page634 page = ASWBXMLCodePage()635 page.namespace = "Settings:"636 page.xmlns = "settings"637 638 page.addToken(0x05, "Settings")639 page.addToken(0x06, "Status")640 page.addToken(0x07, "Get")641 page.addToken(0x08, "Set")642 page.addToken(0x09, "Oof")643 page.addToken(0x0A, "OofState")644 page.addToken(0x0B, "StartTime")645 page.addToken(0x0C, "EndTime")646 page.addToken(0x0D, "OofMessage")647 page.addToken(0x0E, "AppliesToInternal")648 page.addToken(0x0F, "AppliesToExternalKnown")649 page.addToken(0x10, "AppliesToExternalUnknown")650 page.addToken(0x11, "Enabled")651 page.addToken(0x12, "ReplyMessage")652 page.addToken(0x13, "BodyType")653 page.addToken(0x14, "DevicePassword")654 page.addToken(0x15, "Password")655 page.addToken(0x16, "DeviceInformation")656 page.addToken(0x17, "Model")657 page.addToken(0x18, "IMEI")658 page.addToken(0x19, "FriendlyName")659 page.addToken(0x1A, "OS")660 page.addToken(0x1B, "OSLanguage")661 page.addToken(0x1C, "PhoneNumber")662 page.addToken(0x1D, "UserInformation")663 page.addToken(0x1E, "EmailAddresses")664 page.addToken(0x1F, "SmtpAddress")665 page.addToken(0x20, "UserAgent")666 page.addToken(0x21, "EnableOutboundSMS")667 page.addToken(0x22, "MobileOperator")668 page.addToken(0x23, "PrimarySmtpAddress")669 page.addToken(0x24, "Accounts")670 page.addToken(0x25, "Account")671 page.addToken(0x26, "AccountId")672 page.addToken(0x27, "AccountName")673 page.addToken(0x28, "UserDisplayName")674 page.addToken(0x29, "SendDisabled")675 page.addToken(0x2B, "RightsManagementInformation")676 self.codePages.append(page)677 # endregion678 679 # Code Page 19: DocumentLibrary680 # region DocumentLibrary Code Page681 page = ASWBXMLCodePage()682 page.namespace = "DocumentLibrary:"683 page.xmlns = "documentlibrary"684 685 page.addToken(0x05, "LinkId")686 page.addToken(0x06, "DisplayName")687 page.addToken(0x07, "IsFolder")688 page.addToken(0x08, "CreationDate")689 page.addToken(0x09, "LastModifiedDate")690 page.addToken(0x0A, "IsHidden")691 page.addToken(0x0B, "ContentLength")692 page.addToken(0x0C, "ContentType")693 self.codePages.append(page)694 # endregion695 696 # Code Page 20: ItemOperations697 # region ItemOperations Code Page698 page = ASWBXMLCodePage()699 page.namespace = "ItemOperations:"700 page.xmlns = "itemoperations"701 702 page.addToken(0x05, "ItemOperations")703 page.addToken(0x06, "Fetch")704 page.addToken(0x07, "Store")705 page.addToken(0x08, "Options")706 page.addToken(0x09, "Range")707 page.addToken(0x0A, "Total")708 page.addToken(0x0B, "Properties")709 page.addToken(0x0C, "Data")710 page.addToken(0x0D, "Status")711 page.addToken(0x0E, "Response")712 page.addToken(0x0F, "Version")713 page.addToken(0x10, "Schema")714 page.addToken(0x11, "Part")715 page.addToken(0x12, "EmptyFolderContents")716 page.addToken(0x13, "DeleteSubFolders")717 page.addToken(0x14, "UserName")718 page.addToken(0x15, "Password")719 page.addToken(0x16, "Move")720 page.addToken(0x17, "DstFldId")721 page.addToken(0x18, "ConversationId")722 page.addToken(0x19, "MoveAlways")723 self.codePages.append(page)724 # endregion725 726 # Code Page 21: ComposeMail727 # region ComposeMail Code Page728 page = ASWBXMLCodePage()729 page.namespace = "ComposeMail:"730 page.xmlns = "composemail"731 732 page.addToken(0x05, "SendMail")733 page.addToken(0x06, "SmartForward")734 page.addToken(0x07, "SmartReply")735 page.addToken(0x08, "SaveInSentItems")736 page.addToken(0x09, "ReplaceMime")737 page.addToken(0x0B, "Source")738 page.addToken(0x0C, "FolderId")739 page.addToken(0x0D, "ItemId")740 page.addToken(0x0E, "LongId")741 page.addToken(0x0F, "InstanceId")742 page.addToken(0x10, "MIME")743 page.addToken(0x11, "ClientId")744 page.addToken(0x12, "Status")745 page.addToken(0x13, "AccountId")746 self.codePages.append(page)747 # endregion748 749 # Code Page 22: Email2750 # region Email2 Code Page751 page = ASWBXMLCodePage()752 page.namespace = "Email2:"753 page.xmlns = "email2"754 755 page.addToken(0x05, "UmCallerID")756 page.addToken(0x06, "UmUserNotes")757 page.addToken(0x07, "UmAttDuration")758 page.addToken(0x08, "UmAttOrder")759 page.addToken(0x09, "ConversationId")760 page.addToken(0x0A, "ConversationIndex")761 page.addToken(0x0B, "LastVerbExecuted")762 page.addToken(0x0C, "LastVerbExecutionTime")763 page.addToken(0x0D, "ReceivedAsBcc")764 page.addToken(0x0E, "Sender")765 page.addToken(0x0F, "CalendarType")766 page.addToken(0x10, "IsLeapMonth")767 page.addToken(0x11, "AccountId")768 page.addToken(0x12, "FirstDayOfWeek")769 page.addToken(0x13, "MeetingMessageType")770 self.codePages.append(page)771 # endregion772 773 # Code Page 23: Notes774 # region Notes Code Page775 page = ASWBXMLCodePage()776 page.namespace = "Notes:"777 page.xmlns = "notes"778 779 page.addToken(0x05, "Subject")780 page.addToken(0x06, "MessageClass")781 page.addToken(0x07, "LastModifiedDate")782 page.addToken(0x08, "Categories")783 page.addToken(0x09, "Category")784 self.codePages.append(page)785 # endregion786 787 # Code Page 24: RightsManagement788 # region RightsManagement Code Page789 page = ASWBXMLCodePage()790 page.namespace = "RightsManagement:"791 page.xmlns = "rightsmanagement"792 793 page.addToken(0x05, "RightsManagementSupport")794 page.addToken(0x06, "RightsManagementTemplates")795 page.addToken(0x07, "RightsManagementTemplate")796 page.addToken(0x08, "RightsManagementLicense")797 page.addToken(0x09, "EditAllowed")798 page.addToken(0x0A, "ReplyAllowed")799 page.addToken(0x0B, "ReplyAllAllowed")800 page.addToken(0x0C, "ForwardAllowed")801 page.addToken(0x0D, "ModifyRecipientsAllowed")802 page.addToken(0x0E, "ExtractAllowed")803 page.addToken(0x0F, "PrintAllowed")804 page.addToken(0x10, "ExportAllowed")805 page.addToken(0x11, "ProgrammaticAccessAllowed")806 page.addToken(0x12, "RMOwner")807 page.addToken(0x13, "ContentExpiryDate")808 page.addToken(0x14, "TemplateID")809 page.addToken(0x15, "TemplateName")810 page.addToken(0x16, "TemplateDescription")811 page.addToken(0x17, "ContentOwner")812 page.addToken(0x18, "RemoveRightsManagementDistribution")813 self.codePages.append(page)814 # endregion815 # endregion816 817 def loadXml(self, strXML):818 # note xmlDoc has .childNodes and .parentNode819 self.xmlDoc = xml.dom.minidom.parseString(strXML)820 821 def getXml(self):822 if (self.xmlDoc != None):823 try:824 return self.xmlDoc.toprettyxml(indent=" ", newl="\n")825 except:826 return self.xmlDoc.toxml()827 828 def loadBytes(self, byteWBXML):829 830 currentNode = self.xmlDoc831 832 wbXMLBytes = ASWBXMLByteQueue(byteWBXML)833 # Version is ignored834 version = wbXMLBytes.dequeueAndLog()835 836 # Public Identifier is ignored837 publicId = wbXMLBytes.dequeueMultibyteInt()838 839 logging.debug("Version: %d, Public Identifier: %d" % (version, publicId))840 841 # Character set842 # Currently only UTF-8 is supported, throw if something else843 charset = wbXMLBytes.dequeueMultibyteInt()844 if (charset != 0x6A):845 raise InvalidDataException("ASWBXML only supports UTF-8 encoded XML.")846 847 # String table length848 # This should be 0, MS-ASWBXML does not use string tables849 stringTableLength = wbXMLBytes.dequeueMultibyteInt()850 if (stringTableLength != 0):851 raise InvalidDataException("WBXML data contains a string table.")852 853 # Now we should be at the body of the data.854 # Add the declaration855 unusedArray = [GlobalTokens.ENTITY, GlobalTokens.EXT_0, GlobalTokens.EXT_1, GlobalTokens.EXT_2, GlobalTokens.EXT_I_0, GlobalTokens.EXT_I_1, GlobalTokens.EXT_I_2, GlobalTokens.EXT_T_0, GlobalTokens.EXT_T_1, GlobalTokens.EXT_T_2, GlobalTokens.LITERAL, GlobalTokens.LITERAL_A, GlobalTokens.LITERAL_AC, GlobalTokens.LITERAL_C, GlobalTokens.PI, GlobalTokens.STR_T]856 857 while ( wbXMLBytes.qsize() > 0):858 currentByte = wbXMLBytes.dequeueAndLog()859 if ( currentByte == GlobalTokens.SWITCH_PAGE ):860 newCodePage = wbXMLBytes.dequeueAndLog()861 if (newCodePage >= 0 and newCodePage < 25):862 self.currentCodePage = newCodePage863 else:864 raise InvalidDataException("Unknown code page ID 0x{0:X} encountered in WBXML".format(currentByte))865 elif ( currentByte == GlobalTokens.END ):866 if (currentNode != None and currentNode.parentNode != None):867 currentNode = currentNode.parentNode868 else:869 raise InvalidDataException("END global token encountered out of sequence")870 break871 elif ( currentByte == GlobalTokens.OPAQUE ):872 CDATALength = wbXMLBytes.dequeueMultibyteInt()873 newOpaqueNode = self.xmlDoc.createCDATASection(wbXMLBytes.dequeueString(CDATALength))874 currentNode.appendChild(newOpaqueNode)875 876 elif ( currentByte == GlobalTokens.STR_I ):877 newTextNode = self.xmlDoc.createTextNode(wbXMLBytes.dequeueString())878 currentNode.appendChild(newTextNode)879 880 elif ( currentByte in unusedArray):881 raise InvalidDataException("Encountered unknown global token 0x{0:X}.".format(currentByte))882 else:883 hasAttributes = (currentByte & 0x80) > 0884 hasContent = (currentByte & 0x40) > 0885 886 token = currentByte & 0x3F887 if (hasAttributes):888 raise InvalidDataException("Token 0x{0:X} has attributes.".format(token))889 890 strTag = self.codePages[self.currentCodePage].getTag(token)891 if (strTag == None):892 strTag = "UNKNOWN_TAG_{0,2:X}".format(token)893 894 newNode = self.xmlDoc.createElement(strTag)895 # not sure if this should be set on every node or not896 #newNode.setAttribute("xmlns", self.codePages[self.currentCodePage].xmlns)897 898 currentNode.appendChild(newNode)899 900 if (hasContent):901 currentNode = newNode902 903 logging.debug("Total bytes dequeued: %d" % wbXMLBytes.bytesDequeued)904 