(self, bruteForce=None)
| 114 | return kb.data.cachedDbs |
| 115 | |
| 116 | def getTables(self, bruteForce=None): |
| 117 | if len(kb.data.cachedTables) > 0: |
| 118 | return kb.data.cachedTables |
| 119 | |
| 120 | self.forceDbmsEnum() |
| 121 | |
| 122 | if conf.db == CURRENT_DB: |
| 123 | conf.db = self.getCurrentDb() |
| 124 | |
| 125 | if conf.db: |
| 126 | dbs = conf.db.split(',') |
| 127 | else: |
| 128 | dbs = self.getDbs() |
| 129 | |
| 130 | for db in dbs: |
| 131 | dbs[dbs.index(db)] = safeSQLIdentificatorNaming(db) |
| 132 | |
| 133 | dbs = [_ for _ in dbs if _] |
| 134 | |
| 135 | infoMsg = "fetching tables for database" |
| 136 | infoMsg += "%s: %s" % ("s" if len(dbs) > 1 else "", ", ".join(db if isinstance(db, six.string_types) else db[0] for db in sorted(dbs))) |
| 137 | logger.info(infoMsg) |
| 138 | |
| 139 | if any(isTechniqueAvailable(_) for _ in (PAYLOAD.TECHNIQUE.UNION, PAYLOAD.TECHNIQUE.ERROR, PAYLOAD.TECHNIQUE.QUERY)) or conf.direct: |
| 140 | blinds = [False, True] |
| 141 | else: |
| 142 | blinds = [True] |
| 143 | |
| 144 | rootQuery = queries[DBMS.SYBASE].tables |
| 145 | |
| 146 | for db in dbs: |
| 147 | for blind in blinds: |
| 148 | query = rootQuery.inband.query % db |
| 149 | retVal = pivotDumpTable("(%s) AS %s" % (query, kb.aliasName), ['%s.name' % kb.aliasName], blind=blind, alias=kb.aliasName) |
| 150 | |
| 151 | if retVal: |
| 152 | for table in next(six.itervalues(retVal[0])): |
| 153 | if db not in kb.data.cachedTables: |
| 154 | kb.data.cachedTables[db] = [table] |
| 155 | else: |
| 156 | kb.data.cachedTables[db].append(table) |
| 157 | break |
| 158 | |
| 159 | for db, tables in kb.data.cachedTables.items(): |
| 160 | kb.data.cachedTables[db] = sorted(tables) if tables else tables |
| 161 | |
| 162 | return kb.data.cachedTables |
| 163 | |
| 164 | def getColumns(self, onlyColNames=False, colTuple=None, bruteForce=None, dumpMode=False): |
| 165 | self.forceDbmsEnum() |
no test coverage detected