19 package org.sleuthkit.autopsy.recentactivity;
21 import java.io.DataInputStream;
23 import java.io.FileInputStream;
24 import java.io.FileNotFoundException;
25 import java.io.IOException;
26 import java.nio.ByteBuffer;
27 import java.nio.ByteOrder;
28 import java.util.Iterator;
29 import java.util.NoSuchElementException;
30 import java.util.logging.Level;
80 try (DataInputStream dataStream =
new DataInputStream(
new FileInputStream(cookieFile))) {
84 throw new IOException(
"Failed to read header, invalid file size (" + cookieFile.getName() +
")");
87 if (!(
new String(magic)).equals(COOKIE_MAGIC)) {
88 throw new IOException(cookieFile.getName() +
" is not a cookie file");
91 int[] sizeArray = null;
92 int pageCount = dataStream.readInt();
94 sizeArray =
new int[pageCount];
96 for (
int cnt = 0; cnt < pageCount; cnt++) {
97 sizeArray[cnt] = dataStream.readInt();
100 LOG.log(Level.INFO,
"No cookies found in {0}", cookieFile.getName());
126 Iterator<Cookie> currentIterator = null;
127 DataInputStream dataStream = null;
133 if(pageSizeArray == null || pageSizeArray.length == 0) {
138 dataStream =
new DataInputStream(
new FileInputStream(cookieFile));
140 dataStream.skipBytes((2 * SIZEOF_INT_BYTES) + (pageSizeArray.length * SIZEOF_INT_BYTES));
141 }
catch (IOException ex) {
143 String errorMessage = String.format(
"An error occurred creating an input stream for %s", cookieFile.getName());
144 LOG.log(Level.WARNING, errorMessage, ex);
157 if (dataStream == null) {
161 if (currentIterator == null || !currentIterator.hasNext()) {
164 if (pageIndex < pageSizeArray.length) {
165 byte[] nextPage =
new byte[pageSizeArray[pageIndex]];
166 dataStream.read(nextPage);
169 currentIterator = currentPage.
iterator();
176 }
catch (IOException ex) {
178 String errorMessage = String.format(
"A read error occured for file %s (pageIndex = %d)", cookieFile.getName(), pageIndex);
179 LOG.log(Level.WARNING, errorMessage, ex);
184 return currentIterator.hasNext();
198 throw new NoSuchElementException();
200 return currentIterator.next();
207 if (dataStream != null) {
211 }
catch (IOException ex) {
212 String errorMessage = String.format(
"An error occurred trying to close stream for file %s", cookieFile.getName());
213 LOG.log(Level.WARNING, errorMessage, ex);
225 ByteBuffer pageBuffer;
235 if (page == null || page.length == 0) {
236 throw new IllegalArgumentException(
"Invalid value for page passed to CookiePage constructor");
239 pageBuffer = ByteBuffer.wrap(page);
243 throw new IOException(
"Invalid file format, bad page head value found");
246 pageBuffer.order(ByteOrder.LITTLE_ENDIAN);
247 int count = pageBuffer.getInt();
248 cookieOffSets =
new int[count];
250 for (
int cnt = 0; cnt < count; cnt++) {
251 cookieOffSets[cnt] = pageBuffer.getInt();
281 if (pageBuffer == null) {
285 return index < cookieOffSets.length;
296 throw new NoSuchElementException();
299 int offset = cookieOffSets[index];
300 int size = pageBuffer.getInt(offset);
301 byte[] cookieBytes =
new byte[size];
302 pageBuffer.get(cookieBytes, 0, size);
305 return new Cookie(cookieBytes);
331 if (cookieBytes == null || cookieBytes.length == 0) {
332 throw new IllegalArgumentException(
"Invalid value for cookieBytes passed to Cookie constructor");
335 ByteBuffer byteBuffer = ByteBuffer.wrap(cookieBytes);
336 byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
341 int urlOffset = byteBuffer.getInt();
342 int nameOffset = byteBuffer.getInt();
343 int pathOffset = byteBuffer.getInt();
344 int valueOffset = byteBuffer.getInt();
345 byteBuffer.getLong();
347 expirationDate = byteBuffer.getDouble();
348 creationDate = byteBuffer.getDouble();
421 byte[] stringBytes =
new byte[byteArray.length - offset];
422 for (
int index = 0; index < stringBytes.length; index++) {
423 byte nibble = byteArray[offset + index];
424 if (nibble !=
'\0') {
425 stringBytes[index] = nibble;
431 return new String(stringBytes);
Iterator< Cookie > iterator()
static BinaryCookieReader initalizeReader(File cookieFile)
final Long getExpirationDate()
String decodeString(byte[] byteArray, int offset)
final Long getCreationDate()
Cookie(byte[] cookieBytes)
Iterator< Cookie > iterator()
final double expirationDate
static final int MAC_EPOC_FIX
static final int PAGE_HEADER_VALUE
static final int SIZEOF_INT_BYTES
BinaryCookieReader(File cookieFile, int[] pageSizeArray)
synchronized static Logger getLogger(String name)
static final int MAGIC_SIZE
final int[] pageSizeArray
static final int COOKIE_HEAD_SKIP
static final String COOKIE_MAGIC
final double creationDate