Back to index

lightning-sunbird  0.9+nobinonly
Public Member Functions | Public Attributes | Protected Member Functions | Protected Attributes | Friends
nsJAR Class Reference

#include <nsJAR.h>

Inheritance diagram for nsJAR:
Inheritance graph
[legend]
Collaboration diagram for nsJAR:
Collaboration graph
[legend]

List of all members.

Public Member Functions

 nsJAR ()
virtual ~nsJAR ()
 NS_DEFINE_STATIC_CID_ACCESSOR (NS_ZIPREADER_CID)
NS_DECL_ISUPPORTS
NS_DECL_NSIZIPREADER
NS_DECL_NSIJAR PRIntervalTime 
GetReleaseTime ()
PRBool IsReleased ()
void SetReleaseTime ()
void ClearReleaseTime ()
void SetZipReaderCache (nsZipReaderCache *cache)
PRFileDescOpenFile ()
void init (in nsIFile zipFile)
 Initializes a zip reader after construction.
void open ()
 Opens a zip reader.
void close ()
 Closes a zip reader.
void test (in string aEntryName)
 Tests the integrity of the archive by performing a CRC check on each item expanded into memory.
void extract (in string zipEntry, in nsIFile outFile)
 Extracts a zip entry into a local file specified by outFile.
nsIZipEntry getEntry (in string zipEntry)
 Returns a nsIZipEntry describing a specified zip entry.
nsISimpleEnumerator findEntries (in string aPattern)
 Returns a simple enumerator whose elements are of type nsIZipEntry.
nsIInputStream getInputStream (in string zipEntry)
 Returns an input stream containing the contents of the specified zip entry.
void getCertificatePrincipal (in string aEntryName, out nsIPrincipal aPrincipal)
 Returns an object describing the entity which signed an entry.

Public Attributes

readonly attribute nsIFile file
const short NOT_SIGNED = 0
const short VALID = 1
const short INVALID_SIG = 2
const short INVALID_UNKNOWN_CA = 3
const short INVALID_MANIFEST = 4
const short INVALID_ENTRY = 5
const short NO_MANIFEST = 6
readonly attribute PRUint32 manifestEntriesCount

Protected Member Functions

nsresult ParseManifest (nsISignatureVerifier *verifier)
void ReportError (const char *aFilename, PRInt16 errorCode)
nsresult LoadEntry (const char *aFilename, char **aBuf, PRUint32 *aBufLen=nsnull)
PRInt32 ReadLine (const char **src)
nsresult ParseOneFile (nsISignatureVerifier *verifier, const char *filebuf, PRInt16 aFileType)
nsresult VerifyEntry (nsISignatureVerifier *verifier, nsJARManifestItem *aEntry, const char *aEntryData, PRUint32 aLen)
nsresult CalculateDigest (const char *aInBuf, PRUint32 aInBufLen, char **digest)
void DumpMetadata (const char *aMessage)

Protected Attributes

nsCOMPtr< nsIFilemZipFile
nsZipArchive mZip
nsObjectHashtable mManifestData
PRBool mParsedManifest
nsCOMPtr< nsIPrincipalmPrincipal
PRInt16 mGlobalStatus
PRIntervalTime mReleaseTime
nsZipReaderCachemCache
PRLockmLock
PRInt32 mTotalItemsInManifest
PRFileDescmFd

Friends

class nsJARInputStream

Detailed Description

Definition at line 82 of file nsJAR.h.


Constructor & Destructor Documentation

nsJAR::~nsJAR ( ) [virtual]

Definition at line 178 of file nsJAR.cpp.

{
  Close();
  if (mLock) 
    PR_DestroyLock(mLock);
}

Here is the call graph for this function:


Member Function Documentation

nsresult nsJAR::CalculateDigest ( const char *  aInBuf,
PRUint32  aInBufLen,
char **  digest 
) [protected]

Definition at line 901 of file nsJAR.cpp.

{
  *digest = nsnull;
  nsresult rv;
  

  nsCOMPtr<nsICryptoHash> hasher = do_CreateInstance("@mozilla.org/security/hash;1", &rv);
  if (NS_FAILED(rv)) return rv;

  rv = hasher->Init(nsICryptoHash::SHA1);
  if (NS_FAILED(rv)) return rv;

  rv = hasher->Update((const PRUint8*) aInBuf, aLen);
  if (NS_FAILED(rv)) return rv;

  nsCAutoString hashString;
  rv = hasher->Finish(PR_TRUE, hashString);
  if (NS_FAILED(rv)) return rv;

  *digest = ToNewCString(hashString);

  return *digest ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
}

