{"id":8097,"date":"2024-05-13T08:50:36","date_gmt":"2024-05-12T23:50:36","guid":{"rendered":"\/blog\/?p=8097"},"modified":"2024-05-16T10:38:53","modified_gmt":"2024-05-16T01:38:53","slug":"fortify-report-generator","status":"publish","type":"post","link":"https:\/\/hasu0707.duckdns.org\/blog\/?p=8097","title":{"rendered":"[Fortify] Report Generator"},"content":{"rendered":"\n<p>fortify_ssc_report.java<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/*********************************************************************\n *\n * Opentext Fortify SSC DB \uae30\ubc18 \ub9ac\ud3ec\ud2b8\ub97c CSV \ub610\ub294 XLS\ub85c \ucd9c\ub825\n * (\ucde8\uc57d\uc810\uc758 \uacbd\ub85c \ubc0f \ub77c\uc778\ubc88\ud638, SSC \ub9c1\ud06c\uae4c\uc9c0 \uc0c1\uc138\ud788 \ucd9c\ub825)\n *\n * \uc124\uba85     : Fortify SSC DB\uc5d0 \uc811\uc18d\ud558\uc5ec Application\uc5d0 \ub300\ud55c \ucde8\uc57d\uc810\n *            \ub9ac\ud3ec\ud2b8 \uc791\uc131\n *            \uc2e4\ud589 \uc804 ssc_info.conf \ub97c \ud3b8\uc9d1\ud558\uc5ec \uc124\uc815 \uc14b\ud305\n * \ube4c\ub4dc \ubc29\ubc95: javac -encoding utf-8 -cp lib\/* fortify_ssc_report.java\n * \uc2e4\ud589 \ubc29\ubc95: java -cp lib\/* fortify_ssc_report -v -i &lt;AppID>\n *            -i &lt;AppID> :\ud2b9\uc815 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ubc84\uc804\uc5d0 \ub300\ud55c \ucde8\uc57d\uc810\ub9cc \ucd9c\ub825\n *                        \uc0dd\ub7b5 \uc2dc \uc804 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc774 \ub300\uc0c1\n *            -v: \uacb0\uacfc\ub97c stdout\uc73c\ub85c \ucd9c\ub825\n * \uc791\uc131\uc790   : \uc774\uc874\uc11d (hasu0707@esvali.com)\n *\n ********************************************************************\/\n\nimport org.apache.poi.common.usermodel.Hyperlink;\nimport org.apache.poi.common.usermodel.HyperlinkType;\nimport org.apache.poi.hssf.usermodel.HSSFCellStyle;\nimport org.apache.poi.hssf.usermodel.HSSFHyperlink;\nimport org.apache.poi.hssf.util.HSSFColor;\nimport org.apache.poi.ss.usermodel.Cell;\nimport org.apache.poi.ss.usermodel.CellStyle;\nimport org.apache.poi.ss.usermodel.CreationHelper;\nimport org.apache.poi.ss.usermodel.IndexedColors;\nimport org.apache.poi.ss.usermodel.Row;\nimport org.apache.poi.xssf.usermodel.XSSFCell;\nimport org.apache.poi.xssf.usermodel.XSSFFont;\nimport org.apache.poi.xssf.usermodel.XSSFHyperlink;\nimport org.apache.poi.xssf.usermodel.XSSFRow;\nimport org.apache.poi.xssf.usermodel.XSSFSheet;\nimport org.apache.poi.xssf.usermodel.XSSFWorkbook;\n\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.io.FileNotFoundException;\nimport java.io.FileOutputStream;\nimport java.io.FileWriter;\nimport java.io.IOException;\nimport java.sql.Connection;\nimport java.sql.DriverManager;\nimport java.sql.PreparedStatement;\nimport java.sql.ResultSet;\nimport java.sql.SQLException;\nimport java.sql.Statement;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Properties;\nimport java.util.Set;\nimport java.util.TreeMap;\n\npublic class fortify_ssc_report {\n    private static final String thisAppName = \"fortify_ssc_report\";\n    public static boolean verbose = false;\n    public static boolean isAllApplications = true;\n    public static String applicationID = \"0\";\n    public static HashMap &lt; String, String > propMap = new HashMap &lt; String, String > ();\n\n    \/**\n     **********************************************************\n     * \uc0ac\uc6a9\ubc95 \ucd9c\ub825\n     **********************************************************\n     *\/\n    public static void usage() {\n        System.out.println(thisAppName);\n        System.out.println(\"  -i &lt;SSC Application ID> : Application ID to report on.\");\n        System.out.println(\"  -v : verbose\");\n    }\n\n    \/**\n     **********************************************************\n     * \uc124\uc815 \ud30c\uc77c \uc77d\uae30\n     **********************************************************\n     *\/\n    public static int readPropertyFile(String fileName) {\n        Properties prop = new Properties();\n\n        try (FileInputStream fis = new FileInputStream(fileName)) {\n            prop.load(fis);\n        } catch (FileNotFoundException ex) {\n            ex.printStackTrace();\n            System.exit(1);\n        } catch (IOException ex) {\n            ex.printStackTrace();\n            System.exit(2);\n        }\n\n        \/\/ \uc124\uc815 \uac12 \uc77d\uc5b4\uc624\uae30\n        propMap.put(\"title\", prop.getProperty(\"title\"));\n        propMap.put(\"db_jdbc_addr\", prop.getProperty(\"db_jdbc_addr\"));\n        propMap.put(\"db_type\", prop.getProperty(\"db_type\"));\n        propMap.put(\"db_name\", prop.getProperty(\"db_name\"));\n        propMap.put(\"db_id\", prop.getProperty(\"db_id\"));\n        propMap.put(\"db_pw\", prop.getProperty(\"db_pw\"));\n        propMap.put(\"report_type\", prop.getProperty(\"report_type\"));\n        propMap.put(\"ssc_url\", prop.getProperty(\"ssc_url\"));\n        propMap.put(\"jdbc_class_name\", prop.getProperty(\"jdbc_class_name\"));\n        propMap.put(\"filterset\", prop.getProperty(\"filterset\"));\n        propMap.put(\"groupingtype\", prop.getProperty(\"groupingtype\"));\n        propMap.put(\"orderby\", prop.getProperty(\"orderby\"));\n\n        \/\/ \uc124\uc815\uc5d0 \uc5c6\ub294 \uacbd\uc6b0 \uae30\ubcf8\uac12 \uc14b\ud305\n        if (propMap.get(\"title\") == null)\n            propMap.put(\"title\", \"FORTIFY REPORT\");\n        if (propMap.get(\"db_jdbc_addr\") == null)\n            propMap.put(\"db_jdbc_addr\", \"jdbc:mysql:\/\/localhost:3306\");\n        if (propMap.get(\"db_type\") == null)\n            propMap.put(\"db_type\", \"mysql\");\n        if (propMap.get(\"db_name\") == null)\n            propMap.put(\"db_name\", \"\/db_ssc_2320\");\n        if (propMap.get(\"db_id\") == null)\n            propMap.put(\"db_id\", \"root\");\n        if (propMap.get(\"db_pw\") == null)\n            propMap.put(\"db_pw\", \"root\");\n        if (propMap.get(\"report_type\") == null)\n            propMap.put(\"report_type\", \"xls\");\n        if (propMap.get(\"ssc_url\") == null)\n            propMap.put(\"ssc_url\", \"http:\/\/localhost:8080\/ssc\");\n        if (propMap.get(\"jdbc_class_name\") == null)\n            propMap.put(\"jdbc_class_name\", \"com.mysql.cj.jdbc.Driver\");\n        if (propMap.get(\"filterset\") == null)\n            propMap.put(\"filterset\", \"32142c2d-3f7f-4863-a1bf-9b1e2f34d2ed\");\n        if (propMap.get(\"groupingtype\") == null)\n            propMap.put(\"groupingtype\", \"11111111-1111-1111-1111-111111111165\");\n        if (propMap.get(\"orderby\") == null)\n            propMap.put(\"orderby\", \"friority\");\n\n        return 0;\n    }\n\n    \/**\n     **********************************************************\n     * \uba85\ub839\ud589 \ud30c\uc2f1\n     * \ubc18\ud658\uac12: \ub9ac\ud3ec\ud305 \ud560 ApplicationID\n     **********************************************************\n     *\/\n    public static int parseCommandLine(String[] optionString) {\n        \/\/ -i &lt;\uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ubc88\ud638> : \ub9ac\ud3ec\ud305\ud560 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 ID\n        \/\/ -v : \ub9ac\ud3ec\ud305 \uc0dd\uc131 \uacfc\uc815 \ucd9c\ub825\n        for (int i = 0; i &lt; optionString.length; i++) {\n            \/\/debug\n            System.out.println(\"OPT:\"+ optionString[i]);\n            if (\"-v\".equals(optionString[i]) || \"--verbose\".equals(optionString[i])) {\n                verbose = true;\n            } else if (\"-i\".equals(optionString[i]) || \"--id\".equals(optionString[i])) {\n                if (i + 1 &lt; optionString.length) {\n                    applicationID = optionString[++i];\n                    isAllApplications = false;\n                } else {\n                    System.err.println(\"Error: missing application ID\");\n                    usage();\n                    System.exit(1);\n                }\n            } else {\n                System.err.println(\"Error: unrecognized argument: \" + optionString[i]);\n                usage();\n                System.exit(1);\n            }\n        }\n\n        return Integer.parseInt(applicationID);\n    }\n\n    \/**\n     **********************************************************\n     * SQL \ucffc\ub9ac \uc2a4\ud2b8\ub9c1 \uc791\uc131\n     **********************************************************\n     *\/\n    public static String getSQLString(String db_type) {\n        \/\/ SQL \uc815\uc758\n        \/\/ filterset.enabled = 'N'\uc774\uba74 QuickView \ubaa8\ub4dc\n        String sqlString = null;\n\n        switch (db_type) {\n            case \"mysql\":\n                sqlString =\n                    \"SELECT projectversion.id   AS '01',\\n\" +\n                    \"       issue.id            AS '02',\\n\" +\n                    \"       issue.issueInstanceId    AS '03',\\n\" +\n                    \"       project.name        AS '04',\\n\" +\n                    \"       projectversion.name AS '05',\\n\" +\n                    \"       folder.name         AS '06',\\n\" +\n                    \"       issue.kingdom       AS '07',\\n\" +\n                    \"       issue.issueType     AS '08',\\n\" +\n                    \"       issue.issueSubtype  AS '09',\\n\" +\n                    \"       issue.fileName      AS '10',\\n\" +\n                    \"       issue.packageName   AS '11',\\n\" +\n                    \"       issue.className     AS '12',\\n\" +\n                    \"       issue.functionName  AS '13',\\n\" +\n                    \"       issue.lineNumber    AS '14'\\n\" +\n                    \"FROM   issuecache\\n\" +\n                    \"       LEFT JOIN issue\\n\" +\n                    \"              ON issuecache.issue_id = issue.id\\n\" +\n                    \"       LEFT JOIN projectversion\\n\" +\n                    \"              ON issuecache.projectVersion_id = projectversion.id\\n\" +\n                    \"       LEFT JOIN project\\n\" +\n                    \"              ON projectversion.project_id = project.id AND projectversion.active = 'Y'\\n\" +\n                    \"       LEFT JOIN folder\\n\" +\n                    \"              ON issuecache.folder_id = folder.id\\n\" +\n                    \"       LEFT JOIN filterset\\n\" +\n                    \"              ON issuecache.filterSet_id = filterset.id\\n\" +\n                    \"WHERE  filterset.enabled = 'N'\\n\" +\n                    \"       AND issuecache.hidden = 'N'\\n\" +\n                    \"       AND issue.suppressed = 'N'\\n\" +\n                    \"       AND issue.scanStatus &lt;> 'REMOVED'\\n\" +\n                    \"       AND issue.friority &lt;> 'Medium'\\n\" +\n                    \"       AND issue.friority &lt;> 'Low'\\n\" +\n\/*\n                    \"GROUP  BY project.name,\\n\" +\n                    \"          projectversion.name,\\n\" +\n                    \"          folder.name,\\n\" +\n                    \"          issue.kingdom,\\n\" +\n                    \"          issue.issueType,\\n\" +\n                    \"          issue.issueSubtype,\\n\" +\n                    \"          issue.fileName,\\n\" +\n                    \"          issue.packageName,\\n\" +\n                    \"          issue.className,\\n\" +\n                    \"          issue.functionName,\\n\" +\n                    \"          issue.lineNumber\\n\" +\n*\/\n                    \"ORDER BY  project.name ASC,\\n\" +\n                    \"          projectversion.name ASC,\\n\" +\n                    \"          folder.name ASC,\\n\" +\n                    \"          issue.kingdom ASC,\\n\" +\n                    \"          issue.fileName ASC,\\n\" +\n                    \"          issue.issueType ASC,\\n\" +\n                    \"          issue.issueSubtype ASC\";\n                break;\n            case \"mssql\":\n                sqlString =\n                    \"SELECT projectversion.id   AS '01',\\n\" +\n                    \"       issue.id            AS '02',\\n\" +\n                    \"       issue.issueInstanceId    AS '03',\\n\" +\n                    \"       project.name        AS '04',\\n\" +\n                    \"       projectversion.name AS '05',\\n\" +\n                    \"       folder.name         AS '06',\\n\" +\n                    \"       issue.kingdom       AS '07',\\n\" +\n                    \"       issue.issueType     AS '08',\\n\" +\n                    \"       issue.issueSubtype  AS '09',\\n\" +\n                    \"       issue.fileName      AS '10',\\n\" +\n                    \"       issue.packageName   AS '11',\\n\" +\n                    \"       issue.className     AS '12',\\n\" +\n                    \"       issue.functionName  AS '13',\\n\" +\n                    \"       issue.lineNumber    AS '14'\\n\" +\n                    \"FROM   issuecache\\n\" +\n                    \"       LEFT JOIN issue\\n\" +\n                    \"              ON issuecache.issue_id = issue.id\\n\" +\n                    \"       LEFT JOIN projectversion\\n\" +\n                    \"              ON issuecache.projectVersion_id = projectversion.id\\n\" +\n                    \"       LEFT JOIN project\\n\" +\n                    \"              ON projectversion.project_id = project.id AND projectversion.active = 'Y'\\n\" +\n                    \"       LEFT JOIN folder\\n\" +\n                    \"              ON issuecache.folder_id = folder.id\\n\" +\n                    \"       LEFT JOIN filterset\\n\" +\n                    \"              ON issuecache.filterSet_id = filterset.id\\n\" +\n                    \"WHERE  filterset.enabled = 'N'\\n\" +\n                    \"       AND issuecache.hidden = 'N'\\n\" +\n                    \"       AND issue.suppressed = 'N'\\n\" +\n                    \"       AND issue.scanStatus &lt;> 'REMOVED'\\n\" +\n                    \"       AND issue.friority &lt;> 'Medium'\\n\" +\n                    \"       AND issue.friority &lt;> 'Low'\\n\" +\n\/*\n                    \"GROUP  BY project.name,\\n\" +\n                    \"          projectversion.name,\\n\" +\n                    \"          folder.name,\\n\" +\n                    \"          issue.kingdom,\\n\" +\n                    \"          issue.issueType,\\n\" +\n                    \"          issue.issueSubtype,\\n\" +\n                    \"          issue.fileName,\\n\" +\n                    \"          issue.packageName,\\n\" +\n                    \"          issue.className,\\n\" +\n                    \"          issue.functionName,\\n\" +\n                    \"          issue.lineNumber\\n\" +\n*\/\n                    \"ORDER BY  project.name ASC,\\n\" +\n                    \"          projectversion.name ASC,\\n\" +\n                    \"          folder.name ASC,\\n\" +\n                    \"          issue.kingdom ASC,\\n\" +\n                    \"          issue.fileName ASC,\\n\" +\n                    \"          issue.issueType ASC,\\n\" +\n                    \"          issue.issueSubtype ASC\";\n                break;\n            case \"oracle\" :\n                sqlString =\n                    \"SELECT projectversion.id,\\n\" +\n                    \"       issue.id,\\n\" +\n                    \"       issue.issueInstanceId,\\n\" +\n                    \"       project.name,\\n\" +\n                    \"       projectversion.name,\\n\" +\n                    \"       folder.name,\\n\" +\n                    \"       issue.kingdom,\\n\" +\n                    \"       issue.issueType,\\n\" +\n                    \"       issue.issueSubtype,\\n\" +\n                    \"       issue.fileName,\\n\" +\n                    \"       issue.packageName,\\n\" +\n                    \"       issue.className,\\n\" +\n                    \"       issue.functionName,\\n\" +\n                    \"       issue.lineNumber\\n\" +\n                    \"FROM   issuecache\\n\" +\n                    \"       LEFT JOIN issue\\n\" +\n                    \"              ON issuecache.issue_id = issue.id\\n\" +\n                    \"       LEFT JOIN projectversion\\n\" +\n                    \"              ON issuecache.projectVersion_id = projectversion.id\\n\" +\n                    \"       LEFT JOIN project\\n\" +\n                    \"              ON projectversion.project_id = project.id AND projectversion.active = 'Y'\\n\" +\n                    \"       LEFT JOIN folder\\n\" +\n                    \"              ON issuecache.folder_id = folder.id\\n\" +\n                    \"       LEFT JOIN filterset\\n\" +\n                    \"              ON issuecache.filterSet_id = filterset.id\\n\" +\n                    \"WHERE  filterset.enabled = 'N'\\n\" +\n                    \"       AND issuecache.hidden = 'N'\\n\" +\n                    \"       AND issue.suppressed = 'N'\\n\" +\n                    \"       AND issue.scanStatus &lt;> 'REMOVED'\\n\" +\n                    \"       AND issue.friority &lt;> 'Medium'\\n\" +\n                    \"       AND issue.friority &lt;> 'Low'\\n\" +\n\/*\n                    \"GROUP  BY project.name,\\n\" +\n                    \"          projectversion.name,\\n\" +\n                    \"          folder.name,\\n\" +\n                    \"          issue.kingdom,\\n\" +\n                    \"          issue.issueType,\\n\" +\n                    \"          issue.issueSubtype,\\n\" +\n                    \"          issue.fileName,\\n\" +\n                    \"          issue.packageName,\\n\" +\n                    \"          issue.className,\\n\" +\n                    \"          issue.functionName,\\n\" +\n                    \"          issue.lineNumber\\n\" +\n*\/\n                    \"ORDER BY  project.name ASC,\\n\" +\n                    \"          projectversion.name ASC,\\n\" +\n                    \"          folder.name ASC,\\n\" +\n                    \"          issue.kingdom ASC,\\n\" +\n                    \"          issue.fileName ASC,\\n\" +\n                    \"          issue.issueType ASC,\\n\" +\n                    \"          issue.issueSubtype ASC\";\n                break;\n            default :\n                System.out.println(\"ERROR: DB Type is unknown-\"+db_type);\n                System.exit(1);\n        }\n\n        return sqlString;\n    }\n\n    \/**\n     **********************************************************\n     * CSV \ud30c\uc77c\uc5d0 \ud0c0\uc774\ud2c0 \uc904\uc744 \uc368 \ub123\ub294\ub2e4.\n     **********************************************************\n     *\/\n    public static String getSSCHyperLink(String AppID, String issueID) {\n        String hyperLink = null;\n\n        hyperLink = propMap.get(\"ssc_url\");\n        hyperLink = hyperLink + \"\/html\/ssc\/version\/\";\n        hyperLink = hyperLink + AppID + \"\/\";\n        hyperLink = hyperLink + \"audit?q=\";\n\n        hyperLink = hyperLink + \"%5Binstance%20id%5D%3A\" + issueID + \"%20\";\n        hyperLink = hyperLink + \"%5Banalysis%20type%5D%3ASCA&amp;filterset=\" + propMap.get(\"filterset\") + \"&amp;\";\n        hyperLink = hyperLink + \"groupingtype=\" + propMap.get(\"groupingtype\") + \"&amp;\";\n        hyperLink = hyperLink + \"orderby=\" + propMap.get(\"orderby\") + \"&amp;\";\n        hyperLink = hyperLink + \"issue=\" + issueID + \"&amp;\";\n        hyperLink = hyperLink + \"enginetype=SCA&amp;viewTab=code\";\n\n        return hyperLink;\n    }\n\n    \/**\n     **********************************************************\n     * CSV \ud30c\uc77c\uc5d0 \ud0c0\uc774\ud2c0 \uc904\uc744 \uc368 \ub123\ub294\ub2e4.\n     **********************************************************\n     *\/\n    public static int csvWriteTitle(FileWriter fileDesc) {\n        String csvTitle = \"ID,APPLICATION,VERSION,FRIORITY,KINGDOM,ISSUE_TYPE,ISSUE_SUBTYPE,FILE,FUNCTION(PACKAGE|CLASS|METHOD),LINE,HYPER_LINK\\n\";\n\n        try {\n            fileDesc.write(csvTitle);\n        } catch (Exception e) {\n            System.err.println(\"ERROR: write - \" + e.getMessage());\n            e.printStackTrace();\n        }\n\n        return 0;\n    }\n\n    \/**\n     **********************************************************\n     * CSV \ud30c\uc77c\uc5d0 \ubaa9\ub85d\uc744 \uc791\uc131\ud55c\ub2e4.\n     **********************************************************\n     *\/\n    public static int csvWriteList(ResultSet resultQuery, FileWriter fileDesc) {\n        int listCount;\n        boolean isWrite = false;\n        String sinkString = null;\n\n        listCount = 0;\n        try {\n            while (resultQuery.next()) {\n                \/\/ \uc9c0\uc815\ub41c \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ubc88\ud638\uac00 \uc788\uc73c\uba74 \uadf8\uac83\ub9cc \ucd9c\ub825\n                isWrite = false;\n                if (isAllApplications) {\n                    isWrite = true;\n                } else {\n                    if (applicationID.equals(resultQuery.getString(1))) {\n                        isWrite = true;\n                    }\n                }\n\n                if (isWrite) {\n                    \/\/ \ud568\uc218\uba85 \ubb38\uc790\uc5f4 \uc644\uc131\n                    sinkString = resultQuery.getString(11) + \"|\" + resultQuery.getString(12) + \"|\" + resultQuery.getString(13);\n\n                    String csv_data = String.format(\"%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s\\n\",\n                        resultQuery.getString(2),\n                        resultQuery.getString(4),\n                        resultQuery.getString(5),\n                        resultQuery.getString(6),\n                        resultQuery.getString(7),\n                        resultQuery.getString(8),\n                        resultQuery.getString(9),\n                        resultQuery.getString(10),\n                        sinkString,\n                        resultQuery.getString(14),\n                        getSSCHyperLink(resultQuery.getString(1), resultQuery.getString(3)));\n                    try {\n                        fileDesc.write(csv_data);\n                        if (verbose) {\n                            System.out.println(csv_data);\n                        }\n                        listCount += 1;\n                    } catch (IOException e) {\n                        System.err.println(\"ERROR: fileDesc.write - \" + e.getMessage());\n                        e.printStackTrace();\n                    }\n                }\n            }\n        } catch (SQLException e) {\n            System.err.println(\"ERROR: resultQuery.getString - \" + e.getMessage());\n            e.printStackTrace();\n        }\n\n        return listCount;\n    }\n\n    \/**\n     **********************************************************\n     * SQL \ucffc\ub9ac \uacb0\uacfc\ub97c CSV \ud30c\uc77c\ub85c \uc800\uc7a5\n     **********************************************************\n     *\/\n    public static int csvWrite(ResultSet resultQuery) {\n        FileWriter fileDesc = null;\n        int listCount;\n\n        try {\n            fileDesc = new FileWriter(thisAppName + \".csv\");\n        } catch (IOException e) {\n            System.err.println(\"ERROR:\" + e.getMessage());\n            e.printStackTrace();\n        }\n        csvWriteTitle(fileDesc);\n\n        listCount = csvWriteList(resultQuery, fileDesc);\n        try {\n            fileDesc.close();\n        } catch (IOException e) {\n            System.err.println(\"ERROR:\" + e.getMessage());\n            e.printStackTrace();\n        }\n\n        return listCount;\n    }\n\n    \/**\n     **********************************************************\n     * excel \ud30c\uc77c\uc5d0 \ud0c0\uc774\ud2c0 \uc904\uc744 \uc368 \ub123\ub294\ub2e4.\n     **********************************************************\n     *\/\n    public static int xlsWriteTitle(XSSFWorkbook xlsWorkBook, XSSFSheet xlsSheet) {\n        int rowCount = 0;\n        CellStyle cellStyle1 = xlsWorkBook.createCellStyle();\n        CellStyle cellStyle2 = xlsWorkBook.createCellStyle();\n        CellStyle cellStyle3 = xlsWorkBook.createCellStyle();\n        XSSFFont cellFont1 = xlsWorkBook.createFont();\n        XSSFFont cellFont2 = xlsWorkBook.createFont();\n        XSSFFont cellFont3 = xlsWorkBook.createFont();\n        Map&lt;String, Object[]> titleData = new TreeMap&lt;>();\n\n        \/\/ \uc81c\ubaa9\n        cellFont1.setFontHeightInPoints((short) 12);\n        cellFont1.setFontName(\"Gulim\");\n        cellFont1.setBold(true);\n        cellFont1.setColor(HSSFColor.HSSFColorPredefined.BLACK.getIndex());\n\n        \/\/ \uc8fc\uc758 \uc0ac\ud56d\n        cellFont2.setFontHeightInPoints((short) 9);\n        cellFont2.setFontName(\"Gulim\");\n        cellFont2.setBold(false);\n        cellFont2.setColor(HSSFColor.HSSFColorPredefined.RED.getIndex());\n\n        \/\/ \uceec\ub7fc \uba85\n        cellFont3.setFontHeightInPoints((short) 9);\n        cellFont3.setFontName(\"Gulim\");\n        cellFont3.setBold(true);\n        cellFont3.setColor(HSSFColor.HSSFColorPredefined.BLACK.getIndex());\n\n        cellStyle1.setFont(cellFont1);\n        cellStyle1.setWrapText(false);\n        cellStyle2.setFont(cellFont2);\n        cellStyle2.setWrapText(false);\n        cellStyle3.setFont(cellFont3);\n        cellStyle3.setWrapText(false);\n\n        \/\/ \uc81c\ubaa9 \ucd94\uac00\n        cellStyle1.setFont(cellFont1);\n        XSSFRow titleRow1 = xlsSheet.createRow(rowCount++);\n        Cell titleCell1 = titleRow1.createCell(0);\n        titleCell1.setCellStyle(cellStyle1);\n        titleCell1.setCellValue(propMap.get(\"title\"));\n\n        \/\/ \uc8fc\uc758 \uc0ac\ud56d\n        XSSFRow titleRow2 = xlsSheet.createRow(rowCount++);\n        Cell titleCell2 = titleRow2.createCell(0);\n        titleCell2.setCellStyle(cellStyle2);\n        titleCell2.setCellValue(\"(**) \" + propMap.get(\"ssc_url\") + \" \uc5d0 \uc0ac\ubc88\uc73c\ub85c \ub85c\uadf8\uc778 \ud6c4 HYPER_LINK\ub97c \ud074\ub9ad\ud558\uba74 \uc0c1\uc138 \ub0b4\uc6a9 \ud655\uc778\uc774 \uac00\ub2a5 \ud569\ub2c8\ub2e4.\");\n\n        titleData.put(\"1\", new Object[]{\"ID\", \"APPLICATION\", \"VERSION\", \"FRIORITY\", \"KINGDOM\", \"ISSUE_TYPE\", \"ISSUE_SUBTYPE\", \"FILE\", \"FUNCTION(PACKAGE|CLASS|METHOD)\", \"LINE\", \"HYPER_LINK\"});\n\n        \/\/ data\uc5d0\uc11c keySet\ub97c \uac00\uc838\uc628\ub2e4. \uc774 Set \uac12\ub4e4\uc744 \uc870\ud68c\ud558\uba74\uc11c \ub370\uc774\ud130\ub4e4\uc744 sheet\uc5d0 \uc785\ub825\ud55c\ub2e4.\n        Set&lt;String> titleKeySet = titleData.keySet();\n        int rowNum = rowCount++;\n\n        \/\/ \uc54c\uc544\uc57c\ud560 \uc810\uc740 TreeMap\uc744 \ud1b5\ud574 \uc0dd\uc131\ub41c keySet\ub294 for\ub97c \uc870\ud68c \uc2dc, \ud0a4 \uac12\uc774 \uc624\ub984\ucc28\uc21c\uc73c\ub85c \uc870\ud68c\ub41c\ub2e4.\n        for (String keyString : titleKeySet) {\n            Row rowValue = xlsSheet.createRow(rowNum++);\n            Object[] cellObjectArr = titleData.get(keyString);\n            int cellNum = 0;\n            for (Object cellObject : cellObjectArr) {\n                Cell cellVaule = rowValue.createCell(cellNum++);\n                if (cellObject instanceof String) {\n                    cellVaule.setCellValue((String)cellObject);\n                } else if (cellObject instanceof Integer) {\n                    cellVaule.setCellValue((Integer)cellObject);\n                }\n                cellVaule.setCellStyle(cellStyle3);\n            }\n        }\n\n        return 0;\n    }\n\n    \/**\n     **********************************************************\n     * excel \ud30c\uc77c\uc5d0 \ubaa9\ub85d\uc744 \uc791\uc131\ud55c\ub2e4.\n     **********************************************************\n     *\/\n    public static int xlsWriteList(ResultSet resultQuery, XSSFWorkbook xlsWorkBook, XSSFSheet xlsSheet) {\n        int listCount = 0;\n        boolean isWrite = false;\n        String sinkString = null;\n        CreationHelper createHelper = xlsWorkBook.getCreationHelper();\n        CellStyle cellStyle = xlsWorkBook.createCellStyle();\n        XSSFFont cellFont = xlsWorkBook.createFont();\n        Map&lt;String, Object[]> titleData = new TreeMap&lt;>();\n\n        cellFont.setFontHeightInPoints((short) 9); \/\/ \ud3f0\ud2b8 \ud06c\uae30\n        cellFont.setFontName(\"Gulim\");             \/\/ \ud3f0\ud2b8\n        cellStyle.setFont(cellFont);\n        cellStyle.setWrapText(true);\n\n        try {\n            while (resultQuery.next()) {\n                \/\/ \uc9c0\uc815\ub41c \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ubc88\ud638\uac00 \uc788\uc73c\uba74 \uadf8\uac83\ub9cc \ucd9c\ub825\n                isWrite = false;\n                if (isAllApplications) {\n                    isWrite = true;\n                } else {\n                    if (applicationID.equals(resultQuery.getString(1))) {\n                        isWrite = true;\n                    }\n                }\n\n                if (isWrite) {\n                    \/\/ \ud568\uc218\uba85 \ubb38\uc790\uc5f4 \uc644\uc131\n                    sinkString = resultQuery.getString(11) + \"|\" + resultQuery.getString(12) + \"|\" + resultQuery.getString(13);\n\n                    \/\/ SSC \ud558\uc774\ud37c \ub9c1\ud06c \uc0dd\uc131\n                    XSSFHyperlink sscHyperLink = (XSSFHyperlink)createHelper.createHyperlink(HyperlinkType.URL);\n                    sscHyperLink.setAddress(getSSCHyperLink(resultQuery.getString(1), resultQuery.getString(3)));\n\n                    titleData.put(\"1\", new Object[]{\n                        resultQuery.getString(2),\n                        resultQuery.getString(4),\n                        resultQuery.getString(5),\n                        resultQuery.getString(6),\n                        resultQuery.getString(7),\n                        resultQuery.getString(8),\n                        resultQuery.getString(9),\n                        resultQuery.getString(10),\n                        sinkString,\n                        resultQuery.getString(14),\n                        \"View\"\n                        });\n\n                    \/\/ data\uc5d0\uc11c keySet\ub97c \uac00\uc838\uc628\ub2e4. \uc774 Set \uac12\ub4e4\uc744 \uc870\ud68c\ud558\uba74\uc11c \ub370\uc774\ud130\ub4e4\uc744 sheet\uc5d0 \uc785\ub825\ud55c\ub2e4.\n                    Set&lt;String> titleKeySet = titleData.keySet();\n                    int rowNum = listCount + 3;\n\n                    \/\/ \uc54c\uc544\uc57c\ud560 \uc810\uc740 TreeMap\uc744 \ud1b5\ud574 \uc0dd\uc131\ub41c keySet\ub294 for\ub97c \uc870\ud68c \uc2dc, \ud0a4 \uac12\uc774 \uc624\ub984\ucc28\uc21c\uc73c\ub85c \uc870\ud68c\ub41c\ub2e4.\n                    for (String keyString : titleKeySet) {\n                        Row rowValue = xlsSheet.createRow(rowNum++);\n                        Object[] cellObjectArr = titleData.get(keyString);\n                        int cellNum = 0;\n                        if (verbose) {\n                            System.out.printf(\"Writing excel row %d\\n\", listCount);\n                        }\n                        for (Object cellObject : cellObjectArr) {\n                            Cell cellVaule = rowValue.createCell(cellNum++);\n                            if (cellObject instanceof String) {\n                                cellVaule.setCellValue((String)cellObject);\n                            } else if (cellObject instanceof Integer) {\n                                cellVaule.setCellValue((Integer)cellObject);\n                            }\n                            \/\/ \ub9c1\ud06c \uc801\uc6a9\n                            if (cellNum == 11) {\n                                cellVaule.setHyperlink(sscHyperLink);\n                            }\n                            \/\/ \uc140 \uc2a4\ud0c0\uc77c \uc801\uc6a9\n                            cellVaule.setCellStyle(cellStyle);\n                            \/\/ \uc790\ub3d9 \uceec\ub7fc\ub113\uc774 \uc801\uc6a9\n                            xlsSheet.autoSizeColumn(cellNum);\n                        }\n                    }\n                    listCount += 1;\n                }\n            }\n        } catch (SQLException e) {\n            System.err.println(\"ERROR: resultQuery.getString - \" + e.getMessage());\n            e.printStackTrace();\n        }\n\n        return listCount;\n    }\n\n    \/**\n     **********************************************************\n     * SQL \ucffc\ub9ac \uacb0\uacfc\ub97c excel \ud30c\uc77c\ub85c \uc800\uc7a5\n     **********************************************************\n     *\/\n    public static int xlsWrite(ResultSet resultQuery) {\n        int listCount;\n\n        \/\/ \ube48 Workbook \uc0dd\uc131\n        XSSFWorkbook xlsWorkBook = new XSSFWorkbook();\n\n        \/\/ \ube48 Sheet\ub97c \uc0dd\uc131\n        XSSFSheet xlsSheet = xlsWorkBook.createSheet(\"Fortify Report\");\n        xlsWriteTitle(xlsWorkBook, xlsSheet);\n        listCount = xlsWriteList(resultQuery, xlsWorkBook, xlsSheet);\n\n        try {\n            FileOutputStream fileDesc = new FileOutputStream(thisAppName + \".xls\");\n            xlsWorkBook.write(fileDesc);\n            fileDesc.close();\n        } catch (IOException e) {\n            System.err.println(\"ERROR:\" + e.getMessage());\n            e.printStackTrace();\n        }\n\n        return listCount;\n    }\n\n    \/**\n     **********************************************************\n     * DB\uc5d0 \uc811\uc18d\ud558\uc5ec SQL\ubb38\uc744 \uc2e4\ud589\ud55c\ub2e4.\n     **********************************************************\n     *\/\n    public static int runSQLQuery() {\n        Connection conn = null;\n        Statement stmt = null;\n        ResultSet resultQuery = null;\n        String sqlQueryString = null;\n        int resultCount = 0;\n\n        \/\/ DB \uc885\ub958\uc5d0 \ub9de\ub294 JDBC \ub3d9\uc801 \ub85c\ub529\n        try {\n            Class.forName(propMap.get(\"jdbc_class_name\"));\n        } catch (ClassNotFoundException e) {\n            System.err.println(\"ERROR: Class.forName - \" + e.getMessage());\n            e.printStackTrace();\n        }\n\n        \/\/ DB \uc811\uc18d\n        try {\n            conn = DriverManager.getConnection(\n                propMap.get(\"db_jdbc_addr\") + propMap.get(\"db_name\"),\n                propMap.get(\"db_id\"),\n                propMap.get(\"db_pw\"));\n        } catch (SQLException e) {\n            System.err.println(\"ERROR: DriverManager.getConnection - \" + e.getMessage());\n            e.printStackTrace();\n        }\n\n        \/\/ SQL \uc791\uc131 \ubc0f \uc2e4\ud589\n        try {\n            stmt = conn.createStatement();\n            sqlQueryString = getSQLString(\"mysql\");\n            System.out.println(\"-- SQL:\\n\" + sqlQueryString + \"\\n\");\n            resultQuery = stmt.executeQuery(sqlQueryString);\n            switch (propMap.get(\"report_type\")) {\n                case \"csv\":\n                    resultCount = csvWrite(resultQuery);\n                    break;\n                case \"xls\":\n                    resultCount = xlsWrite(resultQuery);\n                    break;\n                default:\n                    System.err.println(\"ERROR: Unknown report type.\");\n            }\n            resultQuery.close();\n            stmt.close();\n            conn.close();\n        } catch (SQLException e) {\n            System.err.println(\"ERROR: executeQuery - \" + e.getMessage());\n            e.printStackTrace();\n        }\n\n        return resultCount;\n    }\n\n    \/**\n     **********************************************************\n     * main\n     **********************************************************\n     *\/\n    public static void main(String[] args) throws Exception {\n        int arg1, resultCount = 0;\n        String propFileName = \"ssc_info.conf\";\n\n        parseCommandLine(args);\n        readPropertyFile(propFileName);\n        if (applicationID != \"0\") {\n            System.out.printf(\"APPLICATION ID: %s\\n\", applicationID);\n        }\n        resultCount = runSQLQuery();\n        System.out.println(\"Issue total: \" + resultCount + \"\\n\");\n    }\n}\n<\/pre>\n\n\n\n<p>ssc_info.conf<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"ini\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># MySQL\ntitle=FORTIFY REPORT\ndb_type=mysql\ndb_jdbc_addr=jdbc:mysql:\/\/10.10.10.149:3306\ndb_name=\/db_ssc_2222\ndb_id=u_ssc\ndb_pw=&lt;Password>\njdbc_class_name=com.mysql.cj.jdbc.Driver\nreport_type=xls\nssc_url=http:\/\/10.10.10.43:8080\/ssc\nfilterset=32142c2d-3f7f-4863-a1bf-9b1e2f34d2ed\ngroupingtype=11111111-1111-1111-1111-111111111165\norderby=friority\n\n# Microsoft SQL\n#title=FORTIFY REPORT\n#db_type=mssql\n#db_jdbc_addr=jdbc:sqlserver:\/\/10.10.10.105;\n#db_name=DatabaseName=db_ssc_2020\n#db_id=sa\n#db_pw=&lt;Password>\n#jdbc_class_name=com.microsoft.sqlserver.jdbc.SQLServerDriver\n#report_type=csv\n#ssc_url=http:\/\/10.10.10.43:8080\/ssc\n#filterset=32142c2d-3f7f-4863-a1bf-9b1e2f34d2ed\n#groupingtype=11111111-1111-1111-1111-111111111165\n#orderby=friority\n\n# Oracle\n#title=FORTIFY REPORT\n#db_type=oracle\n#db_jdbc_addr=jdbc:oracle:thin:@10.10.10.105:1521\n#db_name=\/ORCLCDB\n#db_id=u_ssc_2310\n#db_pw=&lt;Password>\n#jdbc_class_name=oracle.jdbc.driver.OracleDriver\n#report_type=csv\n#ssc_url=http:\/\/10.10.10.43:8080\/ssc\n#filterset=32142c2d-3f7f-4863-a1bf-9b1e2f34d2ed\n#groupingtype=11111111-1111-1111-1111-111111111165\n#orderby=friority<\/pre>\n\n\n\n<p>RUN.BAT<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bat\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@ECHO OFF\nREM ########################################################################\nREM #\nREM # fortify_ssc_report\uc758 \uc708\ub3c4\uc6b0\uc6a9 \uc2e4\ud589 \uc2a4\ud06c\ub9bd\ud2b8\nREM #\nREM ########################################################################\n\nREM =======================================\nREM = CODEPAGE\ub97c UTF-8\ub85c \ubcc0\uacbd\nREM =======================================\nCHCP 65001 1> NUL 2> NUL\nCLS\n\nREM ########################################################################\nREM #\nREM # \ud658\uacbd \ubcc0\uc218 \uc124\uc815 (\uccab \uc2e4\ud589\uc2dc \ubc18\ub4dc\uc2dc \ud658\uacbd\uc5d0 \ub9de\uac8c \uc218\uc815\uc694\ub9dd)\nREM # \uc708\ub3c4\uc6b0 \uc2a4\ucf00\uc904\ub7ec \uc2e4\ud589\uc744 \uc704\ud574\uc11c\ub294 WORK_PATH\uc5d0 \uc808\ub300 \uacbd\ub85c \uc124\uc815\nREM #\nREM ########################################################################\nSET CLASS_NAME1=fortify_ssc_report\nSET RUN_COMPILE=1\nSET \"WORK_PATH=%CD%\"\nSET \"CSV_RESULT_PATH=%WORK_PATH%\\reports\"\nSET \"JAVA_HOME=C:\\PortableApps\\jdk-17.0.9\"\nSET \"CLASSPATH=.;%WORK_PATH%\\lib\\*\"\nSET \"CURRENT_DIR=%CD%\"\n\nCD \/D \"%WORK_PATH%\"\nIF NOT EXIST %CSV_RESULT_PATH% MKDIR %CSV_RESULT_PATH%\nREM ########################################################################\nREM #\nREM # \ub0a0\uc9dc\/\uc2dc\uac04 \ubb38\uc790\uc5f4 \ub9cc\ub4e4\uae30\nREM #\nREM ########################################################################\nSET TIMESTAMP_VAL=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%_%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%\nSET TIMESTAMP_VAL=%TIMESTAMP_VAL: =0%\n\nREM ########################################################################\nREM #\nREM # JDK \uacbd\ub85c \ucd94\uac00\nREM #\nREM ########################################################################\nSET PATH=%JAVA_HOME%\\bin;%PATH%\n\nREM ########################################################################\nREM #\nREM # \ube4c\ub4dc \ubc0f \uc2e4\ud589\nREM #\nREM ########################################################################\nIF %RUN_COMPILE% == 1 (\n  javac -encoding utf-8 -cp \"%CLASSPATH%\" \"%CLASS_NAME1%.java\"\n)\nECHO.\nECHO Running %CLASS_NAME1%...\nECHO.\njava -cp \"%CLASSPATH%\" \"%CLASS_NAME1%\" %1 %2 %3 %4 %5\n\nREM ########################################################################\nREM #\nREM # \ucd9c\ub825\ub41c CSV \ud30c\uc77c\uc744 \ub9ac\ud3ec\ud2b8 \ub514\ub809\ud1a0\ub9ac\ub85c \uc774\ub3d9\uc2dc\ud0a8\ub2e4.\nREM #\nREM ########################################################################\nMOVE \/Y \"%CLASS_NAME1%.xls\" \"%CSV_RESULT_PATH%\\%TIMESTAMP_VAL%-%CLASS_NAME1%.xls\"\n<\/pre>\n\n\n\n<p>run.sh<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#!\/bin\/bash\n########################################################################\n#\n# fortify_ssc_report\uc758 \ub9ac\ub205\uc2a4\uc6a9 \uc2e4\ud589 \uc2a4\ud06c\ub9bd\ud2b8\n#\n########################################################################\n\n########################################################################\n#\n# \ud658\uacbd \ubcc0\uc218 \uc124\uc815 (\uccab \uc2e4\ud589\uc2dc \ubc18\ub4dc\uc2dc \ud658\uacbd\uc5d0 \ub9de\uac8c \uc218\uc815\uc694\ub9dd)\n# crontab \uc2e4\ud589\uc744 \uc704\ud574\uc11c\ub294 WORK_PATH\uc5d0 \uc808\ub300 \uacbd\ub85c \uc124\uc815\n#\n########################################################################\nCLASS_NAME1=\"fortify_ssc_report\"\nRUN_COMPILE=1\nWORK_PATH=`pwd -P`\nCSV_RESULT_PATH=\"${WORK_PATH}\/reports\"\nJAVA_HOME=\"\/usr\"\nCLASSPATH=\".:${JAVA_HOME}\/lib\/tools.jar:${WORK_PATH}\/lib\/*\"\nCURRENT_DIR=`pwd -P`\nDATETIME_STR=`date -u +%Y%m%d_%H%M%S`\n\nrun_class ()\n{\n  ########################################################################\n  #\n  # \ube4c\ub4dc \ubc0f \uc2e4\ud589\n  #\n  ########################################################################\n  if [ ${RUN_COMPILE} = 1 ]\n  then\n    javac -encoding utf-8 -cp \"${CLASSPATH}\" ${CLASS_NAME1}.java\n  fi\n  echo\n  echo \"Running ${CLASS_NAME1}...\"\n  echo\n  java -cp \"${CLASSPATH}\" ${CLASS_NAME1} $1 $2 $3 $4 $5\n  ########################################################################\n  #\n  # \ucd9c\ub825\ub41c CSV \ud30c\uc77c\uc744 \ub9ac\ud3ec\ud2b8 \ub514\ub809\ud1a0\ub9ac\ub85c \uc774\ub3d9\uc2dc\ud0a8\ub2e4.\n  #\n  ########################################################################\n  OUTPUT_FILE=\"${CSV_RESULT_PATH}\/${DATETIME_STR}-${CLASS_NAME1}.xls\"\n  if [ -f \"${CLASS_NAME1}.xls\" ]\n  then\n    #iconv -f \"UTF-8\" -t \"EUC-KR\" \"${CLASS_NAME1}.csv\" > \"${OUTPUT_FILE}\"\n    #rm -f \"${CLASS_NAME1}.csv\"\n    mv -fv \"${CLASS_NAME1}.xls\" \"${OUTPUT_FILE}\"\n  fi\n  if [ -f \"${OUTPUT_FILE}\" ]\n  then\n    chmod 644 \"${OUTPUT_FILE}\"\n  fi\n}\n\nif [ ! -d \"${WORK_PATH}\" ]\nthen\n  mkdir -p \"${WORK_PATH}\"\nfi\n\nif [ ! -d \"${CSV_RESULT_PATH}\" ]\nthen\n  mkdir -p \"${CSV_RESULT_PATH}\"\nfi\n\n########################################################################\n#\n# \uae30\ub2a5\ubcc4\ub85c \ud558\ub098\uc529 \uc2e4\ud589 (\ubcc0\uc218 \uc815\uc758\ub97c \uc8fc\uc11d\ucc98\ub9ac \ud558\uba74 \uae30\ub2a5 \ube44 \ud65c\uc131\ud654)\n#\n########################################################################\ncd \"${WORK_PATH}\"\nPATH=${JAVA_HOME}\/bin:${JAVA_HOME}\/jre\/bin:${PATH}\ncd ${WORK_PATH}\nrun_class $1 $2 $3 $4 $5\n\ncd ${CURRENT_DIR}\nexit $?<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>fortify_ssc_report.java ssc_info.conf RUN.BAT run.sh<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"set","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[66],"tags":[],"class_list":["post-8097","post","type-post","status-publish","format-standard","hentry","category-computing_fortify"],"_links":{"self":[{"href":"https:\/\/hasu0707.duckdns.org\/blog\/index.php?rest_route=\/wp\/v2\/posts\/8097","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hasu0707.duckdns.org\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hasu0707.duckdns.org\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hasu0707.duckdns.org\/blog\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/hasu0707.duckdns.org\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=8097"}],"version-history":[{"count":0,"href":"https:\/\/hasu0707.duckdns.org\/blog\/index.php?rest_route=\/wp\/v2\/posts\/8097\/revisions"}],"wp:attachment":[{"href":"https:\/\/hasu0707.duckdns.org\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=8097"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hasu0707.duckdns.org\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=8097"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hasu0707.duckdns.org\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=8097"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}