diff --git a/HTMLPurifier.xcodeproj/project.pbxproj b/HTMLPurifier.xcodeproj/project.pbxproj index 8b13b08..8c8258b 100644 --- a/HTMLPurifier.xcodeproj/project.pbxproj +++ b/HTMLPurifier.xcodeproj/project.pbxproj @@ -330,6 +330,10 @@ 806C47071B7F233100FE1D4C /* HTMLPurifier_AttrDef_CSS_Outline.h in Headers */ = {isa = PBXBuildFile; fileRef = 806C47051B7F233100FE1D4C /* HTMLPurifier_AttrDef_CSS_Outline.h */; }; 806C47091B7F237B00FE1D4C /* HTMLPurifier_AttrDef_CSS_Outline.m in Sources */ = {isa = PBXBuildFile; fileRef = 806C47081B7F237B00FE1D4C /* HTMLPurifier_AttrDef_CSS_Outline.m */; }; 806C470A1B7F237B00FE1D4C /* HTMLPurifier_AttrDef_CSS_Outline.m in Sources */ = {isa = PBXBuildFile; fileRef = 806C47081B7F237B00FE1D4C /* HTMLPurifier_AttrDef_CSS_Outline.m */; }; + 806C470C1B7F74FA00FE1D4C /* HTMLPurifier_AttrDef_CSS_BorderRadius.m in Sources */ = {isa = PBXBuildFile; fileRef = 806C470B1B7F74FA00FE1D4C /* HTMLPurifier_AttrDef_CSS_BorderRadius.m */; }; + 806C470D1B7F74FA00FE1D4C /* HTMLPurifier_AttrDef_CSS_BorderRadius.m in Sources */ = {isa = PBXBuildFile; fileRef = 806C470B1B7F74FA00FE1D4C /* HTMLPurifier_AttrDef_CSS_BorderRadius.m */; }; + 806C470F1B7F750B00FE1D4C /* HTMLPurifier_AttrDef_CSS_BorderRadius.h in Headers */ = {isa = PBXBuildFile; fileRef = 806C470E1B7F750B00FE1D4C /* HTMLPurifier_AttrDef_CSS_BorderRadius.h */; }; + 806C47101B7F750B00FE1D4C /* HTMLPurifier_AttrDef_CSS_BorderRadius.h in Headers */ = {isa = PBXBuildFile; fileRef = 806C470E1B7F750B00FE1D4C /* HTMLPurifier_AttrDef_CSS_BorderRadius.h */; }; 808CB9C21887DCAA00AFB841 /* HTMLPurifier_AttrDef_HTML_BoolTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 808CB9C11887DCAA00AFB841 /* HTMLPurifier_AttrDef_HTML_BoolTest.m */; }; 808CB9C71887E4D500AFB841 /* HTMLPurifier_AttrDefHarness.m in Sources */ = {isa = PBXBuildFile; fileRef = 808CB9C61887E4D500AFB841 /* HTMLPurifier_AttrDefHarness.m */; }; 808CB9C918881BD200AFB841 /* HTMLPurifier_AttrDef_HTML_ColorTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 808CB9C818881BD200AFB841 /* HTMLPurifier_AttrDef_HTML_ColorTest.m */; }; @@ -837,6 +841,8 @@ 806C47021B7D263000FE1D4C /* HTMLPurifier_AttrDef_CSS_Shape.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTMLPurifier_AttrDef_CSS_Shape.m; sourceTree = ""; }; 806C47051B7F233100FE1D4C /* HTMLPurifier_AttrDef_CSS_Outline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTMLPurifier_AttrDef_CSS_Outline.h; sourceTree = ""; }; 806C47081B7F237B00FE1D4C /* HTMLPurifier_AttrDef_CSS_Outline.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTMLPurifier_AttrDef_CSS_Outline.m; sourceTree = ""; }; + 806C470B1B7F74FA00FE1D4C /* HTMLPurifier_AttrDef_CSS_BorderRadius.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTMLPurifier_AttrDef_CSS_BorderRadius.m; sourceTree = ""; }; + 806C470E1B7F750B00FE1D4C /* HTMLPurifier_AttrDef_CSS_BorderRadius.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTMLPurifier_AttrDef_CSS_BorderRadius.h; sourceTree = ""; }; 808CB9C11887DCAA00AFB841 /* HTMLPurifier_AttrDef_HTML_BoolTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTMLPurifier_AttrDef_HTML_BoolTest.m; sourceTree = ""; }; 808CB9C51887E4D500AFB841 /* HTMLPurifier_AttrDefHarness.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTMLPurifier_AttrDefHarness.h; sourceTree = ""; }; 808CB9C61887E4D500AFB841 /* HTMLPurifier_AttrDefHarness.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTMLPurifier_AttrDefHarness.m; sourceTree = ""; }; @@ -1636,6 +1642,8 @@ 80F53C1E189BE6F600D7805F /* HTMLPurifier_AttrDef_CSS_BackgroundPosition.m */, 80F53C1F189BE6F600D7805F /* HTMLPurifier_AttrDef_CSS_Border.h */, 80F53C20189BE6F600D7805F /* HTMLPurifier_AttrDef_CSS_Border.m */, + 806C470E1B7F750B00FE1D4C /* HTMLPurifier_AttrDef_CSS_BorderRadius.h */, + 806C470B1B7F74FA00FE1D4C /* HTMLPurifier_AttrDef_CSS_BorderRadius.m */, 806C47051B7F233100FE1D4C /* HTMLPurifier_AttrDef_CSS_Outline.h */, 806C47081B7F237B00FE1D4C /* HTMLPurifier_AttrDef_CSS_Outline.m */, 80F53C21189BE6F600D7805F /* HTMLPurifier_AttrDef_CSS_Color.h */, @@ -2098,6 +2106,7 @@ files = ( 806C47001B7D261900FE1D4C /* HTMLPurifier_AttrDef_CSS_Shape.h in Headers */, 1EE4B32E1B13AFAA0056091D /* HTMLPurifier-Prefix.pch in Headers */, + 806C470F1B7F750B00FE1D4C /* HTMLPurifier_AttrDef_CSS_BorderRadius.h in Headers */, 1EB9ACE61B144E0D000EDDA5 /* BasicPHP.h in Headers */, 1E48254318ED9D7F00E4CC64 /* HTMLPurifier.h in Headers */, 806C47061B7F233100FE1D4C /* HTMLPurifier_AttrDef_CSS_Outline.h in Headers */, @@ -2294,6 +2303,7 @@ 80F53EE1189BE6F700D7805F /* HTMLPurifier_URIFilter_Munge.h in Headers */, 80F53DA2189BE6F700D7805F /* HTMLPurifier_AttrDef_CSS_Font.h in Headers */, 80F53E9C189BE6F700D7805F /* HTMLPurifier_Lexer_libxmlLex.h in Headers */, + 806C47101B7F750B00FE1D4C /* HTMLPurifier_AttrDef_CSS_BorderRadius.h in Headers */, 80F53E36189BE6F700D7805F /* HTMLPurifier_ConfigSchema.h in Headers */, 80F53E02189BE6F700D7805F /* HTMLPurifier_AttrTransform_Nofollow.h in Headers */, 80F53D9E189BE6F700D7805F /* HTMLPurifier_AttrDef_CSS_DenyElementDecorator.h in Headers */, @@ -2487,6 +2497,7 @@ 1E4825D818ED9DDF00E4CC64 /* HTMLPurifier_DefinitionCache.m in Sources */, 1E4825D918ED9DDF00E4CC64 /* HTMLPurifier_DefinitionCacheFactory.m in Sources */, 1E4825DA18ED9DDF00E4CC64 /* HTMLPurifier_HTMLDefinition.m in Sources */, + 806C470C1B7F74FA00FE1D4C /* HTMLPurifier_AttrDef_CSS_BorderRadius.m in Sources */, 1E4825DB18ED9DDF00E4CC64 /* HTMLPurifier_URIDefinition.m in Sources */, 1E4825DC18ED9DDF00E4CC64 /* HTMLPurifier_Strategy.m in Sources */, 1E4825DD18ED9DDF00E4CC64 /* HTMLPurifier_Strategy_Composite.m in Sources */, @@ -2750,6 +2761,7 @@ 80F53E43189BE6F700D7805F /* HTMLPurifier_DefinitionCache.m in Sources */, 80F53DEB189BE6F700D7805F /* HTMLPurifier_AttrTransform_BdoDir.m in Sources */, 80F53E2B189BE6F700D7805F /* HTMLPurifier_ChildDef_Optional.m in Sources */, + 806C470D1B7F74FA00FE1D4C /* HTMLPurifier_AttrDef_CSS_BorderRadius.m in Sources */, 80F53DED189BE6F700D7805F /* HTMLPurifier_AttrTransform_BgColor.m in Sources */, 80F53E6F189BE6F700D7805F /* HTMLPurifier_HTMLModule_Text.m in Sources */, 80F53EF8189BE6F700D7805F /* HTMLPurifier_URISchemeRegistry.m in Sources */, diff --git a/HTMLPurifier/Attributes/AttrDef/CSS/HTMLPurifier_AttrDef_CSS_BorderRadius.h b/HTMLPurifier/Attributes/AttrDef/CSS/HTMLPurifier_AttrDef_CSS_BorderRadius.h new file mode 100644 index 0000000..a53b443 --- /dev/null +++ b/HTMLPurifier/Attributes/AttrDef/CSS/HTMLPurifier_AttrDef_CSS_BorderRadius.h @@ -0,0 +1,19 @@ +// +// HTMLPurifier_AttrDef_CSS_BorderRadius.h +// HTMLPurifier +// +// Created by Lukas Neumann on 15.08.15. +// Copyright (c) 2015 Mynigma. All rights reserved. +// + +#import "HTMLPurifier_AttrDef.h" + +@interface HTMLPurifier_AttrDef_CSS_BorderRadius : HTMLPurifier_AttrDef +/** + * Validates the border-radius property as defined by CSS. + */ + +- (NSString*)validateWithString:(NSString*)string config:(HTMLPurifier_Config*)config context:(HTMLPurifier_Context*)context; + +@end + diff --git a/HTMLPurifier/Attributes/AttrDef/CSS/HTMLPurifier_AttrDef_CSS_BorderRadius.m b/HTMLPurifier/Attributes/AttrDef/CSS/HTMLPurifier_AttrDef_CSS_BorderRadius.m new file mode 100644 index 0000000..8536c16 --- /dev/null +++ b/HTMLPurifier/Attributes/AttrDef/CSS/HTMLPurifier_AttrDef_CSS_BorderRadius.m @@ -0,0 +1,27 @@ +// +// HTMLPurifier_AttrDef_CSS_BorderRadius.m +// HTMLPurifier +// +// Created by Lukas Neumann on 15.08.15. +// Copyright (c) 2015 Mynigma. All rights reserved. +// + +#import "HTMLPurifier_AttrDef_CSS_BorderRadius.h" +#import "BasicPHP.h" + + +@implementation HTMLPurifier_AttrDef_CSS_BorderRadius + +/** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ +- (NSString*)validateWithString:(NSString*)string config:(HTMLPurifier_Config*)config context:(HTMLPurifier_Context*)context +{ + return nil; +} + + +@end diff --git a/HTMLPurifier/Definition/HTMLPurifier_CSSDefinition.m b/HTMLPurifier/Definition/HTMLPurifier_CSSDefinition.m index 5db7e65..62550e5 100644 --- a/HTMLPurifier/Definition/HTMLPurifier_CSSDefinition.m +++ b/HTMLPurifier/Definition/HTMLPurifier_CSSDefinition.m @@ -29,6 +29,7 @@ #import "HTMLPurifier_AttrDef_CSS_AlphaValue.h" #import "HTMLPurifier_AttrDef_Integer.h" #import "HTMLPurifier_AttrDef_CSS_Outline.h" +#import "HTMLPurifier_AttrDef_CSS_BorderRadius.h" #import "BasicPHP.h" @@ -83,6 +84,16 @@ - (void)doSetup:(HTMLPurifier_Config*)config // border-color [self.info setObject:[[HTMLPurifier_AttrDef_CSS_Multiple alloc] initWithSingle:color_or_transparent] forKey:@"border-color"]; + // border-top-left-radius border-top-right-radius border-bottom-left-radius border-bottom-right-radius + HTMLPurifier_AttrDef_CSS_Composite* border_radius = [[HTMLPurifier_AttrDef_CSS_Composite alloc] initWithDefs:@[[[HTMLPurifier_AttrDef_Enum alloc] initWithValidValues:@[@"initial"]],[[HTMLPurifier_AttrDef_CSS_Multiple alloc] initWithSingle:[HTMLPurifier_AttrDef_CSS_Length new] max:2],[[HTMLPurifier_AttrDef_CSS_Multiple alloc] initWithSingle:[HTMLPurifier_AttrDef_CSS_Percentage new] max:2]]]; + [self.info setObject:border_radius forKey:@"border-top-left-radius"]; + [self.info setObject:border_radius forKey:@"border-top-right-radius"]; + [self.info setObject:border_radius forKey:@"border-bottom-right-radius"]; + [self.info setObject:border_radius forKey:@"border-bottom-left-radius"]; + + // border-radius + [self.info setObject:[HTMLPurifier_AttrDef_CSS_BorderRadius new] forKey:@"border-radius"]; + // border-spacing [self.info setObject:[[HTMLPurifier_AttrDef_CSS_Multiple alloc] initWithSingle:[HTMLPurifier_AttrDef_CSS_Length new] max:2] forKey:@"border-spacing"]; @@ -290,67 +301,50 @@ - (void)doSetup:(HTMLPurifier_Config*)config [self.info setObject:length_percentage_auto forKey:@"right"]; // table-layout - + [self.info setObject:[[HTMLPurifier_AttrDef_Enum alloc] initWithValidValues:@[@"auto", @"fixed"]] forKey:@"table-layout"]; + // text-align - [self.info setObject:[[HTMLPurifier_AttrDef_Enum alloc] initWithValidValues:@[@"left", @"right", @"center", @"justify"] caseSensitive:NO] forKey:@"text-align"]; - [self.info setObject:[[HTMLPurifier_AttrDef_Enum alloc] initWithValidValues:@[@"capitalize", @"uppercase", @"lowercase", @"none"] caseSensitive:NO] forKey:@"text-transform"]; - - - - - [self.info setObject:[[HTMLPurifier_AttrDef_CSS_Length alloc] initWithMin:0] forKey:@"border-radius"]; + // text-decoration + [self.info setObject:[HTMLPurifier_AttrDef_CSS_TextDecoration new] forKey:@"text-decoration"]; + // text-indent + [self.info setObject:[[HTMLPurifier_AttrDef_CSS_Composite alloc] initWithDefs:@[[HTMLPurifier_AttrDef_CSS_Length new], [HTMLPurifier_AttrDef_CSS_Percentage new]]] forKey:@"text-indent"]; + // text-transform + [self.info setObject:[[HTMLPurifier_AttrDef_Enum alloc] initWithValidValues:@[@"capitalize", @"uppercase", @"lowercase", @"none"] caseSensitive:NO] forKey:@"text-transform"]; - [self.info setObject:[[HTMLPurifier_AttrDef_CSS_Composite alloc] initWithDefs:@[[[HTMLPurifier_AttrDef_Enum alloc] initWithValidValues:@[@"normal"]], [HTMLPurifier_AttrDef_CSS_Length new]]] forKey:@"word-spacing"]; - - - [self.info setObject:[[HTMLPurifier_AttrDef_CSS_Composite alloc] initWithDefs:@[[[HTMLPurifier_AttrDef_CSS_Length alloc] init], [[HTMLPurifier_AttrDef_CSS_Percentage alloc] init]]] forKey:@"text-indent"]; - + // top + [self.info setObject:length_percentage_auto forKey:@"top"]; + // unicode-bidi + [self.info setObject:[[HTMLPurifier_AttrDef_Enum alloc] initWithValidValues:@[@"normal",@"embed",@"bidi-override"]] forKey:@"unicode-bidi"]; - - [self.info setObject:maxLength forKey:@"width"]; - - [self.info setObject:[[HTMLPurifier_AttrDef_CSS_TextDecoration alloc] init] forKey:@"text-decoration"]; - - - - [self.info setObject:[[HTMLPurifier_AttrDef_Enum alloc] initWithValidValues:@[@"auto", @"fixed"]] forKey:@"table-layout"]; - - + // vertical-align [self.info setObject:[[HTMLPurifier_AttrDef_CSS_Composite alloc] initWithDefs:@[[[HTMLPurifier_AttrDef_Enum alloc] initWithValidValues:@[@"baseline", @"sub", @"super", @"top", @"text-top", @"middle", @"bottom", @"text-bottom"]], [HTMLPurifier_AttrDef_CSS_Length new], [HTMLPurifier_AttrDef_CSS_Percentage new]]] forKey:@"vertical-align"]; + // visibility + [self.info setObject:[[HTMLPurifier_AttrDef_Enum alloc] initWithValidValues:@[@"visible",@"hidden",@"collapse"]] forKey:@"visibility"]; + // white-space + [self.info setObject:[[HTMLPurifier_AttrDef_Enum alloc] initWithValidValues:@[@"nowrap", @"normal", @"pre", @"pre-wrap", @"pre-line"]] forKey:@"white-space"]; + + // widows + [self.info setObject:[HTMLPurifier_AttrDef_Integer new] forKey:@"widows"]; - NSArray* array = @[@"visible",@"hidden",@"collapse"]; - HTMLPurifier_AttrDef_Enum* newEnum = [[HTMLPurifier_AttrDef_Enum alloc] initWithValidValues:array]; - [self.info setObject:newEnum forKey:@"visibility"]; + // width + [self.info setObject:maxLength forKey:@"width"]; + // word-spacing + [self.info setObject:[[HTMLPurifier_AttrDef_CSS_Composite alloc] initWithDefs:@[[[HTMLPurifier_AttrDef_Enum alloc] initWithValidValues:@[@"normal"]], [HTMLPurifier_AttrDef_CSS_Length new]]] forKey:@"word-spacing"]; + // z-index + [self.info setObject:[[HTMLPurifier_AttrDef_CSS_Composite alloc] initWithDefs:@[[HTMLPurifier_AttrDef_Integer new], _auto]] forKey:@"z-index"]; - - // These CSS properties don't work on many browsers, but we live - // in THE FUTURE! - [self.info setObject:[[HTMLPurifier_AttrDef_Enum alloc] initWithValidValues:@[@"nowrap", @"normal", @"pre", @"pre-wrap", @"pre-line"]] forKey:@"white-space"]; - /* - if ([[config get:@"CSS.Proprietary"] boolValue]) - { - [self doSetupProprietary:config]; - } - - - if ([config get:@"CSS.Trusted"]) - { - [self doSetupTrusted:config]; - }*/ - BOOL allow_important = [[config get:@"CSS.AllowImportant"] isEqual:@YES]; - // wrap all attr-defs with decorator that handles !important NSArray* allKeys = self.info.allKeys; for(NSString* k in allKeys) @@ -363,44 +357,6 @@ - (void)doSetup:(HTMLPurifier_Config*)config [self setupConfigStuff:config]; } -// /** -// * @param HTMLPurifier_Config $config -// */ -// protected function doSetupProprietary($config) -// { -// // Internet Explorer only scrollbar colors -// $this->info['scrollbar-arrow-color'] = new HTMLPurifier_AttrDef_CSS_Color(); -// $this->info['scrollbar-base-color'] = new HTMLPurifier_AttrDef_CSS_Color(); -// $this->info['scrollbar-darkshadow-color'] = new HTMLPurifier_AttrDef_CSS_Color(); -// $this->info['scrollbar-face-color'] = new HTMLPurifier_AttrDef_CSS_Color(); -// $this->info['scrollbar-highlight-color'] = new HTMLPurifier_AttrDef_CSS_Color(); -// $this->info['scrollbar-shadow-color'] = new HTMLPurifier_AttrDef_CSS_Color(); -// -// // technically not proprietary, but CSS3, and no one supports it -// $this->info['opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue(); -// $this->info['-moz-opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue(); -// $this->info['-khtml-opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue(); -// -// // only opacity, for now -// $this->info['filter'] = new HTMLPurifier_AttrDef_CSS_Filter(); -// -// // more CSS3 -// $this->info['page-break-after'] = -// $this->info['page-break-before'] = new HTMLPurifier_AttrDef_Enum( -// array( -// 'auto', -// 'always', -// 'avoid', -// 'left', -// 'right' -// ) -// ); -// $this->info['page-break-inside'] = new HTMLPurifier_AttrDef_Enum(array('auto', 'avoid')); -// -// } -// -// ); - /** * Performs extra config-based processing. Based off of diff --git a/HTMLPurifierTests/CSSTest.m b/HTMLPurifierTests/CSSTest.m index ac6a40c..a323e53 100644 --- a/HTMLPurifierTests/CSSTest.m +++ b/HTMLPurifierTests/CSSTest.m @@ -337,7 +337,7 @@ - (void)testBackgroundPosition - (void)testBackgroundColor { - [self assertDef:@"background:lightgrey;"]; + [self assertDef:@"background:lightgrey;" expected:@"background:#D3D3D3;"]; } - (void)testBorderSpacing @@ -392,7 +392,8 @@ - (void)testNodice - (void)testPositionAbsolute { - [self assertDef:@"position:absolute;" expected:nil]; + // former: [self assertDef:@"position:absolute;" expected:nil]; + [self assertDef:@"position:absolute;"]; } - (void)testBackgroundImageUrlScript diff --git a/HTMLPurifierTests/HTMLPurifierTests.m b/HTMLPurifierTests/HTMLPurifierTests.m index 3eed358..4d7e3f0 100644 --- a/HTMLPurifierTests/HTMLPurifierTests.m +++ b/HTMLPurifierTests/HTMLPurifierTests.m @@ -135,7 +135,7 @@ -(void) testVisibility { NSString* test = @" Popular video by EinKamel: \"WM 2014 Müller boarisch\""; NSString* result = [purifier purify:test]; - XCTAssertEqualObjects(result,@" Popular video by EinKamel: \"WM 2014 Müller boarisch\""); + XCTAssertEqualObjects(result,@" Popular video by EinKamel: \"WM 2014 Müller boarisch\""); } -(void) testBase64Img