주요 콘텐츠로 건너뛰기

Word Search 라이브러리

Glasswall Embedded Engine는 심층 파일 검사, 복구, sanitisation 및 보고 기능을 제공합니다. 이 엔진은 파일을 구조적 구성 요소로 분해하고 파일의 내부 트리 형태 표현을 생성합니다. 그런 다음 트리의 각 노드를 순회하면서 콘텐츠 항목을 검사, 복구 및 sanitisation한 후 새 파일을 재구성합니다.

Glasswall Embedded Engine는 XML과 같은 중간 형식으로 파일 구조의 엔진 내부 표현을 내보내고 가져오는 기능도 제공합니다. 이를 통해 파일의 내부 구성 요소를 외부 프로그램에서 추가 처리할 수 있도록 제공한 뒤, 외부에서 수정된 해당 구성 요소를 포함하도록 파일을 다시 조합할 수 있습니다.

Glasswall Word Search 엔진은 내보내기 및 가져오기 기능을 기반으로 구축되었으며, 파일의 콘텐츠와 메타데이터에서 텍스트 검색을 수행합니다. 검색 문자열, 콘텐츠 관리 및 redaction 규칙은 XML 파일을 통해 구성됩니다. JSON 형식으로 정의된 사용자 구성 가능 문자 치환 맵은 텍스트 난독화 지원을 제공합니다. 또한 이 엔진에는 정규식 지원이 기본 제공됩니다.

Word Search 구성

Word Search 구성은 검색할 텍스트 또는 적용할 정규식을 지정하고, 문서 내에서 발견되었을 때 이를 어떻게 처리할지 정의합니다. Word Search 구성은 Glasswall 콘텐츠 관리의 확장 기능입니다.

예제 policy 파일 및 스키마

예제 Word Search policy 파일과 homoglyph 사전은 릴리스 패키지의 /configs/sdk_word_search 폴더에서 찾을 수 있습니다. Word Search XSD는 릴리스 패키지의 /schemas/sdk_word_search 폴더에서 찾을 수 있습니다.

예제 구성 policy

텍스트 설정

다음 섹션에서는 구성 policy에서 정의할 수 있는 다양한 textSetting을 보여줍니다. 각 설정에 대한 자세한 내용은 Word Search & Redaction 페이지를 참조하세요.

허용
<textSearchConfig libVersion="core2">
<textList>
<textItem>
<regex>((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)\.?\b){4}</regex>
<textSetting>allow</textSetting>
</textItem>
<textItem>
<text>Glasswall</text>
<textSetting>allow</textSetting>
</textItem>
</textList>
</textSearchConfig>
차단
<textSearchConfig libVersion="core2">
<textList>
<textItem>
<regex>((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)\.?\b){4}</regex>
<textSetting>disallow</textSetting>
</textItem>
<textItem>
<text>Glasswall</text>
<textSetting>disallow</textSetting>
</textItem>
</textList>
</textSearchConfig>
비식별화
<textSearchConfig libVersion="core2">
<textList>
<textItem>
<regex>((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)\.?\b){4}</regex>
<textSetting replacementChar="*">redact</textSetting>
</textItem>
<textItem>
<text>Glasswall</text>
<textSetting replacementChar="*">redact</textSetting>
</textItem>
</textList>
</textSearchConfig>
필수
<textSearchConfig libVersion="core2">
<textList>
<textItem>
<regex>((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)\.?\b){4}</regex>
<textSetting>require</textSetting>
</textItem>
</textList>
</textSearchConfig>

시스템 구성

핵심 Glasswall 엔진과 마찬가지로 추가 스위치는 sysConfig 섹션에서 찾을 수 있습니다. 이러한 스위치는 입력 파일을 처리하는 동안 Word Search 엔진의 동작을 제어합니다.

<sysConfig>
<!--interchange_type must always be specified with the value "xml"-->
<interchange_type>xml</interchange_type>
<!--Enables/disables processing of text files. False by default.-->
<enable_text_support>false</enable_text_support>
</sysConfig>

알려진 제한 사항

  • Office 파일과 텍스트 파일을 동시에 처리하는 것은 불가능합니다
  • 텍스트 파일을 처리할 때는 최소 하나의 require policy를 정의해야 합니다
  • interchange_type must always be specified as xml under sysConfig
  • Configuration policy that has a combination of the following textSettings with the same text/regex defined will always process the file:
    • 필수 및 삭제
    • 필수 및 허용 안 함
    • 삭제 및 허용
    • 허용 및 허용 안 함

예시 JSON homoglyph config

이 JSON 파일을 사용하면 사용자가 문자와 해당 homoglyph 간의 매핑을 생성할 수 있습니다. 이를 통해 엔진이 검색 표현식을 생성할 때 homoglyph를 고려할 수 있으므로, homograph(겉보기에 같은 단어) 및 난독화된 텍스트를 지원할 수 있습니다.