Definition at line 112 of file nsJAR.h.

void nsIZipReader::close ( ) [inherited]

Closes a zip reader.

Subsequent attempts to extract files or read from its input stream will result in an error.

void nsJAR::DumpMetadata ( const char *  aMessage) [protected]

Definition at line 945 of file nsJAR.cpp.

{
#if 0
  printf("### nsJAR::DumpMetadata at %s ###\n", aMessage);
  if (mPrincipal)
  {
    char* toStr;
    mPrincipal->ToString(&toStr);
    printf("Principal: %s.\n", toStr);
    PR_FREEIF(toStr);
  }
  else
    printf("No Principal. \n");
  mManifestData.Enumerate(PrintManItem);
  printf("\n");
#endif
} 
void nsIZipReader::extract ( in string  zipEntry,
in nsIFile  outFile 
) [inherited]

Extracts a zip entry into a local file specified by outFile.

Returns a simple enumerator whose elements are of type nsIZipEntry.

void nsIJAR::getCertificatePrincipal ( in string  aEntryName,
out nsIPrincipal  aPrincipal 
) [inherited]

Returns an object describing the entity which signed an entry.

parseManifest must be called first. If aEntryName is an entry in the jar, getInputStream must be called after parseManifest. If aEntryName is an external file which has meta-information stored in the jar, verifyExternalFile (not yet implemented) must be called before getPrincipal.

nsIZipEntry nsIZipReader::getEntry ( in string  zipEntry) [inherited]

Returns a nsIZipEntry describing a specified zip entry.

Returns an input stream containing the contents of the specified zip entry.

NS_DECL_ISUPPORTS NS_DECL_NSIZIPREADER NS_DECL_NSIJAR PRIntervalTime nsJAR::GetReleaseTime ( ) [inline]

Definition at line 100 of file nsJAR.h.

                                    {
        return mReleaseTime;
    }
void nsIZipReader::init ( in nsIFile  zipFile) [inherited]

Initializes a zip reader after construction.

PRBool nsJAR::IsReleased ( ) [inline]

Definition at line 104 of file nsJAR.h.

nsresult nsJAR::LoadEntry ( const char *  aFilename,
char **  aBuf,
PRUint32 aBufLen = nsnull 
) [protected]

Definition at line 466 of file nsJAR.cpp.

{
  //-- Get a stream for reading the file
  nsresult rv;
  nsCOMPtr<nsIInputStream> manifestStream;
  rv = GetInputStream(aFilename, getter_AddRefs(manifestStream));
  if (NS_FAILED(rv)) return NS_ERROR_FILE_TARGET_DOES_NOT_EXIST;
  
  //-- Read the manifest file into memory
  char* buf;
  PRUint32 len;
  rv = manifestStream->Available(&len);
  if (NS_FAILED(rv)) return rv;
  if (len == PRUint32(-1))
    return NS_ERROR_FILE_CORRUPTED; // bug 164695
  buf = (char*)PR_MALLOC(len+1);
  if (!buf) return NS_ERROR_OUT_OF_MEMORY;
  PRUint32 bytesRead;
  rv = manifestStream->Read(buf, len, &bytesRead);
  if (bytesRead != len) 
    rv = NS_ERROR_FILE_CORRUPTED;
  if (NS_FAILED(rv)) {
    PR_FREEIF(buf);
    return rv;
  }
  buf[len] = '\0'; //Null-terminate the buffer
  *aBuf = buf;
  if (aBufLen)
    *aBufLen = len;
  return NS_OK;
}

Here is the call graph for this function:

void nsIZipReader::open ( ) [inherited]

Opens a zip reader.

Definition at line 449 of file nsJAR.cpp.

{
  nsresult rv;
  nsCOMPtr<nsILocalFile> localFile = do_QueryInterface(mZipFile, &rv);
  if (NS_FAILED(rv)) return nsnull;

  PRFileDesc* fd;
  rv = localFile->OpenNSPRFileDesc(PR_RDONLY, 0000, &fd);
  if (NS_FAILED(rv)) return nsnull;

  return fd;
}

Here is the call graph for this function:

Here is the caller graph for this function:

nsresult nsJAR::ParseManifest ( nsISignatureVerifier verifier) [protected]

