📄 pgptar.c
字号:
/*____________________________________________________________________________
PGPtar.c
Copyright (C) 2003,2004 PGP Corporation
All rights reserved.
This file contains functions which are used to test
how PGP handles encoding/decoding and manipulations of PGP Archives
$Id: PGPtar.c 48493 2006-10-12 21:19:56Z vinnie $
____________________________________________________________________________*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
#ifndef PGP_WIN32
#include <unistd.h>
#endif
#include <sys/types.h>
#include <sys/stat.h>
#include "pgpFeatures.h"
#include "pgpErrors.h"
#include "pgpEncode.h"
#include "pgpKeys.h"
#include "pgpPublicKey.h"
#include "pgpHash.h"
#include "pgpUtilities.h"
#include "optest.h"
#if PGP_MOBILE
#define SLASH "\\"
#else
#define SLASH "/"
#endif
#define TEST1_USES_FILE 0
#define DETACHED_TAR_SIG_TEST 0
#define ZERO_LENGTH_FILE "zerolengthfile.txt"
#define TEST_DIR "more_stuff"
#define TEST_FILE "newrabbit1.jpg"
#define OUTPUT_FILE "message.pgp"
#define LONG_NAME "this a really long name that should force two file header block to be used I guess but I cant be sure tell we try it.txt"
#define RENAME_FILE "rabbitfoofoo.jpg"
#define SESSION_KEY_BUFFER_SIZE 33
//------------------------------------------------------------------
static void strcatchar(char *s1, char c)
{
int i = (int)strlen(s1);
s1[i++] = c;
s1[i] = 0;
}
static void printTarEntry(int type, char *name, char *user, char *group, PGPUInt64 size, PGPInt32 mode, PGPTime date, char *link)
{
char modeStr[12];
char timeStr[64];
static char *modeChar = "-rwx";
static char *typeChar = "? ldx";
/* TAR File permissions */
#define TUREAD 00400 /* read by owner */
#define TUWRITE 00200 /* write by owner */
#define TUEXEC 00100 /* execute/search by owner */
#define TGREAD 00040 /* read by group */
#define TGWRITE 00020 /* write by group */
#define TGEXEC 00010 /* execute/search by group */
#define TOREAD 00004 /* read by other */
#define TOWRITE 00002 /* write by other */
#define TOEXEC 00001 /* execute/search by other */
time_t mtime = PGPGetStdTimeFromPGPTime(date);
modeStr[0]=0;
strcatchar(modeStr, typeChar[type]);
/* file protection */
strcatchar(modeStr, modeChar[ mode & TUREAD?1:0]);
strcatchar(modeStr, modeChar[ mode & TUWRITE?2:0]);
strcatchar(modeStr, modeChar[ mode & TUEXEC?3:0]);
strcatchar(modeStr, modeChar[ mode & TGREAD?1:0]);
strcatchar(modeStr, modeChar[ mode & TGWRITE?2:0]);
strcatchar(modeStr, modeChar[ mode & TGEXEC?3:0]);
strcatchar(modeStr, modeChar[ mode & TOREAD?1:0]);
strcatchar(modeStr, modeChar[ mode & TOWRITE?2:0]);
strcatchar(modeStr, modeChar[ mode & TOEXEC?3:0]);
#if PGP_WIN32
strftime( timeStr, sizeof(timeStr), "%d %b %X", localtime(&mtime));
#else
strftime( timeStr, sizeof(timeStr), "%d %b %R", localtime(&mtime));
#endif
#if PGP_MOBILE
OPTESTPrintF("%s %8s %8s %8d %s %s ",modeStr,user,group, (int)size ,timeStr,name); // No llu in CE CRT
#else
OPTESTPrintF("%s %8s %8s %8llu %s %s ",modeStr,user,group, size ,timeStr,name);
#endif
if((link != NULL) && (link[0] != 0)) OPTESTPrintF("\n\t\t\t--> %s",link);
OPTESTPrintF("\n");
}
PGPError DisplayTarCacheEntry( PGPTARCacheObjRef obj)
{
PGPError err = kPGPError_NoErr;
PGPChar8 *name = NULL;
PGPTARCacheObjAttributeType type;
char link[MAX_PATH];
char user[32];
char group[32];
PGPUInt64 size;
PGPFileOffset fpos;
PGPInt32 mode;
PGPTime date;
size = 0;
link[0] = 0;
err = PGPGetTARCacheObjNumericProperty( obj,kPGPTARCacheObjProperty_Attribute, (PGPInt32*) &type);CKERR;
err = PGPGetTARCacheObjDataProperty(obj, kPGPTARCacheObjProperty_FilePos, &fpos, sizeof(PGPFileOffset), NULL); CKERR;
err = PGPGetTARCacheObjAllocatedDataProperty( obj, kPGPTARCacheObjProperty_Name, (void**)&name, NULL);CKERR;
err = PGPGetTARCacheObjDataProperty( obj, kPGPTARCacheObjProperty_User,
user, sizeof user, NULL);CKERR;
err = PGPGetTARCacheObjDataProperty( obj, kPGPTARCacheObjProperty_Group,
group, sizeof group, NULL);CKERR;
err = PGPGetTARCacheObjNumericProperty( obj,kPGPTARCacheObjProperty_Mode, &mode);CKERR;
err = PGPGetTARCacheObjTimeProperty( obj,kPGPTARCacheObjProperty_Date, &date);CKERR;
OPTESTPrintF("\t %8lld ",fpos);
switch(type)
{
case kPGPTARCacheObjAttribute_File:
err = PGPGetTARCacheObjDataProperty(obj, kPGPTARCacheObjProperty_Size,
&size, sizeof(PGPFileOffset), NULL); CKERR;
break;
case kPGPTARCacheObjAttribute_SymLink:
err = PGPGetTARCacheObjDataProperty( obj, kPGPTARCacheObjProperty_Link,
link, sizeof link, NULL);CKERR;
break;
case kPGPTARCacheObjAttribute_Directory:
case kPGPTARCacheObjAttribute_Deleted:
break;
default:;
}
if(strlen(name) > 32)
{
name[29] = 0;
strcat(name,"...");
}
printTarEntry(type, name, user, group, size, mode, date, link);
done:
if(name) PGPFreeData(name);
return err;
}
PGPError ListTarCache(PGPContextRef context, PGPFileSpecRef fileRef, void *sessionKey, PGPSize sessionKeySize)
{
PGPError err = kPGPError_NoErr;
PGPTARCacheRef tar = kInvalidPGPTARCacheRef;
PGPTARCacheIterRef iter = kInvalidPGPTARCacheIterRef;
PGPTARCacheObjRef obj = kInvalidPGPTARCacheObjRef;
PGPUInt32 count = 0;
PGPUInt32 progress = 0;
PGPChar8 *name = NULL;
DecodeInfo decodeInfo;
InitDecodeInfo(&decodeInfo);
err = PGPGetFullPathFromFileSpec(fileRef, &name);CKERR;
OPTESTPrintF("\tTar Cache Content: \"%s\"\n", (char*) name );
PGPFreeData(name); name = NULL;
OPTESTPrintF("\t Opening Tar cache file\n");
err = PGPOpenTARCacheFile(context,kPGPOpenTARCacheFileOptions_None | kPGPOpenTARCacheFileOptions_PreloadAll,
fileRef, sessionKey,sessionKeySize,NULL, &tar,
PGPOSendNullEvents(context, 50),
PGPOEventHandler( context, OptestEventHandler, &decodeInfo),
PGPOLastOption( context ));CKERR;
err = PGPGetTARCacheScanProgress(tar, &count, &progress); CKERR;
OPTESTPrintF("\t Found %d object%s.\n",count, count==1?"":"s" );
err = PGPNewTARCacheIter(tar, &iter);CKERR;
OPTESTPrintF("\t Listing Tar Cache File\n");
OPTESTPrintF("\t %8s %10s %8s %8s %8s %-12s %s\n","Offset","Mode","User", "Group","Size","Date","Name");
OPTESTPrintF("\t -------- ---------- -------- -------- -------- ------------ ------------------------\n");
err = PGPTARCacheIterRewind(iter);CKERR;
while( IsntPGPError(err = PGPTARCacheIterNextTARCacheObj(iter, &obj)))
{
err = DisplayTarCacheEntry(obj);CKERR;
}
err = PGPGetTARCacheScanProgress(tar, &count, &progress); CKERR;
OPTESTPrintF("\tTotal %d object%s\n",count, count==1?"":"s" );
#if 0
OPTESTPrintF("\n\t Displayed Backwards\n");
err = PGPTARCacheIterRewind(iter);CKERR;
err = PGPTARCacheIterMove(iter, count -1 , NULL); CKERR;
while( IsntPGPError(err = PGPTARCacheIterPrevTARCacheObj(iter, &obj)))
{
err = DisplayTarCacheEntry(obj);CKERR;
}
#endif
if(err == kPGPError_EndOfIteration) err = kPGPError_NoErr;
OPTESTPrintF("\n");
done:
if( PGPTARCacheIterRefIsValid (iter) )
PGPFreeTARCacheIter(iter);
if( PGPTARCacheRefIsValid (tar) )
PGPFreeTARCache(tar);
if(name) PGPFreeData(name);
return err;
}
PGPError ExportandDeletefromTarCache(PGPContextRef context, PGPFileSpecRef cache, char* outputDir, void *sessionKey, PGPSize sessionKeySize)
{
PGPError err = kPGPError_NoErr;
PGPFileSpecRef exportSpec = kInvalidPGPFileSpecRef;
PGPFileSpecRef rootSpec = kInvalidPGPFileSpecRef;
PGPFileSpecRef fileSpec = kInvalidPGPFileSpecRef;
PGPTARCacheRef tar = kInvalidPGPTARCacheRef;
PGPTARCacheIterRef iter = kInvalidPGPTARCacheIterRef;
PGPTARCacheObjRef obj = kInvalidPGPTARCacheObjRef;
DecodeInfo decodeInfo;
char pathName[MAX_PATH];
InitDecodeInfo(&decodeInfo);
OPTESTPrintF("\tExport and Delete Tar Cache Items\n");
OPTESTPrintF("\t Opening Tar cache file\n");
err = PGPOpenTARCacheFile(context,kPGPOpenTARCacheFileOptions_None | kPGPOpenTARCacheFileOptions_Mutable, cache,
sessionKey,sessionKeySize,NULL, &tar,
PGPOEventHandler( context, OptestEventHandler, &decodeInfo),
PGPOLastOption( context ) ); CKERR;
err = PGPNewTARCacheIter(tar, &iter);CKERR;
while( IsntPGPError(err = PGPTARCacheIterNextTARCacheObj(iter, &obj)))
{
PGPTARCacheObjAttributeType type;
char name[MAX_PATH];
char *p;
err = PGPGetTARCacheObjNumericProperty( obj,kPGPTARCacheObjProperty_Attribute, (PGPInt32*) &type);CKERR;
err = PGPGetTARCacheObjDataProperty( obj, kPGPTARCacheObjProperty_Name, &name, MAX_PATH, NULL);CKERR;
if(type == kPGPTARCacheObjAttribute_SymLink)
{
OPTESTPrintF("\t delete \"%s\"\n",name);
err= PGPDeleteTARCacheObj(obj);CKERR;
}
else
if(type == kPGPTARCacheObjAttribute_File)
{
if((p = strrchr(name,'/') ) == NULL) p = name; else p++;
/* Ignore CVS files for this test */
if ((strcmp(p, "Root") == 0) || (strcmp(p, "Entries") == 0)
|| (strcmp(p, "Tag") == 0) || (strcmp(p, "Repository") == 0) || (strcmp(p, "Entries.Log") == 0))
continue;
if(*p != '.')
{
OPTESTPrintF("\t export & delete ");
printTruncated(p, strlen(p), 32);
sprintf(pathName, "%s%s%s",outputDir, SLASH, p);
err = PGPNewFileSpecFromFullPath(context,pathName, &exportSpec); CKERR;
err = PGPExportTARCacheObj( obj,exportSpec,
PGPOEventHandler( context, OptestEventHandler, &decodeInfo),
PGPOSendNullEvents(context, 50),
PGPOLastOption( context ) ); CKERR;
PGPFreeFileSpec(exportSpec);
exportSpec = NULL;
err= PGPDeleteTARCacheObj(obj);CKERR;
}
}
}
if(err == kPGPError_EndOfIteration) err = kPGPError_NoErr;
OPTESTPrintF("\n");
done:
if( PGPTARCacheIterRefIsValid (iter) )
PGPFreeTARCacheIter(iter);
if( PGPTARCacheRefIsValid (tar) )
PGPFreeTARCache(tar);
if(exportSpec) PGPFreeFileSpec(exportSpec);
if(rootSpec) PGPFreeFileSpec(rootSpec);
if(fileSpec) PGPFreeFileSpec(fileSpec);
return err;
}
/* create file test */
PGPError CreateTarCacheTest(PGPContextRef context, PGPFileSpecRef cache, PGPByte *newEsk, PGPSize *newEskSize)
{
PGPError err = kPGPError_NoErr;
PGPTARCacheRef tar = kInvalidPGPTARCacheRef;
PGPCipherAlgorithm algors[] = { kPGPCipherAlgorithm_AES256 };
PGPFileSpecRef rootSpec = kInvalidPGPFileSpecRef;
PGPFileSpecRef dirSpec = kInvalidPGPFileSpecRef;
PGPFileSpecRef fileSpec = kInvalidPGPFileSpecRef;
PGPFileSpecRef fileSpec1 = kInvalidPGPFileSpecRef;
PGPFileSpecRef relativeSpec = kInvalidPGPFileSpecRef;
PGPTARCacheObjRef obj1 = kInvalidPGPTARCacheObjRef;
PGPTARCacheObjRef obj2 = kInvalidPGPTARCacheObjRef;
PGPTARCacheObjRef obj3 = kInvalidPGPTARCacheObjRef;
unsigned int i;
char *name = NULL;
char *testFile = NULL;
char *testDIR = NULL;
char *zeroLengthFile = NULL;
DecodeInfo decodeInfo;
InitDecodeInfo(&decodeInfo);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -