Esempio n. 1
0
class HistoryItem(object):
    '''Represents history item.'''

    _db = None
    _dataTable = 'data_table'
    _columns = [
        ('id','integer'), ('url', 'text'), ('code', 'integer'),
        ('tag', 'text'), ('mark', 'integer'), ('info', 'text'),
        ('time', 'float'), ('msg', 'text'), ('content_type', 'text'),
        ('charset', 'text'), ('method', 'text'), ('response_size', 'integer'),
        ('codef', 'integer'), ('alias', 'text'), ('has_qs', 'integer')
    ]
    _primaryKeyColumns = ('id',)
    _indexColumns = ('alias',)
    id = None
    _request = None
    _response = None
    info = None
    mark = False
    tag = ''
    contentType= ''
    responseSize = 0
    method = 'GET'
    msg = 'OK'
    code = 200
    time = 0.2

    def __init__(self):
        '''Construct object.'''
        self._border = '-#=' * 20
        self._ext = '.trace'
        if not kb.kb.getData('history', 'db') == []:
            self._db = kb.kb.getData('history', 'db')
            self._sessionDir = kb.kb.getData('history', 'sessionDir')
        else:
            self.initStructure()

    @property
    def response(self):
        resp = self._response
        if not resp and self.id:
            self._request, resp = self._loadFromFile(self.id)
            self._response = resp
        return resp
    
    @response.setter
    def response(self, resp):
        self._response = resp
    
    @property
    def request(self):
        req = self._request
        if not req and self.id:
            req, self._response = self._loadFromFile(self.id)
            self._request = req
        return req
    
    @request.setter
    def request(self, req):
        self._request = req    
    
    def initStructure(self):
        '''Init history structure.'''
        sessionName = cf.cf.getData('sessionName')
        dbName = os.path.join(get_temp_dir(), 'db_' + sessionName)
        self._db = DB()
        # Check if the database already exists
        if os.path.exists(dbName):
            # Find one that doesn't exist
            for i in xrange(100):
                newDbName = dbName + '-' + str(i)
                if not os.path.exists(newDbName):
                    dbName = newDbName
                    break
        self._db.connect(dbName)
        self._sessionDir = os.path.join(get_temp_dir(),
                                        self._db.getFileName() + '_traces')
        tablename = self.getTableName()
        # Init tables
        self._db.createTable(
                tablename,
                self.getColumns(),
                self.getPrimaryKeyColumns())
        self._db.createIndex(tablename, self.getIndexColumns())
        # Init dirs
        try:
            os.mkdir(self._sessionDir)
        except OSError, oe:
            # [Errno EEXIST] File exists
            if oe.errno != EEXIST:
                msg = 'Unable to write to the user home directory: ' + get_temp_dir()
                raise w3afException(msg)
        kb.kb.save('history', 'db', self._db)
        kb.kb.save('history', 'sessionDir', self._sessionDir)