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