"""Bencode parser plugin for Transmission BitTorrent files."""
from plaso.containers import events
from plaso.parsers import bencode_parser
from plaso.parsers.bencode_plugins import interface
[docs]
class TransmissionEventData(events.EventData):
"""Transmission BitTorrent event data.
Attributes:
added_time (dfdatetime.DateTimeValues): date and time the torrent was
added to Transmission.
destination (str): path of the downloaded file.
downloaded_time (dfdatetime.DateTimeValues): date and time the content
was downloaded.
last_activity_time (dfdatetime.DateTimeValues): date and time of the last
download activity.
seedtime (int): client seed time in number of minutes.
"""
DATA_TYPE = "p2p:bittorrent:transmission"
[docs]
def __init__(self):
"""Initializes event data."""
super().__init__(data_type=self.DATA_TYPE)
self.added_time = None
self.destination = None
self.downloaded_time = None
self.last_activity_time = None
self.seedtime = None
[docs]
class TransmissionBencodePlugin(interface.BencodePlugin):
"""Parse Transmission BitTorrent activity file for current torrents.
Transmission stores an individual Bencoded file for each active download in a folder
named resume under the user's application data folder.
"""
NAME = "bencode_transmission"
DATA_FORMAT = "Transmission BitTorrent activity file"
_BENCODE_KEYS = frozenset(
[
"activity-date",
"added-date",
"destination",
"done-date",
"seeding-time-seconds",
]
)
[docs]
def Process(self, parser_mediator, bencode_file=None, **kwargs):
"""Extracts events from a Transmission's resume folder file.
Args:
parser_mediator (ParserMediator): mediates interactions between parsers
and other components, such as storage and dfVFS.
bencode_file (Optional[BencodeFile]): bencode file.
"""
# This will raise if unhandled keyword arguments are passed.
super().Process(parser_mediator, **kwargs)
root_values = bencode_file.GetValues()
seeding_time = root_values.GetDecodedValue("seeding-time-seconds")
event_data = TransmissionEventData()
event_data.added_time = root_values.GetDateTimeValue("added-date")
event_data.destination = root_values.GetDecodedValue("destination")
event_data.downloaded_time = root_values.GetDateTimeValue("done-date")
event_data.last_activity_time = root_values.GetDateTimeValue("activity-date")
# Convert seconds to minutes.
event_data.seedtime, _ = divmod(seeding_time, 60)
parser_mediator.ProduceEventData(event_data)
bencode_parser.BencodeParser.RegisterPlugin(TransmissionBencodePlugin)