This file is indexed.

/usr/share/pyshared/weboob/capabilities/messages.py is in python-weboob-core 0.g-1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
# -*- coding: utf-8 -*-

# Copyright(C) 2010-2011 Romain Bignon
#
# This file is part of weboob.
#
# weboob is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# weboob is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with weboob. If not, see <http://www.gnu.org/licenses/>.


import datetime
import time

from .base import IBaseCap, CapBaseObject, NotLoaded, Field, StringField, \
                  DateField, IntField, UserError


__all__ = ['Thread', 'Message', 'ICapMessages', 'CantSendMessage', 'ICapMessagesPost']


# Message and Thread's attributes refer to themselves, and it isn't possible
# in python, so these base classes are used instead.
class _Message(CapBaseObject):
    """ Base message. """
    pass


class _Thread(CapBaseObject):
    """ Base Thread. """
    pass


class Message(_Message):
    """
    Represents a message read or to send.
    """
    IS_HTML = 0x001          # The content is HTML formatted
    IS_UNREAD = 0x002        # The message is unread
    IS_RECEIVED = 0x004       # The receiver has read this message
    IS_NOT_RECEIVED = 0x008   # The receiver has not read this message

    thread =        Field('Reference to the thread', _Thread)
    title =         StringField('Title of message')
    sender =        StringField('Author of this message')
    receivers =     Field('Receivers of the message', list)
    date =          DateField('Date when the message has been sent')
    content =       StringField('Body of message')
    signature =     StringField('Optional signature')
    parent =        Field('Parent message', _Message)
    children =      Field('Children fields', list)
    flags =         IntField('Flags (IS_* constants)', default=0)

    def __init__(self, thread, id,
                       title=NotLoaded,
                       sender=NotLoaded,
                       receivers=NotLoaded,
                       date=None,
                       parent=NotLoaded,
                       content=NotLoaded,
                       signature=NotLoaded,
                       children=NotLoaded,
                       flags=0):
        CapBaseObject.__init__(self, id)
        assert thread is not None
        self.thread = thread
        self.title = title
        self.sender = sender
        self.receivers = receivers
        self.content = content
        self.signature = signature
        self.children = children
        self.flags = flags

        if date is None:
            date = datetime.datetime.utcnow()
        self.date = date

        if isinstance(parent, Message):
            self.parent = parent
        else:
            self.parent = NotLoaded
            self._parent_id = parent

    @property
    def date_int(self):
        """
        Date of message as an integer.
        """
        return int(time.strftime('%Y%m%d%H%M%S', self.date.timetuple()))

    @property
    def full_id(self):
        """
        Full ID of message (in form '**THREAD_ID.MESSAGE_ID**')
        """
        return '%s.%s' % (self.thread.id, self.id)

    @property
    def full_parent_id(self):
        """
        Get the full ID of the parent message (in form '**THREAD_ID.MESSAGE_ID**').
        """
        if self.parent:
            return self.parent.full_id
        elif self._parent_id is None:
            return ''
        elif self._parent_id is NotLoaded:
            return NotLoaded
        else:
            return '%s.%s' % (self.thread.id, self._parent_id)

    def __eq__(self, msg):
        if not isinstance(msg, Message):
            return False

        if self.thread:
            return unicode(self.thread.id) == unicode(msg.thread.id) and \
                   unicode(self.id) == unicode(msg.id)
        else:
            return unicode(self.id) == unicode(msg.id)

    def __repr__(self):
        return '<Message id=%r title=%r date=%r from=%r>' % (
                   self.full_id, self.title, self.date, self.sender)


class Thread(_Thread):
    """
    Thread containing messages.
    """
    IS_THREADS =    0x001
    IS_DISCUSSION = 0x002

    root =      Field('Root message', Message)
    title =     StringField('Title of thread')
    date =      DateField('Date of thread')
    flags =     IntField('Flags (IS_* constants)', default=IS_THREADS)

    def iter_all_messages(self):
        """
        Iter all messages of the thread.

        :rtype: iter[:class:`Message`]
        """
        if self.root:
            yield self.root
            for m in self._iter_all_messages(self.root):
                yield m

    def _iter_all_messages(self, message):
        if message.children:
            for child in message.children:
                yield child
                for m in self._iter_all_messages(child):
                    yield m


class ICapMessages(IBaseCap):
    """
    Capability to read messages.
    """
    def iter_threads(self):
        """
        Iterates on threads, from newers to olders.

        :rtype: iter[:class:`Thread`]
        """
        raise NotImplementedError()

    def get_thread(self, id):
        """
        Get a specific thread.

        :rtype: :class:`Thread`
        """
        raise NotImplementedError()

    def iter_unread_messages(self):
        """
        Iterates on messages which hasn't been marked as read.

        :rtype: iter[:class:`Message`]
        """
        raise NotImplementedError()

    def set_message_read(self, message):
        """
        Set a message as read.

        :param message: message read (or ID)
        :type message: :class:`Message` or str
        """
        raise NotImplementedError()


class CantSendMessage(UserError):
    """
    Raised when a message can't be send.
    """


class ICapMessagesPost(IBaseCap):
    """
    This capability allow user to send a message.
    """
    def post_message(self, message):
        """
        Post a message.

        :param message: message to send
        :type message: :class:`Message`
        :raises: :class:`CantSendMessage`
        """
        raise NotImplementedError()