기본 Homoglyphs Config
{
"!": "ǃⵑ",
"$": "$",
"%": "%",
"&": "ꝸ&",
"'": "`´ʹʻʼʽʾˈˊˋ˴ʹ΄՚՝י׳ߴߵᑊᛌ᾽᾿`´῾‘’‛′‵ꞌ'`𖽑𖽒",
"(": "❨❲〔﴾([",
")": "❩❳〕﴿)]",
"*": "٭⁎∗*𐌟",
"+": "᛭+𐊛",
",": "¸؍٫‚ꓹ,",
"-": "˗۔‐‑‒–⁃−➖Ⲻ﹘",
".": "٠۰܁܂․ꓸ꘎.𐩐𝅭",
"/": "᜵⁁⁄∕╱⟋⧸Ⳇ⼃〳ノ㇓丿/𝈺",
"0": "OoΟοσОоՕօסه٥ھہە۵߀०০੦૦ଠ୦௦ం౦ಂ೦ംഠ൦ං๐໐ဝ၀ჿዐᴏᴑℴⲞⲟⵔ〇ꓳꬽﮦﮧﮨﮩﮪﮫﮬﮭﻩﻪﻫﻬ0Oo𐊒𐊫𐐄𐐬𐓂𐓪𐔖𑓐𑢵𑣈𑣗𑣠𝐎𝐨𝑂𝑜𝑶𝒐𝒪𝓞𝓸𝔒𝔬𝕆𝕠𝕺𝖔𝖮𝗈𝗢𝗼𝘖𝘰𝙊𝙤𝙾𝚘𝚶𝛐𝛔𝛰𝜊𝜎𝜪𝝄𝝈𝝤𝝾𝞂𝞞𝞸𝞼𝟎𝟘𝟢𝟬𝟶𞸤𞹤𞺄",
"1": "Il|ƖǀΙІӀ׀וןا١۱ߊᛁℐℑℓⅠⅼ∣⏽Ⲓⵏꓲﺍﺎ1Il│𐊊𐌉𐌠𖼨𝐈𝐥𝐼𝑙𝑰𝒍𝓁𝓘𝓵𝔩𝕀𝕝𝕴𝖑𝖨𝗅𝗜𝗹𝘐𝘭𝙄𝙡𝙸𝚕𝚰𝛪𝜤𝝞𝞘𝟏𝟙𝟣𝟭𝟷𞣇𞸀𞺀",
"2": "ƧϨᒿꙄꛯꝚ2𝟐𝟚𝟤𝟮𝟸",
"3": "ƷȜЗӠⳌꝪꞫ3𑣊𖼻𝈆𝟑𝟛𝟥𝟯𝟹",
"4": "Ꮞ4𑢯𝟒𝟜𝟦𝟰𝟺",
"5": "Ƽ5𑢻𝟓𝟝𝟧𝟱𝟻",
"6": "бᏮⳒ6𑣕𝟔𝟞𝟨𝟲𝟼",
"7": "7𐓒𑣆𝈒𝟕𝟟𝟩𝟳𝟽",
"8": "Ȣȣ৪੪ଃ8𐌚𝟖𝟠𝟪𝟴𝟾𞣋",
"9": "৭੧୨൭ⳊꝮ9𑢬𑣌𑣖𝟗𝟡𝟫𝟵𝟿",
"A": "4ΑАᎪᗅᴀꓮꭺA𐊠𖽀𝐀𝐴𝑨𝒜𝓐𝔄𝔸𝕬𝖠𝗔𝘈𝘼𝙰𝚨𝛢𝜜𝝖𝞐",
"B": "ʙΒВвᏴᏼᗷᛒℬꓐꞴB𐊂𐊡𐌁𝐁𝐵𝑩𝓑𝔅𝔹𝕭𝖡𝗕𝘉𝘽𝙱𝚩𝛣𝜝𝝗𝞑",
"C": "ϹСᏟℂℭⅭⲤꓚC𐊢𐌂𐐕𐔜𑣩𑣲𝐂𝐶𝑪𝒞𝓒𝕮𝖢𝗖𝘊𝘾𝙲🝌",
"D": "ᎠᗞᗪᴅⅅⅮꓓꭰD𝐃𝐷𝑫𝒟𝓓𝔇𝔻𝕯𝖣𝗗𝘋𝘿𝙳",
"E": "ΕЕᎬᴇℰ⋿ⴹꓰꭼE𐊆𑢦𑢮𝐄𝐸𝑬𝓔𝔈𝔼𝕰𝖤𝗘𝘌𝙀𝙴𝚬𝛦𝜠𝝚𝞔",
"F": "ϜᖴℱꓝꞘF𐊇𐊥𐔥𑢢𑣂𝈓𝐅𝐹𝑭𝓕𝔉𝔽𝕱𝖥𝗙𝘍𝙁𝙵𝟊",
"G": "ɢԌԍᏀᏳᏻꓖꮐG𝐆𝐺𝑮𝒢𝓖𝔊𝔾𝕲𝖦𝗚𝘎𝙂𝙶",
"H": "ʜΗНнᎻᕼℋℌℍⲎꓧꮋH𐋏𝐇𝐻𝑯𝓗𝕳𝖧𝗛𝘏𝙃𝙷𝚮𝛨𝜢𝝜𝞖",
"I": "",
"J": "ͿЈᎫᒍᴊꓙꞲꭻJ𝐉𝐽𝑱𝒥𝓙𝔍𝕁𝕵𝖩𝗝𝘑𝙅𝙹",
"K": "ΚКᏦᛕKⲔꓗK𐔘𝐊𝐾𝑲𝒦𝓚𝔎𝕂𝕶𝖪𝗞𝘒𝙆𝙺𝚱𝛫𝜥𝝟𝞙",
"L": "ʟᏞᒪℒⅬⳐⳑꓡꮮL𐐛𐑃𐔦𑢣𑢲𖼖𝈪𝐋𝐿𝑳𝓛𝔏𝕃𝕷𝖫𝗟𝘓𝙇𝙻",
"M": "ΜϺМᎷᗰᛖℳⅯⲘꓟM𐊰𐌑𝐌𝑀𝑴𝓜𝔐𝕄𝕸𝖬𝗠𝘔𝙈𝙼𝚳𝛭𝜧𝝡𝞛",
"N": "ɴΝℕⲚꓠN𐔓𝐍𝑁𝑵𝒩𝓝𝔑𝕹𝖭𝗡𝘕𝙉𝙽𝚴𝛮𝜨𝝢𝞜",
"O": "0",
"P": "ΡРᏢᑭᴘᴩℙⲢꓑꮲP𐊕𝐏𝑃𝑷𝒫𝓟𝔓𝕻𝖯𝗣𝘗𝙋𝙿𝚸𝛲𝜬𝝦𝞠",
"Q": "ℚⵕQ𝐐𝑄𝑸𝒬𝓠𝔔𝕼𝖰𝗤𝘘𝙌𝚀",
"R": "ƦʀᎡᏒᖇᚱℛℜℝꓣꭱꮢR𐒴𖼵𝈖𝐑𝑅𝑹𝓡𝕽𝖱𝗥𝘙𝙍𝚁",
"S": "$ЅՏᏕᏚꓢS𐊖𐐠𖼺𝐒𝑆𝑺𝒮𝓢𝔖𝕊𝕾𝖲𝗦𝘚𝙎𝚂",
"T": "ŤΤτТтᎢᴛ⊤⟙ⲦꓔꭲT𐊗𐊱𐌕𑢼𖼊𝐓𝑇𝑻𝒯𝓣𝔗𝕋𝕿𝖳𝗧𝘛𝙏𝚃𝚻𝛕𝛵𝜏𝜯𝝉𝝩𝞃𝞣𝞽🝨",
"U": "Սሀᑌ∪⋃ꓴU𐓎𑢸𖽂𝐔𝑈𝑼𝒰𝓤𝔘𝕌𝖀𝖴𝗨𝘜𝙐𝚄",
"V": "Ѵ٧۷ᏙᐯⅤⴸꓦꛟV𐔝𑢠𖼈𝈍𝐕𝑉𝑽𝒱𝓥𝔙𝕍𝖁𝖵𝗩𝘝𝙑𝚅",
"W": "ԜᎳᏔꓪW𑣦𑣯𝐖𝑊𝑾𝒲𝓦𝔚𝕎𝖂𝖶𝗪𝘞𝙒𝚆",
"X": "ΧХ᙭ᚷⅩ╳ⲬⵝꓫꞳX𐊐𐊴𐌗𐌢𐔧𑣬𝐗𝑋𝑿𝒳𝓧𝔛𝕏𝖃𝖷𝗫𝘟𝙓𝚇𝚾𝛸𝜲𝝬𝞦",
"Y": "ΥϒУҮᎩᎽⲨꓬY𐊲𑢤𖽃𝐘𝑌𝒀𝒴𝓨𝔜𝕐𝖄𝖸𝗬𝘠𝙔𝚈𝚼𝛶𝜰𝝪𝞤",
"Z": "ΖᏃℤℨꓜZ𐋵𑢩𑣥𝐙𝑍𝒁𝒵𝓩𝖅𝖹𝗭𝘡𝙕𝚉𝚭𝛧𝜡𝝛𝞕",
"a": "@ɑαа⍺a𝐚𝑎𝒂𝒶𝓪𝔞𝕒𝖆𝖺𝗮𝘢𝙖𝚊𝛂𝛼𝜶𝝰𝞪",
"b": "ƄЬᏏᖯb𝐛𝑏𝒃𝒷𝓫𝔟𝕓𝖇𝖻𝗯𝘣𝙗𝚋",
"c": "ϲсᴄⅽⲥꮯc𐐽𝐜𝑐𝒄𝒸𝓬𝔠𝕔𝖈𝖼𝗰𝘤𝙘𝚌",
"d": "ԁᏧᑯⅆⅾꓒd𝐝𝑑𝒅𝒹𝓭𝔡𝕕𝖉𝖽𝗱𝘥𝙙𝚍",
"e": "еҽ℮ℯⅇꬲe𝐞𝑒𝒆𝓮𝔢𝕖𝖊𝖾𝗲𝘦𝙚𝚎",
"f": "ſϝքẝꞙꬵf𝐟𝑓𝒇𝒻𝓯𝔣𝕗𝖋𝖿𝗳𝘧𝙛𝚏𝟋",
"g": "ƍɡցᶃℊg𝐠𝑔𝒈𝓰𝔤𝕘𝖌𝗀𝗴𝘨𝙜𝚐",
"h": "һհᏂℎh𝐡𝒉𝒽𝓱𝔥𝕙𝖍𝗁𝗵𝘩𝙝𝚑",
"i": "ıɩɪ˛ͺιіӏᎥιℹⅈⅰ⍳ꙇꭵi𑣃𝐢𝑖𝒊𝒾𝓲𝔦𝕚𝖎𝗂𝗶𝘪𝙞𝚒𝚤𝛊𝜄𝜾𝝸𝞲",
"j": "ϳјⅉj𝐣𝑗𝒋𝒿𝓳𝔧𝕛𝖏𝗃𝗷𝘫𝙟𝚓",
"k": "k𝐤𝑘𝒌𝓀𝓴𝔨𝕜𝖐𝗄𝗸𝘬𝙠𝚔",
"l": "1",
"m": "m",
"n": "ոռn𝐧𝑛𝒏𝓃𝓷𝔫𝕟𝖓𝗇𝗻𝘯𝙣𝚗",
"o": "",
"p": "ρϱр⍴ⲣp𝐩𝑝𝒑𝓅𝓹𝔭𝕡𝖕𝗉𝗽𝘱𝙥𝚙𝛒𝛠𝜌𝜚𝝆𝝔𝞀𝞎𝞺𝟈",
"q": "ԛգզq𝐪𝑞𝒒𝓆𝓺𝔮𝕢𝖖𝗊𝗾𝘲𝙦𝚚",
"r": "гᴦⲅꭇꭈꮁr𝐫𝑟𝒓𝓇𝓻𝔯𝕣𝖗𝗋𝗿𝘳𝙧𝚛",
"s": "$ƽѕꜱꮪs𐑈𑣁𝐬𝑠𝒔𝓈𝓼𝔰𝕤𝖘𝗌𝘀𝘴𝙨𝚜",
"t": "t𝐭𝑡𝒕𝓉𝓽𝔱𝕥𝖙𝗍𝘁𝘵𝙩𝚝",
"u": "ʋυսᴜꞟꭎꭒu𐓶𑣘𝐮𝑢𝒖𝓊𝓾𝔲𝕦𝖚𝗎𝘂𝘶𝙪𝚞𝛖𝜐𝝊𝞄𝞾",
"v": "νѵטᴠⅴ∨⋁ꮩv𑜆𑣀𝐯𝑣𝒗𝓋𝓿𝔳𝕧𝖛𝗏𝘃𝘷𝙫𝚟𝛎𝜈𝝂𝝼𝞶",
"w": "ɯѡԝաᴡꮃw𑜊𑜎𑜏𝐰𝑤𝒘𝓌𝔀𝔴𝕨𝖜𝗐𝘄𝘸𝙬𝚠",
"x": "×хᕁᕽ᙮ⅹ⤫⤬⨯x𝐱𝑥𝒙𝓍𝔁𝔵𝕩𝖝𝗑𝘅𝘹𝙭𝚡",
"y": "ɣʏγуүყᶌỿℽꭚy𑣜𝐲𝑦𝒚𝓎𝔂𝔶𝕪𝖞𝗒𝘆𝘺𝙮𝚢𝛄𝛾𝜸𝝲𝞬",
"z": "ᴢꮓz𑣄𝐳𝑧𝒛𝓏𝔃𝔷𝕫𝖟𝗓𝘇𝘻𝙯𝚣",
"£": "₤",
"©": "Ⓒ",
"®": "Ⓡ"
}

