Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
<rdar://problem/11131245> PDF detection in cups needs to be tightened up
Add regex() rule support.


git-svn-id: svn+ssh://src.apple.com/svn/cups/cups.org/trunk@11272 a1ca3aef-8c08-0410-bb20-df032aa958be
  • Loading branch information
msweet committed Sep 10, 2013
1 parent 2c3f586 commit 6ee54c0
Show file tree
Hide file tree
Showing 5 changed files with 64 additions and 7 deletions.
4 changes: 3 additions & 1 deletion CHANGES.txt
@@ -1,5 +1,7 @@
CHANGES.txt - 2.0b1 - 2013-08-06
CHANGES.txt - 2.0b1 - 2013-09-10
--------------------------------

CHANGES IN CUPS V2.0b1

- Added support for regular expression matching in the MIME type rules
(<rdar://problem/11131245>)
5 changes: 3 additions & 2 deletions conf/mime.types
Expand Up @@ -7,7 +7,7 @@
# VERSIONS OF CUPS. Instead, create a "local.types" file that
# reflects your local configuration changes.
#
# Copyright 2007-2011 by Apple Inc.
# Copyright 2007-2013 by Apple Inc.
# Copyright 1997-2007 by Easy Software Products.
#
# These coded instructions, statements, and computer programs are the
Expand Down Expand Up @@ -37,6 +37,7 @@
# 100=default, 200=highest)
# printable(offset,length) True if bytes are printable 8-bit chars
# (CR, NL, TAB, BS, 32-126, 128-254)
# regex(offset,"regex") True if bytes match regular expression
# string(offset,"string") True if bytes are identical to string
# istring(offset,"string") True if bytes are identical to
# case-insensitive string
Expand Down Expand Up @@ -70,7 +71,7 @@
#

#application/msword doc string(0,<D0CF11E0A1B11AE1>)
application/pdf pdf string(0,%PDF)
application/pdf pdf regex(0,^[\\n\\r]*%PDF)
application/postscript ai eps ps string(0,%!) string(0,<04>%!) \
contains(0,128,<1B>%-12345X) + \
(contains(0,4096,"LANGUAGE=POSTSCRIPT") \
Expand Down
2 changes: 1 addition & 1 deletion scheduler/mime.c
Expand Up @@ -3,7 +3,7 @@
*
* MIME database file routines for CUPS.
*
* Copyright 2007-2012 by Apple Inc.
* Copyright 2007-2013 by Apple Inc.
* Copyright 1997-2006 by Easy Software Products, all rights reserved.
*
* These coded instructions, statements, and computer programs are the
Expand Down
7 changes: 5 additions & 2 deletions scheduler/mime.h
Expand Up @@ -3,7 +3,7 @@
*
* MIME type/conversion database definitions for CUPS.
*
* Copyright 2007-2011 by Apple Inc.
* Copyright 2007-2013 by Apple Inc.
* Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
* These coded instructions, statements, and computer programs are the
Expand All @@ -19,6 +19,7 @@
# include <cups/array.h>
# include <cups/ipp.h>
# include <cups/file.h>
# include <regex.h>


/*
Expand Down Expand Up @@ -58,7 +59,8 @@ typedef enum
MIME_MAGIC_INT, /* Integer/32-bit word matches */
MIME_MAGIC_LOCALE, /* Current locale matches string */
MIME_MAGIC_CONTAINS, /* File contains a string */
MIME_MAGIC_ISTRING /* Case-insensitive string matches */
MIME_MAGIC_ISTRING, /* Case-insensitive string matches */
MIME_MAGIC_REGEX /* Regular expression matches */
} mime_op_t;

typedef struct _mime_magic_s /**** MIME Magic Data ****/
Expand All @@ -80,6 +82,7 @@ typedef struct _mime_magic_s /**** MIME Magic Data ****/
unsigned char charv; /* Byte value */
unsigned short shortv; /* Short value */
unsigned intv; /* Integer value */
regex_t rev; /* Regular expression value */
} value;
} mime_magic_t;

Expand Down
53 changes: 52 additions & 1 deletion scheduler/type.c
Expand Up @@ -3,7 +3,7 @@
*
* MIME typing routines for CUPS.
*
* Copyright 2007-2012 by Apple Inc.
* Copyright 2007-2013 by Apple Inc.
* Copyright 1997-2006 by Easy Software Products, all rights reserved.
*
* These coded instructions, statements, and computer programs are the
Expand Down Expand Up @@ -425,6 +425,8 @@ mimeAddTypeRule(mime_type_t *mt, /* I - Type to add to */
op = MIME_MAGIC_ASCII;
else if (!strcmp(name, "printable"))
op = MIME_MAGIC_PRINTABLE;
else if (!strcmp(name, "regex"))
op = MIME_MAGIC_REGEX;
else if (!strcmp(name, "string"))
op = MIME_MAGIC_STRING;
else if (!strcmp(name, "istring"))
Expand Down Expand Up @@ -524,6 +526,12 @@ mimeAddTypeRule(mime_type_t *mt, /* I - Type to add to */
if (temp->length > MIME_MAX_BUFFER)
temp->length = MIME_MAX_BUFFER;
break;
case MIME_MAGIC_REGEX :
temp->offset = strtol(value[0], NULL, 0);
temp->length = MIME_MAX_BUFFER;
if (regcomp(&(temp->value.rev), value[1], REG_NOSUB | REG_EXTENDED))
return (-1);
break;
case MIME_MAGIC_STRING :
case MIME_MAGIC_ISTRING :
temp->offset = strtol(value[0], NULL, 0);
Expand Down Expand Up @@ -852,6 +860,49 @@ mime_check_rules(
result = (n == 0);
break;

case MIME_MAGIC_REGEX :
DEBUG_printf(("5mime_check_rules: regex(%d, \"%s\")", rules->offset,
rules->value.stringv));

/*
* Load the buffer if necessary...
*/

if (fb->offset < 0 || rules->offset < fb->offset ||
(rules->offset + rules->length) > (fb->offset + fb->length))
{
/*
* Reload file buffer...
*/

cupsFileSeek(fb->fp, rules->offset);
fb->length = cupsFileRead(fb->fp, (char *)fb->buffer,
sizeof(fb->buffer));
fb->offset = rules->offset;

DEBUG_printf(("5mime_check_rules: loaded %d byte fb->buffer at %d, starts "
"with \"%c%c%c%c\".",
fb->length, fb->offset, fb->buffer[0], fb->buffer[1],
fb->buffer[2], fb->buffer[3]));
}

/*
* Compare the buffer against the string. If the file is too
* short then don't compare - it can't match...
*/

{
char temp[MIME_MAX_BUFFER + 1];
/* Temporary buffer */

memcpy(temp, fb->buffer, fb->length);
temp[fb->length] = '\0';
result = !regexec(&(rules->value.rev), temp, 0, NULL, 0);
}

DEBUG_printf(("5mime_check_rules: result=%d", result));
break;

case MIME_MAGIC_STRING :
DEBUG_printf(("5mime_check_rules: string(%d, \"%s\")", rules->offset,
rules->value.stringv));
Expand Down

0 comments on commit 6ee54c0

Please sign in to comment.