(self, bruteForce=None)
| 61 | return kb.data.cachedDbs |
| 62 | |
| 63 | def getTables(self, bruteForce=None): |
| 64 | if len(kb.data.cachedTables) > 0: |
| 65 | return kb.data.cachedTables |
| 66 | |
| 67 | self.forceDbmsEnum() |
| 68 | |
| 69 | if conf.db == CURRENT_DB: |
| 70 | conf.db = self.getCurrentDb() |
| 71 | |
| 72 | if conf.db: |
| 73 | dbs = conf.db.split(',') |
| 74 | else: |
| 75 | dbs = self.getDbs() |
| 76 | |
| 77 | for db in (_ for _ in dbs if _): |
| 78 | dbs[dbs.index(db)] = safeSQLIdentificatorNaming(db) |
| 79 | |
| 80 | infoMsg = "fetching tables for database" |
| 81 | 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))) |
| 82 | logger.info(infoMsg) |
| 83 | |
| 84 | rootQuery = queries[DBMS.MAXDB].tables |
| 85 | |
| 86 | for db in dbs: |
| 87 | query = rootQuery.inband.query % (("'%s'" % db) if db != "USER" else 'USER') |
| 88 | blind = not isTechniqueAvailable(PAYLOAD.TECHNIQUE.UNION) |
| 89 | retVal = pivotDumpTable("(%s) AS %s" % (query, kb.aliasName), ['%s.tablename' % kb.aliasName], blind=blind) |
| 90 | |
| 91 | if retVal: |
| 92 | for table in list(retVal[0].values())[0]: |
| 93 | if db not in kb.data.cachedTables: |
| 94 | kb.data.cachedTables[db] = [table] |
| 95 | else: |
| 96 | kb.data.cachedTables[db].append(table) |
| 97 | |
| 98 | for db, tables in kb.data.cachedTables.items(): |
| 99 | kb.data.cachedTables[db] = sorted(tables) if tables else tables |
| 100 | |
| 101 | return kb.data.cachedTables |
| 102 | |
| 103 | def getColumns(self, onlyColNames=False, colTuple=None, bruteForce=None, dumpMode=False): |
| 104 | self.forceDbmsEnum() |
no test coverage detected