예시 분석 보고서

다음은 검색 문자열이 사용된 textSetting과 관계없이 'Glasswall'로 설정되었을 때 생성되는 예시 분석 보고서입니다. 여기에는 지정된 파일에서 일치하는 모든 패턴에 대한 ItemMatchCount가 포함됩니다.

<gw:WordItem>
<gw:Name>Glasswall</gw:Name>
<gw:ItemMatchCount>1</gw:ItemMatchCount>
<gw:Locations>
<gw:Location>
<gw:Offset>463</gw:Offset>
<gw:Page>0</gw:Page>
<gw:Paragraph>0</gw:Paragraph>
</gw:Location>
</gw:Locations>
</gw:WordItem>

API 함수

상태

APIs GwWordSearch 및 GwWordSearchDone은 API 호출 결과를 나타내는 Status를 반환합니다. API GwWordSearchTranslateStatus는 전달된 Status에 대한 설명을 반환합니다.

열거자설명
ws_disallowedItemFound-1024파일에서 policy에 의해 허용되지 않는 항목이 발견되었습니다.
ws_requiredItemNotFound-1025파일에서 policy에 의해 요구되는 항목을 찾을 수 없습니다.
ws_illegalActionRedact-1026Redact 작업이 지정되었지만 파일 형식이 redaction을 지원하지 않습니다.
ws_illegalActionRequire-1027Require 작업이 지정되었지만 파일 형식이 require를 지원하지 않습니다.
ws_illegalActionNoRequire-1028Require 작업이 지정되지 않았지만 파일 형식에 해당 작업이 필요합니다.
ws_filetypeUnsupported-1029Word Search에서 지원하지 않는 파일 형식입니다.
eFail0일반 오류 또는 그 밖의 지정되지 않은 오류입니다.
eSuccess1작업이 성공적으로 완료되었습니다.