Definition at line 536 of file nsJAR.cpp.

{
  //-- Verification Step 1
  if (mParsedManifest)
    return NS_OK;
  //-- (1)Manifest (MF) file
  nsresult rv;
  nsCOMPtr<nsISimpleEnumerator> files;
  rv = FindEntries(JAR_MF_SEARCH_STRING, getter_AddRefs(files));
  if (!files) rv = NS_ERROR_FAILURE;
  if (NS_FAILED(rv)) return rv;

  //-- Load the file into memory
  nsCOMPtr<nsJARItem> file;
  rv = files->GetNext(getter_AddRefs(file));
  if (NS_FAILED(rv)) return rv;
  if (!file)
  {
    mGlobalStatus = nsIJAR::NO_MANIFEST;
    mParsedManifest = PR_TRUE;
    return NS_OK;
  }
  PRBool more;
  rv = files->HasMoreElements(&more);
  if (NS_FAILED(rv)) return rv;
  if (more)
  {
    mParsedManifest = PR_TRUE;
    return NS_ERROR_FILE_CORRUPTED; // More than one MF file
  }
  nsXPIDLCString manifestFilename;
  rv = file->GetName(getter_Copies(manifestFilename));
  if (!manifestFilename || NS_FAILED(rv)) return rv;
  nsXPIDLCString manifestBuffer;
  rv = LoadEntry(manifestFilename, getter_Copies(manifestBuffer));
  if (NS_FAILED(rv)) return rv;

  //-- Parse it
  rv = ParseOneFile(verifier, manifestBuffer, JAR_MF);
  if (NS_FAILED(rv)) return rv;

  //-- (2)Signature (SF) file
  // If there are multiple signatures, we select one.
  rv = FindEntries(JAR_SF_SEARCH_STRING, getter_AddRefs(files));
  if (!files) rv = NS_ERROR_FAILURE;
  if (NS_FAILED(rv)) return rv;
  //-- Get an SF file
  rv = files->GetNext(getter_AddRefs(file));
  if (NS_FAILED(rv)) return rv;
  if (!file)
  {
    mGlobalStatus = nsIJAR::NO_MANIFEST;
    mParsedManifest = PR_TRUE;
    return NS_OK;
  }
  rv = file->GetName(getter_Copies(manifestFilename));
  if (NS_FAILED(rv)) return rv;

  PRUint32 manifestLen;
  rv = LoadEntry(manifestFilename, getter_Copies(manifestBuffer), &manifestLen);
  if (NS_FAILED(rv)) return rv;
  
  //-- Get its corresponding signature file
  nsCAutoString sigFilename( NS_STATIC_CAST(const char*, manifestFilename) );
  PRInt32 extension = sigFilename.RFindChar('.') + 1;
  NS_ASSERTION(extension != 0, "Manifest Parser: Missing file extension.");
  (void)sigFilename.Cut(extension, 2);
  nsXPIDLCString sigBuffer;
  PRUint32 sigLen;
  {
    nsCAutoString tempFilename(sigFilename); tempFilename.Append("rsa", 3);
    rv = LoadEntry(tempFilename.get(), getter_Copies(sigBuffer), &sigLen);
  }
  if (NS_FAILED(rv))
  {
    nsCAutoString tempFilename(sigFilename); tempFilename.Append("RSA", 3);
    rv = LoadEntry(tempFilename.get(), getter_Copies(sigBuffer), &sigLen);
  }
  if (NS_FAILED(rv))
  {
    mGlobalStatus = nsIJAR::NO_MANIFEST;
    mParsedManifest = PR_TRUE;
    return NS_OK;
  }

  //-- Verify that the signature file is a valid signature of the SF file
  PRInt32 verifyError;
  rv = verifier->VerifySignature(sigBuffer, sigLen, manifestBuffer, manifestLen, 
                                 &verifyError, getter_AddRefs(mPrincipal));
  if (NS_FAILED(rv)) return rv;
  if (mPrincipal && verifyError == 0)
    mGlobalStatus = nsIJAR::VALID;
  else if (verifyError == nsISignatureVerifier::VERIFY_ERROR_UNKNOWN_CA)
    mGlobalStatus = nsIJAR::INVALID_UNKNOWN_CA;
  else
    mGlobalStatus = nsIJAR::INVALID_SIG;

  //-- Parse the SF file. If the verification above failed, principal
  // is null, and ParseOneFile will mark the relevant entries as invalid.
  // if ParseOneFile fails, then it has no effect, and we can safely 
  // continue to the next SF file, or return. 
  ParseOneFile(verifier, manifestBuffer, JAR_SF);
  mParsedManifest = PR_TRUE;

  return NS_OK;
}
nsresult nsJAR::ParseOneFile ( nsISignatureVerifier verifier,
const char *  filebuf,
PRInt16  aFileType 
) [protected]

