Esempio n. 1
0
    def _getHandler(self):
        self.baseUrl = self.req.application_url + '/'
        self.httpsUrl = self.req.application_url.replace('http://', 'https://') + '/'
        self.hostName = self.req.host.rsplit(':', 1)[0]
        self.SITE = self.req.host + '/'
        self.siteHost = self.cfg.siteHost
        self.isOwner = self.userLevel == userlevels.OWNER or self.auth.admin

        # Handle messages stashed in the session
        self.infoMsg = self.session.setdefault('infoMsg', '')
        self.searchType = self.session.setdefault('searchType', getProjectText().title()+"s")
        self.searchTerms = ''
        self.errorMsgList = self._getErrors()

        # a set of information to be passed into the next handler
        context = {
            'auth':             self.auth,
            'authToken':        self.auth.getToken(),
            'client':           self.client,
            'cfg':              self.cfg,
            'db':               self.db,
            'fields':           self.fields,
            'req':              self.req,
            'response':         self.response,
            'session':          self.session,
            'siteHost':         self.cfg.siteHost,
            'searchType':       self.searchType,
            'searchTerms':      '',
            'toUrl':            self.req.url,
            'baseUrl':          self.baseUrl,
            'basePath':         self.basePath,
            'httpsUrl':         self.httpsUrl,
            'hostName':         self.hostName,
            'project':          None,
            'SITE':             self.SITE,
            'userLevel':        self.userLevel,
            'user':             self.user,
            'isOwner':          self.isOwner,
            'infoMsg':          self.infoMsg,
            'errorMsgList':     self.errorMsgList,
            'output':           self.output,
            'remoteIp':         self.req.client_addr,
            'reposShim':        self.reposShim,
        }

        # match the requested url to the right url handler
        for match, urlHandler in [
                ('admin', self.adminHandler),
                ('administer', self.adminHandler),
                ('unknownError', self.errorHandler),
                ]:
            if self.req.path_info_peek() == match:
                self.req.path_info_pop()
                break
        else:
            urlHandler = self.siteHandler
        context['cmd'] = self.req.path_info
        return urlHandler.handle(context)
Esempio n. 2
0
    def external(self, auth):
        pText = getProjectText().title()
        regColumns = ['%s Name'%pText, 'Mirrored']
        regRows = []

        # iterate through all projects, set up the
        # regular project rows, and save the mirrored
        # projects for later.

        # NB: It would be great to not have to reach around the XMLRPC layer
        # here, but the old way scales very poorly (>30s on rBO w/ 12000
        # projects).
        mirroredProjects = []
        for repos in self.client.server._server.reposMgr.iterRepositories(
                'external'):
            project = self.client.getProject(repos.projectId)
            mirrored = self.client.getInboundMirror(project.id)

            if not mirrored:
                data = [('editExternal?projectId=%s' % project.id, project.name),
                        bool(mirrored) and 'Yes' or 'No']
                regRows.append({'columns': data})
            else:
                mirroredProjects.append((project, mirrored))

        # set up the mirrored projects list
        mirroredProjects.sort(key = lambda x: x[1]['mirrorOrder'])
        mirrorColumns = ['Mirrored %s Name'%pText, 'Order']
        mirrorRows = []
        for i, (project, mirrored) in enumerate(mirroredProjects):
            orderHtml = self._makeMirrorOrderingLinks("InboundMirror",
                len(mirroredProjects), mirrored['mirrorOrder'], i, mirrored['inboundMirrorId'])
            data = [('editExternal?projectId=%s' % project.id, project.name), orderHtml]
            mirrorRows.append({'columns': data})

        return self._write('admin/external',
            regColumns = regColumns, regRows = regRows,
            mirrorColumns = mirrorColumns, mirrorRows = mirrorRows)
