X-Git-Url: http://git.asbjorn.biz/?p=swftools.git;a=blobdiff_plain;f=lib%2Frfxswf.c;h=94049b2582cfbddc79bf95ebce2bca8b0a8ee154;hp=1c3c2da2cd2c0a5499e1b38eb697a709cad7e2ed;hb=c3e46afcec0a11b365f03d662866903a9bf18c78;hpb=7e0ffeacc5c5976d85488d5bc39e512db39936b3 diff --git a/lib/rfxswf.c b/lib/rfxswf.c index 1c3c2da..94049b2 100644 --- a/lib/rfxswf.c +++ b/lib/rfxswf.c @@ -1,5 +1,4 @@ /* vi: set sts=2 sw=2 :*/ - /* rfxswf.c Library for creating and reading SWF files or parts of it. @@ -8,11 +7,22 @@ Part of the swftools package. - Copyright (c) 2000, 2001 Rainer Böhme - - This file is distributed under the GPL, see file COPYING for details + Copyright (c) 2000-2003 Rainer Böhme + Copyright (c) 2003 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. -*/ + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "rfxswf.h" @@ -25,10 +35,18 @@ #include #endif // HAVE_ZLIB -#define LAME +#ifndef RFXSWF_DISABLESOUND +#ifdef HAVE_LAME #include "lame/lame.h" +#endif +#endif + +#ifdef HAVE_TIME_H +#include +#endif #include "./bitio.h" +#include "./MD5.h" // internal constants @@ -42,7 +60,6 @@ TAG * swf_NextTag(TAG * t) { return t->next; } TAG * swf_PrevTag(TAG * t) { return t->prev; } -int swf_GetFrameNo(TAG * t) { return t->frame; } U16 swf_GetTagID(TAG * t) { return t->id; } U32 swf_GetTagLen(TAG * t) { return t->len; } U8* swf_GetTagLenPtr(TAG * t) { return &(t->data[t->len]); } @@ -283,6 +300,10 @@ void swf_GetGradient(TAG * tag, GRADIENT * gradient, char alpha) { GRADIENT dummy; int t; + if(!tag) { + memset(gradient, 0, sizeof(GRADIENT)); + return; + } if(!gradient) gradient = &dummy; gradient->num = swf_GetU8(tag); @@ -299,6 +320,24 @@ void swf_GetGradient(TAG * tag, GRADIENT * gradient, char alpha) } } +void swf_SetGradient(TAG * tag, GRADIENT * gradient, char alpha) +{ + int t; + if(!tag) { + memset(gradient, 0, sizeof(GRADIENT)); + return; + } + swf_SetU8(tag, gradient->num); + for(t=0; t<8 && tnum; t++) + { + swf_SetU8(tag, gradient->ratios[t]); + if(!alpha) + swf_SetRGB(tag, &gradient->rgba[t]); + else + swf_SetRGBA(tag, &gradient->rgba[t]); + } +} + int swf_CountUBits(U32 v,int nbits) { int n = 32; U32 m = 0x80000000; @@ -616,23 +655,73 @@ int swf_SetCXForm(TAG * t,CXFORM * cx,U8 alpha) return 0; } -int swf_GetPoint(TAG * t,SPOINT * p) { return 0; } -int swf_SetPoint(TAG * t,SPOINT * p) { return 0; } +//int swf_GetPoint(TAG * t,SPOINT * p) { return 0; } +//int swf_SetPoint(TAG * t,SPOINT * p) { return 0; } -// Tag List Manipulating Functions +void swf_SetPassword(TAG * t, const char * password) +{ + /* WARNING: crypt_md5 is not reentrant */ + char salt[3]; + char* md5string; + +#if defined(HAVE_LRAND48) && defined(HAVE_SRAND48) && defined(HAVE_TIME_H) && defined(HAVE_TIME) + srand48(time(0)); + salt[0] = "abcdefghijklmnopqrstuvwxyz0123456789"[lrand48()%36]; + salt[1] = "abcdefghijklmnopqrstuvwxyz0123456789"[lrand48()%36]; +#else + salt[0] = 'l'; + salt[1] = '8'; + fprintf(stderr, "rfxswf: Warning- no usable random generator found\n"); + fprintf(stderr, "Your password will be vulnerable to dictionary attacks\n"); +#endif + + md5string = crypt_md5(password, salt); -int swf_UpdateFrame(TAG * t,S8 delta) -// returns number of frames -{ int res = -1; - while (t) - { t->frame+=delta; - res = t->frame; - t = t->next; - } - return res; + swf_SetU16(t,0); + swf_SetString(t, md5string); +} + +int swf_VerifyPassword(TAG * t, const char * password) +{ + char*md5string1, *md5string2; + char*x; + char*md5, *salt; + int n; + + if(t->len >= 5 && t->pos==0 && + t->data[0] == 0 && + t->data[1] == 0) { + swf_GetU16(t); + } else { + printf("%d %d %d %d\n", t->len, t->pos, t->data[0], t->data[1]); + } + + md5string1 = swf_GetString(t); + + if(strncmp(md5string1, "$1$",3 )) { + fprintf(stderr, "rfxswf: no salt in pw string\n"); + return 0; + } + x = strchr(md5string1+3, '$'); + if(!x) { + fprintf(stderr, "rfxswf: invalid salt format in pw string\n"); + return 0; + } + n = x-(md5string1+3); + salt = (char*)malloc(n+1); + memcpy(salt, md5string1+3, n); + salt[n] = 0; + + md5string2 = crypt_md5(password, salt); + free(salt); + if(strcmp(md5string1, md5string2) != 0) + return 0; + return 1; } -TAG * swf_InsertTag(TAG * after,U16 id) // updates frames, if nescessary +// Tag List Manipulating Functions + +TAG * swf_InsertTag(TAG * after,U16 id) { TAG * t; t = (TAG *)malloc(sizeof(TAG)); @@ -641,19 +730,17 @@ TAG * swf_InsertTag(TAG * after,U16 id) // updates frames, if nescessary t->id = id; if (after) - { t->frame = after->frame; + { t->prev = after; t->next = after->next; after->next = t; if (t->next) t->next->prev = t; - - if (id==ST_SHOWFRAME) swf_UpdateFrame(t->next,+1); } } return t; } -TAG * swf_InsertTagBefore(SWF* swf, TAG * before,U16 id) // updates frames, if nescessary +TAG * swf_InsertTagBefore(SWF* swf, TAG * before,U16 id) { TAG * t; t = (TAG *)malloc(sizeof(TAG)); @@ -662,13 +749,11 @@ TAG * swf_InsertTagBefore(SWF* swf, TAG * before,U16 id) // updates frames, t->id = id; if (before) - { t->frame = before->frame; + { t->next = before; t->prev = before->prev; before->prev = t; if (t->prev) t->prev->next = t; - - if (id==ST_SHOWFRAME) swf_UpdateFrame(t->next,+1); } } if(swf && swf->firstTag == before) { @@ -697,8 +782,6 @@ void swf_ResetTag(TAG*tag, U16 id) int swf_DeleteTag(TAG * t) { if (!t) return -1; - if (t->id==ST_SHOWFRAME) swf_UpdateFrame(t->next,-1); - if (t->prev) t->prev->next = t->next; if (t->next) t->next->prev = t->prev; @@ -726,7 +809,7 @@ TAG * swf_ReadTag(struct reader_t*reader, TAG * prev) } if (id==ST_DEFINESPRITE) len = 2*sizeof(U16); - // Sprite handling fix: Flaten sprite tree + // Sprite handling fix: Flatten sprite tree t = (TAG *)malloc(sizeof(TAG)); @@ -757,7 +840,7 @@ TAG * swf_ReadTag(struct reader_t*reader, TAG * prev) } if (prev) - { t->frame = prev->frame+((prev->id==ST_SHOWFRAME)?1:0); + { t->prev = prev; prev->next = t; } @@ -984,13 +1067,24 @@ int swf_IsFolded(TAG * t) void swf_FoldAll(SWF*swf) { TAG*tag = swf->firstTag; + //swf_DumpSWF(stdout, swf); while(tag) { - if(tag->id == ST_DEFINESPRITE) + if(tag->id == ST_DEFINESPRITE) { swf_FoldSprite(tag); + //swf_DumpSWF(stdout, swf); + } tag = swf_NextTag(tag); } } +void swf_FoldAllTags(TAG*tag) +{ + SWF swf; + memset(&swf, 0, sizeof(swf)); + swf.firstTag = tag; + swf_FoldAll(&swf); +} + void swf_UnFoldAll(SWF*swf) { TAG*tag = swf->firstTag; @@ -1292,6 +1386,7 @@ void swf_FreeTags(SWF * swf) // Frees all malloc'ed memory for t #include "modules/swfdump.c" #include "modules/swfshape.c" #include "modules/swftext.c" +#include "modules/swffont.c" #include "modules/swfobject.c" #include "modules/swfbutton.c" #include "modules/swftools.c" @@ -1299,4 +1394,4 @@ void swf_FreeTags(SWF * swf) // Frees all malloc'ed memory for t #include "modules/swfbits.c" #include "modules/swfaction.c" #include "modules/swfsound.c" -#include "h.263/swfvideo.c" +#include "modules/swfdraw.c"