public.py 4.16 KB
Newer Older
Antony Chazapis's avatar
Antony Chazapis committed
1
# Copyright 2011-2012 GRNET S.A. All rights reserved.
2
#
3 4 5
# Redistribution and use in source and binary forms, with or
# without modification, are permitted provided that the following
# conditions are met:
6
#
7 8 9
#   1. Redistributions of source code must retain the above
#      copyright notice, this list of conditions and the following
#      disclaimer.
10
#
11 12 13 14
#   2. Redistributions in binary form must reproduce the above
#      copyright notice, this list of conditions and the following
#      disclaimer in the documentation and/or other materials
#      provided with the distribution.
15
#
16 17 18 19 20 21 22 23 24 25 26 27
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
28
#
29 30 31 32 33 34 35
# The views and conclusions contained in the software and
# documentation are those of the authors and should not be
# interpreted as representing official policies, either expressed
# or implied, of GRNET S.A.

from dbworker import DBWorker

36 37 38 39 40
from pithos.backends.random_word import get_random_word

import logging

logger = logging.getLogger(__name__)
41 42 43

class Public(DBWorker):
    """Paths can be marked as public."""
44

45 46 47
    def __init__(self, **params):
        DBWorker.__init__(self, **params)
        execute = self.execute
48

49
        execute(""" create table if not exists public
Antony Chazapis's avatar
Antony Chazapis committed
50
                          ( public_id integer primary key autoincrement,
51
                            path      text not null,
52 53
                            active    boolean not null default 1,
                            url       text) """)
Antony Chazapis's avatar
Antony Chazapis committed
54 55
        execute(""" create unique index if not exists idx_public_path
                    on public(path) """)
56 57
        execute(""" create unique index if not exists idx_public_url
                    on public(url) """)
58

59 60
    def get_unique_url(self, public_url_security, public_url_alphabet):
        l = public_url_security
61
        while 1:
62
            candidate = get_random_word(length=l, alphabet=public_url_alphabet)
63 64 65 66
            if self.public_path(candidate) is None:
                return candidate
            l +=1

67
    def public_set(self, path, public_url_security, public_url_alphabet):
68
        q = "select public_id from public where path = ?"
69
        self.execute(q, (path,))
70 71 72 73
        row = self.fetchone()

        if not row:
            url = self.get_unique_url(
74
                public_url_security, public_url_alphabet
75
            )
76 77
            q = "insert into public(path, active, url) values(?, 1, ?)"
            self.execute(q, (path, url))
78
            logger.info('Public url set for path: %s' % path)
79

80
    def public_unset(self, path):
81
        q = "delete from public where path = ?"
82 83 84
        c = self.execute(q, (path,))
        if c.rowcount != 0:
            logger.info('Public url unset for path: %s' % path)
85

Sofia Papagiannaki's avatar
Sofia Papagiannaki committed
86 87
    def public_unset_bulk(self, paths):
        placeholders = ','.join('?' for path in paths)
88
        q = "delete from public where path in (%s)" % placeholders
Sofia Papagiannaki's avatar
Sofia Papagiannaki committed
89
        self.execute(q, paths)
90

Antony Chazapis's avatar
Antony Chazapis committed
91
    def public_get(self, path):
92
        q = "select url from public where path = ? and active = 1"
93
        self.execute(q, (path,))
Antony Chazapis's avatar
Antony Chazapis committed
94 95 96 97
        row = self.fetchone()
        if row:
            return row[0]
        return None
98

99
    def public_list(self, prefix):
100
        q = "select path, url from public where path like ? escape '\\' and active = 1"
101 102
        self.execute(q, (self.escape_like(prefix) + '%',))
        return self.fetchall()
103

Antony Chazapis's avatar
Antony Chazapis committed
104
    def public_path(self, public):
105
        q = "select path from public where url = ? and active = 1"
Antony Chazapis's avatar
Antony Chazapis committed
106 107 108 109 110
        self.execute(q, (public,))
        row = self.fetchone()
        if row:
            return row[0]
        return None