C++

각 API는 다음과 같이 정의된 Status를 반환합니다:

enum Status {
ws_disallowedItemFound = -1024,
ws_requiredItemNotFound = -1025,
ws_illegalActionRedact = -1026,
ws_illegalActionRequire = -1027,
ws_illegalActionNoRequire = -1028,
ws_filetypeUnsupported = -1029,
eFail = 0,
eSuccess = 1,
};

C#

C#에서 Glasswall Word Search를 통합하려면 Glasswall Word Search C# wrapper가 필요합니다. 각 API는 WordSearchStatus 유형을 반환하며, 이는 다음과 같이 정의됩니다:

/// <summary>
/// Indicates whether the Word Search process was successful (WordSearchStatus.Success)
/// or not (WordSearchStatus.Fail). Zero or negative values indicate a failure.
/// </summary>
public enum WordSearchStatus
{
DisallowedItemFound = -1024,
RequiredItemNotFound = -1025,
IllegalActionRedact = -1026,
IllegalActionRequire = -1027,
IllegalActionNoRequire = -1028,
FiletypeUnsupported = -1029,
Fail = 0,
Success
}

Java

Java에서 Glasswall Word Search를 통합하려면 Glasswall Word Search Java wrapper is required가 필요합니다. 각 API는 다음과 같이 정의된 GlasswallWordSearchResult` 타입을 반환합니다:

package com.glasswallsolutions;

/**
* Class used to hold the results from a Word Search process.
*/
public class GlasswallWordSearchResult
{
/**
* The XML analysis report
*/
public String report;

/**
* The processed document
*/
public byte[] outputDocument;

/**
* boolean indicating whether the process was successful (true) or not (false)
*/
public boolean success;

public GlasswallWordSearchResult()
{
report = null;
outputDocument = null;
success = false;
}
}

Python

Python에서 Glasswall Word Search를 통합하려면 Glasswall Python wrapper is required가 필요합니다. 각 API는 범용 GwReturnObj 객체를 반환하며, 이 객체에는 "status" (int), "output_file" (bytes), "output_report" (bytes) 속성이 포함됩니다. int status는 다음과 같이 정의됩니다:

# glasswall\libraries\word_search\successes.py

class Success(WordSearchSuccess):
""" WordSearch success code 1. """
pass


success_codes = {
1: Success,
}
# glasswall\libraries\word_search\errors.py

class UnknownErrorCode(WordSearchError):
""" Unknown error code. """
pass

class Fail(WordSearchError):
""" WordSearch error code 0. """
pass


class DisallowedItemFound(WordSearchError):
""" WordSearch error code -1024. Item disallowed by policy found in file. """
pass


class RequiredItemNotFound(WordSearchError):
""" WordSearch error code -1025. Item required by policy not found in file. """
pass


class IllegalActionRedact(WordSearchError):
""" WordSearch error code -1026. Redact action specified but filetype doesn't support redaction. """
pass


class IllegalActionRequire(WordSearchError):
""" WordSearch error code -1027. Require action specified but filetype doesn't support redaction. """
pass


class IllegalActionNoRequire(WordSearchError):
""" WordSearch error code -1028. Require action not specified but filetype needs one. """
pass


class FiletypeUnsupported(WordSearchError):
""" WordSearch error code -1029. Filetype supported by Editor but not by Word Search. """
pass


error_codes = {
0: Fail,
-1024: DisallowedItemFound,
-1025: RequiredItemNotFound,
-1026: IllegalActionRedact,
-1027: IllegalActionRequire,
-1028: IllegalActionNoRequire,
-1029: FiletypeUnsupported,
}

JavaScript

JavaScript에서 Glasswall Word Search를 통합하려면 Glasswall Word Search JavaScript wrapper is required가 필요합니다. 각 API는 다음과 같이 정의된 WordSearchStatus 타입을 반환합니다:

/**
* Used to indicate whether the Word Search process was successful or not
*/
export const enum WordSearchStatus {
ws_disallowedItemFound = -1024,
ws_requiredItemNotFound = -1025,
ws_illegalActionRedact = -1026,
ws_illegalActionRequire = -1027,
ws_illegalActionNoRequire = -1028,
ws_filetypeUnsupported = -1029,
eFail = 0,
eSuccess = 1,
}

GwWordSearch

이는 Word Search 엔진을 호출하고, 지정된 입력 파일을 처리하며, Word Search 분석 보고서와 함께 출력 파일을 생성하는 데 사용됩니다.

C++

Status GwWordSearch(
void* input_buffer,
size_t input_buffer_len,
void** output_buffer,
size_t* output_buffer_len,
void** output_report_buffer,
size_t* output_report_buffer_len,
const char* homoglpyhs,
const char* xml_config_string
)
이름유형방향설명
input_buffervoid *입력처리할 입력 파일이 포함된 버퍼에 대한 포인터
input_buffer_lensize_t입력입력 파일 버퍼의 크기
output_buffervoid **출력처리된 파일 버퍼로 채워질 버퍼에 대한 포인터의 포인터입니다. 이 버퍼는 Word Search engine에서 할당합니다
output_buffer_lensize_t *출력출력 파일 버퍼 크기에 대한 포인터입니다. 이 값은 Word Search engine에서 설정합니다
output_report_buffervoid **출력Word Search analysis report 버퍼로 채워질 버퍼에 대한 포인터의 포인터입니다. 이 버퍼는 Word Search engine에서 할당합니다
output_report_buffer_lensize_t *출력Word Search 분석 보고서의 크기를 가리키는 포인터입니다. 이 값은 Word Search 엔진에 의해 설정됩니다.
homoglyphsconst char *입력homoglyphs 파일이 포함된 버퍼를 가리키는 포인터입니다. 이 버퍼는 null 종료되어야 합니다.
xml_config_stringconst char *입력콘텐츠 관리 XML 파일이 포함된 버퍼를 가리키는 포인터입니다. 이 버퍼는 null 종료되어야 합니다.

C#

C#에서 Glasswall Word Search를 통합하려면 Glasswall Word Search C# wrapper가 필요합니다.

public WordSearchStatus GwWordSearch(
byte[] inputBuffer,
out byte[] outputFileBuffer,
out String outputAnalysisReport,
string homoglyphs,
string xmlConfigString
)

이름유형방향설명
inputBufferbyte[]입력처리할 문서가 포함된 버퍼
outputFileBufferout byte[]출력처리된 문서를 포함하게 될 결과 버퍼
outputAnalysisReportout string출력Word Search 프로세스의 출력 분석 보고서
homoglyphsstring입력homoglyph 매핑을 포함하는 JSON 문서
xmlConfigStringstring입력XML 콘텐츠 관리 policy

Java

Java에서 Glasswall Word Search를 통합하려면 Glasswall Word Search Java wrapper가 필요합니다.


public native GlasswallWordSearchResult wordSearch(
byte[] inputDocument,
String homoglyphs,
String xmlConfig
)

이름유형방향설명
inputDocumentbyte[]입력처리할 문서가 포함된 버퍼
homoglyphsstring입력homoglyph 매핑을 포함하는 JSON 문서
xmlConfigstring입력XML 콘텐츠 관리 policy

참고: 일부 다른 지원 언어와 달리, Java의 모든 출력은 GlasswallWordSearchResult 객체로 반환됩니다.

Python

Python에서 Glasswall Word Search를 통합하려면 Glasswall Python wrapper가 필요합니다.

# glasswall\libraries\word_search\word_search.py

def redact_file(self, input_file: Union[str, bytes, bytearray, io.BytesIO], content_management_policy: Union[str, bytes, bytearray, io.BytesIO], output_file: Union[None, str] = None, output_report: Union[None, str] = None, homoglyphs: Union[None, str, bytes, bytearray, io.BytesIO] = None, raise_unsupported: bool = True):
""" Redacts text from input_file using the given content_management_policy and homoglyphs file, optionally writing the redacted file and analysis report to the paths specified by output_file and output_report.

Args:
input_file (Union[str, bytes, bytearray, io.BytesIO]): The input file path or bytes.
content_management_policy (Union[str, bytes, bytearray, io.BytesIO)]): The content management policy to apply.
output_file (Union[None, str], optional): Default None. If str, write output_file to that path.
output_report (Union[None, str], optional): Default None. If str, write output_file to that path.
homoglyphs (Union[None, str, bytes, bytearray, io.BytesIO)], optional): Default None. The homoglyphs json file path or bytes.
raise_unsupported (bool, optional): Default True. Raise exceptions when Glasswall encounters an error. Fail silently if False.

Returns:
gw_return_object (glasswall.GwReturnObj): An instance of class glasswall.GwReturnObj containing attributes: "status" (int), "output_file" (bytes), "output_report" (bytes)
"""


def redact_directory(self, input_directory: str, content_management_policy: Union[str, bytes, bytearray, io.BytesIO, glasswall.content_management.policies.policy.Policy], output_directory: Optional[str] = None, output_report_directory: Optional[str] = None, homoglyphs: Union[None, str, bytes, bytearray, io.BytesIO] = None, raise_unsupported: bool = True):
""" Redacts all files in a directory and it's subdirectories using the given content_management_policy and homoglyphs file. The redacted files are written to output_directory maintaining the same directory structure as input_directory.

Args:
input_directory (str): The input directory containing files to redact.
output_directory (str): The output directory where the redacted files will be written.
output_report_directory (Optional[str], optional): Default None. If str, the output directory where analysis reports for each redacted file will be written.
content_management_policy (Union[str, bytes, bytearray, io.BytesIO)]): The content management policy to apply.
homoglyphs (Union[None, str, bytes, bytearray, io.BytesIO)], optional): Default None. The homoglyphs file path, str, or bytes.
raise_unsupported (bool, optional): Default True. Raise exceptions when Glasswall encounters an error. Fail silently if False.

Returns:
redacted_files_dict (dict): A dictionary of file paths relative to input_directory, and glasswall.GwReturnObj with attributes: "status" (int), "output_file" (bytes), "output_report" (bytes)
"""

참고: 일부 다른 지원 언어와 달리, Python의 모든 출력은 GwReturnObj 객체로 반환됩니다.

JavaScript


/**
* Perform word search on input buffer, using the applied config and homoglyphs
* @param {Buffer} inputBuffer A buffer containing the contents of the document to be processed.
* @param {String} homoglyphs A homoglyphs file that will be used as part of the Word Search process (UTF-8 string).
* @param {String} configXml The content management XML policy (utf-8 string).
* @returns {WordSearchResult} The result from Word Search.
*/
wordSearch(inputBuffer: Buffer, homoglyphs: string, configXml: string): WordSearchResult

참고: 일부 다른 지원 언어와 달리, JavaScript의 모든 출력은 WordSearchResult 객체로 반환됩니다.

GWWordSearchDone

이는 Word Search 엔진이 할당한 모든 리소스를 해제하는 데 사용됩니다. GwWordSearch 함수를 호출할 때마다 이후에 이 함수를 호출해야 하며, 그렇지 않으면 메모리 누수가 발생합니다.

이 API 호출은 C++에서만 필요합니다.

C++

Status GwWordSearchDone(
void** output_buffer,
size_t* output_buffer_len,
void** output_report_buffer,
size_t* output_report_buffer_len)
이름유형방향설명
output_buffervoid **출력Word Search 라이브러리에 의해 해제될 처리된 파일이 들어 있는 버퍼에 대한 포인터의 포인터
output_buffer_lensize_t *출력출력 파일 버퍼 크기에 대한 포인터
output_report_buffervoid **출력Word Search 라이브러리에 의해 해제될 Word Search 분석 보고서가 들어 있는 버퍼에 대한 포인터의 포인터
output_report_buffer_lensize_t *출력Word Search 분석 보고서 크기에 대한 포인터

기타 언어

Glasswall wrapper가 지원하는 모든 언어에서는 GwWordSearchDone API 함수가 wrapper 내부에서 호출되므로, 이 API는 사용자에게 노출되지 않습니다.

GwWordSearchVersion

이는 현재 라이브러리 버전 번호를 가져오는 데 사용됩니다.

C++

const char* GwWordSearchVersion(void)

GwWordSearchTranslateStatus

제공된 오류 코드를 사용자 친화적인 오류 메시지로 변환합니다.

C++

const char* GwWordSearchTranslateStatus(Status errorCode)
이름유형방향설명
errorCodeStatus입력변환해야 하는 반환 코드

일반적인 문제

Word Search가 파일을 처리하지 않음

Word Search를 실행할 때는 모든 Embedded Engine 라이브러리가 동일한 디렉터리에 위치해 있어야 하며, 해당 디렉터리는 현재 작업 디렉터리로도 설정되어 있어야 합니다. Glasswall은 현재 작업 디렉터리 내에서 종속성을 검색하며, 이를 찾지 못하면 파일이 올바르게 처리되지 않습니다. 또한 유효한 라이선스 키가 있는지 확인하십시오.

사용 예

여기에는 입력 파일을 받아 Glasswall Word Search 엔진을 사용해 처리한 다음, Word Search 분석 보고서와 함께 출력 파일을 생성하는 예제 애플리케이션이 있습니다. 이 예제 애플리케이션은 다음 명령줄 매개변수를 필요로 합니다:

  1. 콘텐츠 관리 구성 XML의 경로.
  2. homoglyphs 파일의 경로.
  3. 처리할 입력 파일의 경로입니다.
  4. 처리된 파일이 저장될 출력 파일의 경로입니다.

C++

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <cstddef>
#include <stdexcept>

#include "api.h"

using namespace std;

// Read the file into a buffer
vector<uint8_t> readFile(ifstream &fileHandle, const string &filePath, bool nullTerminator)
{
fileHandle.exceptions(ifstream::failbit | ifstream::badbit);
fileHandle.open(filePath.c_str(), ios::binary | ios::ate);

vector<uint8_t> data;
streamsize size = fileHandle.tellg();
fileHandle.seekg(0, ios::beg);

data.resize(size + 1);
fileHandle.read(reinterpret_cast<char *>(data.data()), size);

if (nullTerminator)
{
data.push_back(0);
}

return data;
}

int main(int argc, char **argv)
{
if (argc != 5)
{
cerr << "Usage: <Path to XML Config> <Path to Homoglyphs> <Input file> <Output file>" << endl;
return -1;
}

// Read commandline arguments
string xmlFilePath(argv[1]);
string homoglyphsFilePath(argv[2]);
string inputFilePath(argv[3]);
string outputFilePath(argv[4]);

// Create file handles for input files
ifstream xmlFileHandle;
ifstream homoglyphsFileHandle;
ifstream inputFileHandle;

// Read files into buffers
vector<uint8_t> xmlBuffer = readFile(xmlFileHandle, xmlFilePath, true); // Buffer containing the XML content management settings. This is null terminated
vector<uint8_t> homoglyphsBuffer = readFile(homoglyphsFileHandle, homoglyphsFilePath, true); // Buffer containing the homoglyphs. This is null terminated
vector<uint8_t> inputBuffer = readFile(inputFileHandle, inputFilePath, false); // Buffer containing the input file to be processed

// Create variables for output buffers
void * outputBuffer = nullptr; // Output buffer for processed file
size_t outputBufferSize = 0; // Output buffer size
void * outputReportBuffer = nullptr; // Output buffer for analysis report file
size_t outputReportBufferSize = 0; // Output analysis report buffer size

// Run Word Search and redact
Status status = GwWordSearch(inputBuffer.data(), inputBuffer.size(), &outputBuffer, &outputBufferSize, &outputReportBuffer, &outputReportBufferSize, reinterpret_cast<const char*>(homoglyphsBuffer.data()), reinterpret_cast<const char *>(xmlBuffer.data()));

if (status == Status::eSuccess)
{
// Write out the processed output file if the Word Search and redact was successful
ofstream outputFileHandle(outputFilePath, ios::binary | ios::trunc);

if (outputFileHandle.is_open())
{
outputFileHandle.write(static_cast<const char *>(outputBuffer), outputBufferSize);
}

outputFileHandle.close();
}

// Write out the analysis report file
ofstream analysisFileHandle(outputFilePath + ".xml", ios::binary | ios::trunc);

if (analysisFileHandle.is_open())
{
analysisFileHandle.write(static_cast<const char *>(outputReportBuffer), outputReportBufferSize);
}

analysisFileHandle.close();

// Call done to release any allocated resources
GwWordSearchDone(&outputBuffer, &outputBufferSize, &outputReportBuffer, &outputReportBufferSize);

return 0;
}

C#

using System;
using System.IO;

namespace glasswall.word.search.csharp.testing
{
internal class Program
{
static void Main(string[] args)
{
Console.WriteLine("Word Search test");
if (args.Length != 4)
{
Console.WriteLine("usage: <Xml Config> <Homoglyphs> <Input Directory> <OutputDirectory>");
Console.WriteLine("Parameters specified: \n{0}", string.Join("\n", args));
return;
}

string xmlConfigPath = args[0];
string homoglyphsPath = args[1];
string inputDirectory = args[2];
string outputDirectory = args[3];

if (!File.Exists(xmlConfigPath))
{
Console.Error.WriteLine("Xml config does not exist: {0}", xmlConfigPath);
return;
}

if (!File.Exists(homoglyphsPath))
{
Console.Error.WriteLine("Homoglyphs does not exist: {0}", homoglyphsPath);
return;
}

if (!Directory.Exists(inputDirectory))
{
Console.Error.WriteLine("Input directory does not exist: {0}", inputDirectory);
return;
}

Directory.CreateDirectory(outputDirectory);

using (FileStream fileStream = new FileStream(Path.Combine(outputDirectory, "ProcessLog.txt"), FileMode.OpenOrCreate, FileAccess.Write))
{
using (StreamWriter writer = new StreamWriter(fileStream))
{
writer.WriteLine("> Word Search Library version: {0}", GlasswallWordSearch.GwWordSearchVersion());

string xmlConfig = File.ReadAllText(xmlConfigPath);
string homoglyphs = File.ReadAllText(homoglyphsPath);

foreach (string path in Directory.EnumerateFiles(inputDirectory, "*", SearchOption.AllDirectories))
{
writer.WriteLine("> Processing file: {0}", path);
string inputDirectoryPath = path.Substring(inputDirectory.Length + 1);
string directory = Path.Combine(outputDirectory, inputDirectoryPath);
Directory.CreateDirectory(directory);
processFile(path, directory, homoglyphs, xmlConfig);
}
}
}

return;
}
static void WriteAllBytes(string path, byte[] data)
{
if (data == null)
{
File.Create(path);
}
else
{
File.WriteAllBytes(path, data);
}
}
public static void processFile(string inputFile, string outputDirectory, string homoglyphs, string xmlConfig)
{

using (FileStream fileStream = new FileStream(Path.Combine(outputDirectory, Path.GetFileName(inputFile) + ".log"), FileMode.OpenOrCreate, FileAccess.Write))
{
using (StreamWriter writer = new StreamWriter(fileStream))
{
// Word Search
writer.WriteLine(">> Run Word Search");
byte[] inputFileBuffer = File.ReadAllBytes(inputFile);
byte[] outputBuffer, outputReportBuffer;
GlasswallWordSearch.WordSearchStatus status = GlasswallWordSearch.GwWordSearch(inputFileBuffer, out outputBuffer, out outputReportBuffer, homoglyphs, xmlConfig);
writer.WriteLine("Status is: {0}", status);

if (outputBuffer != null)
{
WriteAllBytes(Path.Combine(outputDirectory, Path.GetFileName(inputFile)), outputBuffer);
}

if (outputReportBuffer != null)
{
WriteAllBytes(Path.Combine(outputDirectory, Path.GetFileName(inputFile)) + ".xml", outputReportBuffer);
}
}
}
}
}
}

Java

package com.glasswallsolutions;

import java.lang.System;
import java.io.*;
import com.glasswallsolutions.*;
import java.nio.file.Paths;

public class MainTest {

public static byte[] readAllBytes(InputStream inputStream) throws IOException
{
final int bufLen = 4 * 0x400; // 4KB
byte[] buf = new byte[bufLen];
int readLen;

try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
while ((readLen = inputStream.read(buf, 0, bufLen)) != -1)
outputStream.write(buf, 0, readLen);

return outputStream.toByteArray();
}
}

public static void main(String[] args) throws Exception {
if (args.length != 4)
{
System.out.println("Usage: <Input Directory> <Output Directory> <Homoglyphs File> <Config XML>");
System.exit(-1);
}

File inputDirectory = new File(args[0]);
File outputDirectory = new File(args[1]);
outputDirectory.delete();
outputDirectory.mkdir();
String homoglyphsFile = args[2];
String configXmlFile = args[3];

String homoglyphs = null;
String configXML = null;

GlasswallWordSearch glasswallWordSearch = new GlasswallWordSearch();

try(FileInputStream homoglyphsInputStream = new FileInputStream(homoglyphsFile))
{
homoglyphs = new String(readAllBytes(homoglyphsInputStream));
}

try(FileInputStream configXmlInputStream = new FileInputStream(configXmlFile))
{
configXML = new String(readAllBytes(configXmlInputStream));
}

System.out.println("Word Search version: " + glasswallWordSearch.version());

for (File inputFile : inputDirectory.listFiles())
{
try
{
System.out.println("Processing file: " + inputFile.getAbsolutePath());

File fileOutputDirectory = new File(Paths.get(outputDirectory.getAbsolutePath(), inputFile.getName()).toString());
fileOutputDirectory.mkdir();
String fileOutputPath = Paths.get(fileOutputDirectory.getAbsolutePath(), inputFile.getName()).toString();

try(FileInputStream inputStream = new FileInputStream(inputFile))
{
byte[] fileData = readAllBytes(inputStream);

GlasswallWordSearchResult result = glasswallWordSearch.wordSearch(fileData, homoglyphs, configXML);

System.out.println("Status: " + result.success);

if (result.outputDocument != null)
{
try(FileOutputStream fileOutputStream = new FileOutputStream(fileOutputPath))
{
fileOutputStream.write(result.outputDocument);
}
}

if (result.report != null)
{
try(FileOutputStream fileOutputStream = new FileOutputStream(fileOutputPath + ".xml"))
{
fileOutputStream.write(result.report.getBytes());
}
}
}
}
catch(Exception ex)
{
System.err.println("Exception occurred: " + ex.getMessage());
ex.printStackTrace(System.err);

}
}
}
}

Python

추가 예시는 Python Word Search & Redaction을 참조하세요

JavaScript


import fs from 'fs';
import path from 'path';
import { GlasswallWordSearch, GlasswallWordSearchNative, WordSearchResult, WordSearchStatus } from '../index'

let main = function()
{
const args = process.argv;

if (args.length === 7)
{
let wordSearchDllPath = path.resolve(args[2]);
let inputDirectory = path.resolve(args[3]);
let outputDirectory = path.resolve(args[4]);
let homoglyphsPath = path.resolve(args[5]);
let configXmlPath = path.resolve(args[6]);

let handler = new GlasswallWordSearchNative(wordSearchDllPath, { enableLogging: true});
let glasswallWordSearch = new GlasswallWordSearch(handler);
console.log("Glasswall Word Search version: " + glasswallWordSearch.version())

if (!fs.existsSync(inputDirectory))
{
console.log('Input Directory does not exist: ' + inputDirectory);
process.exit(-1);
}

if (!fs.existsSync(homoglyphsPath))
{
console.log('Homoglyphs file does not exist: ' + homoglyphsPath);
process.exit(-1);
}

if (!fs.existsSync(configXmlPath))
{
console.log('Config XML file does not exist: ' + configXmlPath);
process.exit(-1);
}

let homoglyphs = fs.readFileSync(homoglyphsPath, 'utf8');
let configXml = fs.readFileSync(configXmlPath , 'utf8');

fs.mkdirSync(outputDirectory, {recursive: true});

fs.readdirSync(inputDirectory).forEach(file => {
try
{
let fullFilePath = path.join(inputDirectory, file);

if (fs.statSync(fullFilePath).isFile())
{
console.log('Processing file: ' + fullFilePath);
let outputFileDirectory = path.join(outputDirectory, file);
fs.mkdirSync(outputFileDirectory);
let inputBuffer = fs.readFileSync(fullFilePath);
let wordSearchResult = glasswallWordSearch.wordSearch(inputBuffer, homoglyphs, configXml);
console.log("Status: " + wordSearchResult.status);

if (wordSearchResult.outputBuffer != undefined && wordSearchResult.outputBuffer != null)
{
fs.writeFileSync(path.join(outputFileDirectory, file), wordSearchResult.outputBuffer);
}

if (wordSearchResult.analysisXmlReport != undefined && wordSearchResult.analysisXmlReport != null)
{
fs.writeFileSync(path.join(outputFileDirectory, file + ".xml"), wordSearchResult.analysisXmlReport);
}
}
}
catch(error)
{
console.log("Exception occurred: " + error);
console.trace(error);
}

})
}
else
{
console.log("Usage: Application <Library File> <Input Directory> <Output Directory> <Homoglyphs File> <Config XML>");
process.exit(-1);
}
}

if (require.main === module){
main();
}