Definition at line 644 of file nsJAR.cpp.

{
  //-- Check file header
  const char* nextLineStart = filebuf;
  nsCAutoString curLine;
  PRInt32 linelen;
  linelen = ReadLine(&nextLineStart);
  curLine.Assign(filebuf, linelen);

  if ( ((aFileType == JAR_MF) && !curLine.Equals(JAR_MF_HEADER) ) ||
       ((aFileType == JAR_SF) && !curLine.Equals(JAR_SF_HEADER) ) )
     return NS_ERROR_FILE_CORRUPTED;

  //-- Skip header section
  do {
    linelen = ReadLine(&nextLineStart);
  } while (linelen > 0);

  //-- Set up parsing variables
  const char* curPos;
  const char* sectionStart = nextLineStart;

  nsJARManifestItem* curItemMF = nsnull;
  PRBool foundName = PR_FALSE;
  if (aFileType == JAR_MF)
    if (!(curItemMF = new nsJARManifestItem()))
      return NS_ERROR_OUT_OF_MEMORY;

  nsCAutoString curItemName;
  nsCAutoString storedSectionDigest;

  for(;;)
  {
    curPos = nextLineStart;
    linelen = ReadLine(&nextLineStart);
    curLine.Assign(curPos, linelen);
    if (linelen == 0) 
    // end of section (blank line or end-of-file)
    {
      if (aFileType == JAR_MF)
      {
        mTotalItemsInManifest++;
        if (curItemMF->mType != JAR_INVALID)
        { 
          //-- Did this section have a name: line?
          if(!foundName)
            curItemMF->mType = JAR_INVALID;
          else 
          {
            if (curItemMF->mType == JAR_INTERNAL)
            {
            //-- If it's an internal item, it must correspond 
            //   to a valid jar entry
              nsIZipEntry* entry;
              PRInt32 result = GetEntry(curItemName.get(), &entry);
              if (result != ZIP_OK || !entry)
                curItemMF->mType = JAR_INVALID;
            }
            //-- Check for duplicates
            nsCStringKey key(curItemName);
            if (mManifestData.Exists(&key))
              curItemMF->mType = JAR_INVALID;
          }
        }

        if (curItemMF->mType == JAR_INVALID)
          delete curItemMF;
        else //-- calculate section digest
        {
          PRUint32 sectionLength = curPos - sectionStart;
          CalculateDigest(sectionStart, sectionLength,
                          &(curItemMF->calculatedSectionDigest));
          //-- Save item in the hashtable
          nsCStringKey itemKey(curItemName);
          mManifestData.Put(&itemKey, (void*)curItemMF);
        }
        if (nextLineStart == nsnull) // end-of-file
          break;

        sectionStart = nextLineStart;
        if (!(curItemMF = new nsJARManifestItem()))
          return NS_ERROR_OUT_OF_MEMORY;
      } // (aFileType == JAR_MF)
      else
        //-- file type is SF, compare digest with calculated 
        //   section digests from MF file.
      {
        if (foundName)
        {
          nsJARManifestItem* curItemSF;
          nsCStringKey key(curItemName);
          curItemSF = (nsJARManifestItem*)mManifestData.Get(&key);
          if(curItemSF)
          {
            NS_ASSERTION(curItemSF->status == nsJAR::NOT_SIGNED,
                         "SECURITY ERROR: nsJARManifestItem not correctly initialized");
            curItemSF->status = mGlobalStatus;
            if (curItemSF->status == nsIJAR::VALID)
            { // Compare digests
              if (storedSectionDigest.IsEmpty())
                curItemSF->status = nsIJAR::NOT_SIGNED;
              else
              {
                if (!storedSectionDigest.Equals((const char*)curItemSF->calculatedSectionDigest))
                  curItemSF->status = nsIJAR::INVALID_MANIFEST;
                JAR_NULLFREE(curItemSF->calculatedSectionDigest)
                storedSectionDigest = "";
              }
            } // (aPrincipal != nsnull)
          } // if(curItemSF)
        } // if(foundName)

        if(nextLineStart == nsnull) // end-of-file
          break;
      } // aFileType == JAR_SF
      foundName = PR_FALSE;
      continue;
    } // if(linelen == 0)

    //-- Look for continuations (beginning with a space) on subsequent lines
    //   and append them to the current line.
    while(*nextLineStart == ' ')
    {
      curPos = nextLineStart;
      PRInt32 continuationLen = ReadLine(&nextLineStart) - 1;
      nsCAutoString continuation(curPos+1, continuationLen);
      curLine += continuation;
      linelen += continuationLen;
    }

    //-- Find colon in current line, this separates name from value
    PRInt32 colonPos = curLine.FindChar(':');
    if (colonPos == -1)    // No colon on line, ignore line
      continue;
    //-- Break down the line
    nsCAutoString lineName;
    curLine.Left(lineName, colonPos);
    nsCAutoString lineData;
    curLine.Mid(lineData, colonPos+2, linelen - (colonPos+2));

    //-- Lines to look for:
    // (1) Digest:
    if (lineName.Equals(NS_LITERAL_CSTRING("SHA1-Digest"),
                        nsCaseInsensitiveCStringComparator()))
    //-- This is a digest line, save the data in the appropriate place 
    {
      if(aFileType == JAR_MF)
      {
        curItemMF->storedEntryDigest = (char*)PR_MALLOC(lineData.Length()+1);
        if (!(curItemMF->storedEntryDigest))
          return NS_ERROR_OUT_OF_MEMORY;
        PL_strcpy(curItemMF->storedEntryDigest, lineData.get());
      }
      else
        storedSectionDigest = lineData;
      continue;
    }
    
    // (2) Name: associates this manifest section with a file in the jar.
    if (!foundName && lineName.Equals(NS_LITERAL_CSTRING("Name"),
                                      nsCaseInsensitiveCStringComparator())) 
    {
      curItemName = lineData;
      foundName = PR_TRUE;
      continue;
    }

    // (3) Magic: this may be an inline Javascript. 
    //     We can't do any other kind of magic.
    if ( aFileType == JAR_MF &&
         lineName.Equals(NS_LITERAL_CSTRING("Magic"),
                         nsCaseInsensitiveCStringComparator()))
    {
      if(lineData.Equals(NS_LITERAL_CSTRING("javascript"),
                         nsCaseInsensitiveCStringComparator()))
        curItemMF->mType = JAR_EXTERNAL;
      else
        curItemMF->mType = JAR_INVALID;
      continue;
    }

  } // for (;;)
  return NS_OK;
} //ParseOneFile()
PRInt32 nsJAR::ReadLine ( const char **  src) [protected]