Esempio n. 3
0
    def _validateExternalProject(self, name, hostname, label, url,
                        externalUser, externalPass,
                        externalEntKey,
                        useMirror, authType,
                        additionalLabelsToMirror, allLabels, backupExternal):
        additionalLabels = []
        extLabel = ""
        pText = getProjectText().lower()

        # Validate simple parameters
        if not name:
            self._addErrors("Missing %s title"%pText)
        if not hostname:
            self._addErrors("Missing %s name"%pText)
        if not label:
            self._addErrors("Missing %s label"%pText)
        else:
            try:
                extLabel = versions.Label(label)
            except versions.ParseError:
                self._addErrors("Invalid label %s" % label)

        if self._getErrors():
            return None, None

        # Parse and check additional labels
        if useMirror == 'net' and additionalLabelsToMirror:
            for l in additionalLabelsToMirror.split():
                # skip a redundant label specification
                if l != label:
                    try:
                        versions.Label(l)
                        additionalLabels.append(l)
                    except versions.ParseError:
                        self._addErrors("Invalid additional label %s" % l)

        # Check authentication data
        if authType != 'none':
            if authType == 'userpass':
                if not externalUser:
                    self._addErrors("Missing username for local mirror authentication")
                if not externalPass:
                    self._addErrors("Missing password for local mirror authentication")
            elif authType == 'entitlement':
                if not externalEntKey:
                    self._addErrors('Missing entitlement key for local mirror authentication')
                else:
                    # Test that the entitlement is valid
                    cfg = conarycfg.ConaryConfiguration()
                    if url:
                        cfg.configLine('repositoryMap %s %s' % (extLabel.host,
                                                                url))

                    cfg.entitlement.addEntitlement(extLabel.host, externalEntKey)
                    cfg = configureClientProxies(cfg, False, self.cfg.proxy)
                    nc = conaryclient.ConaryClient(cfg).getRepos()
                    try:
                        # use 2**64 to ensure we won't make the server do much
                        nc.getNewTroveList(extLabel.host, '4611686018427387904')
                    except errors.InsufficientPermission:
                        self._addErrors("Entitlement does not grant mirror access to external repository")
                    except errors.OpenError, e:
                        if url:
                            self._addErrors("Error contacting remote repository. Please ensure entitlement and repository URL are correct. (%s)" % str(e))
                        else:
                            self._addErrors("Error contacting remote repository. Please ensure entitlement is correct. (%s)" % str(e) )
Esempio n. 4
0
    def processAddExternal(self, name, hostname, label, url,
                        externalUser, externalPass,
                        externalEntKey,
                        useMirror, authType, additionalLabelsToMirror,
                        projectId, allLabels, backupExternal, backgroundMirror,
                        *args, **kwargs):


        # strip extraneous whitespace
        externalEntKey = externalEntKey.strip()

        kwargs = {'name': name, 'hostname': hostname, 'label': label,
            'url': url, 'authType': authType, 'externalUser': externalUser,
            'externalPass': externalPass,
            'externalEntKey': externalEntKey,
            'useMirror': useMirror,
            'additionalLabelsToMirror': additionalLabelsToMirror,
            'allLabels': allLabels,
            'backupExternal': backupExternal,
            }

        editing = (projectId != -1)
        externalAuth = (authType != 'none')

        additionalLabels, extLabel = self._validateExternalProject(**kwargs)
        if not self._getErrors():
            if not editing:
                projectId = self.client.newExternalProject(name, hostname,
                    self.cfg.projectDomainName, label, url, useMirror == 'net')

            project = self.client.getProject(projectId)
            if editing:
                project.editProject(project.projecturl, project.description, name)
            project.setBackupExternal(backupExternal)

            labelIdMap = self.client.getLabelsForProject(projectId)[0]
            label, labelId = labelIdMap.items()[0]

            if not url and not externalAuth:
                url = "http://%s/conary/" % extLabel.getHost()
            elif not url and externalAuth:
                url = "https://%s/conary/" % extLabel.getHost()

            if not authType in ('none', 'userpass', 'entitlement'):
                raise RuntimeError, "Invalid authentication type specified"

            # set up the authentication
            project.editLabel(labelId, str(extLabel), url,
                authType, externalUser, externalPass, externalEntKey)
            inboundMirror = self.client.getInboundMirror(projectId)

            # set up the mirror, if requested
            if useMirror == 'net':
                project.editLabel(labelId, str(extLabel),
                        '', 'none', '', '', '')

                if inboundMirror and editing:
                    mirrorId = inboundMirror['inboundMirrorId']
                    self.client.editInboundMirror(mirrorId, [str(extLabel)] +
                        additionalLabels, url, authType, externalUser,
                        externalPass, externalEntKey, allLabels)
                else:
                    self.client.addInboundMirror(projectId, [str(extLabel)] +
                        additionalLabels, url, authType, externalUser,
                        externalPass, externalEntKey, allLabels)
            # remove mirroring if requested
            elif useMirror == 'none' and inboundMirror and editing:
                self.client.delInboundMirror(inboundMirror['inboundMirrorId'])

            verb = editing and "Edited" or "Added"
            self._setInfo("%s external %s %s" % (verb, getProjectText().lower(), name))
            self._redirectHttp("admin/external")
        else:
            if editing:
                return self.editExternal(projectId = projectId, **kwargs)
            else:
                return self.addExternal(**kwargs)
Esempio n. 5
0
def projectText():
    return getProjectText()