Definition at line 500 of file nsJAR.cpp.

{
  //--Moves pointer to beginning of next line and returns line length
  //  not including CR/LF.
  PRInt32 length;
  char* eol = PL_strpbrk(*src, "\r\n");

  if (eol == nsnull) // Probably reached end of file before newline
  {
    length = PL_strlen(*src);
    if (length == 0) // immediate end-of-file
      *src = nsnull;
    else             // some data left on this line
      *src += length;
  }
  else
  {
    length = eol - *src;
    if (eol[0] == '\r' && eol[1] == '\n')      // CR LF, so skip 2
      *src = eol+2;
    else                                       // Either CR or LF, so skip 1
      *src = eol+1;
  }
  return length;
}

Here is the call graph for this function:

void nsJAR::ReportError ( const char *  aFilename,
PRInt16  errorCode 
) [protected]

Definition at line 855 of file nsJAR.cpp.

{
  //-- Generate error message
  nsAutoString message; 
  message.AssignLiteral("Signature Verification Error: the signature on ");
  if (aFilename)
    message.AppendWithConversion(aFilename);
  else
    message.AppendLiteral("this .jar archive");
  message.AppendLiteral(" is invalid because ");
  switch(errorCode)
  {
  case nsIJAR::NOT_SIGNED:
    message.AppendLiteral("the archive did not contain a valid PKCS7 signature.");
    break;
  case nsIJAR::INVALID_SIG:
    message.Append(NS_LITERAL_STRING("the digital signature (*.RSA) file is not a valid signature of the signature instruction file (*.SF)."));
    break;
  case nsIJAR::INVALID_UNKNOWN_CA:
    message.AppendLiteral("the certificate used to sign this file has an unrecognized issuer.");
    break;
  case nsIJAR::INVALID_MANIFEST:
    message.Append(NS_LITERAL_STRING("the signature instruction file (*.SF) does not contain a valid hash of the MANIFEST.MF file."));
    break;
  case nsIJAR::INVALID_ENTRY:
    message.AppendLiteral("the MANIFEST.MF file does not contain a valid hash of the file being verified.");
    break;
  default:
    message.AppendLiteral("of an unknown problem.");
  }
  
  // Report error in JS console
  nsCOMPtr<nsIConsoleService> console(do_GetService("@mozilla.org/consoleservice;1"));
  if (console)
  {
    console->LogStringMessage(message.get());
  }
#ifdef DEBUG
  char* messageCstr = ToNewCString(message);
  if (!messageCstr) return;
  fprintf(stderr, "%s\n", messageCstr);
  nsMemory::Free(messageCstr);
#endif
}

Definition at line 108 of file nsJAR.h.

                          {
      mReleaseTime = PR_IntervalNow();
    }

Definition at line 116 of file nsJAR.h.

                                                    {
      mCache = cache;
    }
void nsIZipReader::test ( in string  aEntryName) [inherited]

Tests the integrity of the archive by performing a CRC check on each item expanded into memory.

If an entry is specified the integrity of only that item is tested. If NULL is passed in the inetgrity of all items in the archive are tested.

nsresult nsJAR::VerifyEntry ( nsISignatureVerifier verifier,
nsJARManifestItem aEntry,
const char *  aEntryData,
PRUint32  aLen 
) [protected]

Definition at line 831 of file nsJAR.cpp.

{
  if (aManItem->status == nsIJAR::VALID)
  {
    if(!aManItem->storedEntryDigest)
      // No entry digests in manifest file. Entry is unsigned.
      aManItem->status = nsIJAR::NOT_SIGNED;
    else
    { //-- Calculate and compare digests
      char* calculatedEntryDigest;
      nsresult rv = CalculateDigest(aEntryData, aLen, &calculatedEntryDigest);
      if (NS_FAILED(rv)) return NS_ERROR_FAILURE;
      if (PL_strcmp(aManItem->storedEntryDigest, calculatedEntryDigest) != 0)
        aManItem->status = nsIJAR::INVALID_ENTRY;
      JAR_NULLFREE(calculatedEntryDigest)
      JAR_NULLFREE(aManItem->storedEntryDigest)
    }
  }
  aManItem->entryVerified = PR_TRUE;
  return NS_OK;
}

Friends And Related Function Documentation

friend class nsJARInputStream [friend]

Definition at line 85 of file nsJAR.h.


Member Data Documentation

readonly attribute nsIFile nsIZipReader::file [inherited]

Definition at line 68 of file nsIZipReader.idl.

const short nsIJAR::INVALID_ENTRY = 5 [inherited]

Definition at line 86 of file nsIJAR.idl.

const short nsIJAR::INVALID_MANIFEST = 4 [inherited]

Definition at line 85 of file nsIJAR.idl.

const short nsIJAR::INVALID_SIG = 2 [inherited]

Definition at line 83 of file nsIJAR.idl.

const short nsIJAR::INVALID_UNKNOWN_CA = 3 [inherited]

Definition at line 84 of file nsIJAR.idl.

Definition at line 99 of file nsIJAR.idl.

Definition at line 130 of file nsJAR.h.

PRFileDesc* nsJAR::mFd [protected]

Definition at line 133 of file nsJAR.h.

Definition at line 128 of file nsJAR.h.

PRLock* nsJAR::mLock [protected]

Definition at line 131 of file nsJAR.h.

nsObjectHashtable nsJAR::mManifestData [protected]

Definition at line 125 of file nsJAR.h.

Definition at line 126 of file nsJAR.h.

Definition at line 127 of file nsJAR.h.

Definition at line 129 of file nsJAR.h.

Definition at line 132 of file nsJAR.h.

Definition at line 124 of file nsJAR.h.

Definition at line 123 of file nsJAR.h.

const short nsIJAR::NO_MANIFEST = 6 [inherited]

Definition at line 87 of file nsIJAR.idl.

const short nsIJAR::NOT_SIGNED = 0 [inherited]

Definition at line 81 of file nsIJAR.idl.

const short nsIJAR::VALID = 1 [inherited]

Definition at line 82 of file nsIJAR.idl.


The documentation for this class was generated from the following files: