Exemplo n.º 1
0
def edit_record(request):
	loc = get_localizer(request)
	cfg = request.registry.settings
	sess = DBSession()
	csrf = request.POST.get('csrf', '')
	access_user = sess.query(AccessEntity).filter_by(nick=str(request.user)).first()
	user_domains = [d.id for d in sess.query(PDNSDomain).filter_by(account=str(request.user.id))]
	
	if csrf != request.get_csrf():
		request.session.flash({
				'text' : loc.translate(_('Error submitting form')),
				'class' : 'danger'
				})
		return HTTPSeeOther(location=request.route_url('pdns.cl.domains'))
	else:
		rectype = request.POST.get('type', None)
		if rectype == "domain":
			domain = sess.query(PDNSDomain).filter_by(id=int(request.POST.get('domainid', None))).first()
			if domain.id in user_domains:
				domain.name = request.POST.get('hostName', None)
				domain.dtype = request.POST.get('hostType', None)
				domain.master = request.POST.get('hostValue', None)

		elif rectype == "record":
			record = sess.query(PDNSRecord).filter_by(id=int(request.POST.get('recordid', None))).first()
			if record.domain_id in user_domains:
				record.name = request.POST.get('name', None)
				record.content = request.POST.get('content', None)
				record.rtype = request.POST.get('rtype', None)
				record.ttl = None if request.POST.get('ttl', None) == '' else request.POST.get('ttl', None);
				record.prio = None if request.POST.get('prio', None) == '' else request.POST.get('prio', None);
	sess.flush()
	return HTTPSeeOther(location=request.route_url('pdns.cl.domains', _query=(('sort', 'asc'),)))
Exemplo n.º 2
0
    def _wizcb_submit_hdl(wiz, em, step, act, val, req):
        xcls = cls
        if isinstance(xcls, str):
            xcls = _name_to_class(xcls)

        sess = DBSession()

        fieldIDs = json.loads(val['field_id'])
        templateName = val['template']
        templId = val['templ_id']

        for fid in fieldIDs:
            resvalue = {
                'templ_id':
                templId,
                'field_id':
                fid,
                'template':
                templateName,
                'field':
                sess.query(PDNSFieldType).filter(
                    PDNSFieldType.id == fid).first()
            }
            em = ExtModel(xcls)
            obj = xcls()
            em.set_values(obj, resvalue, req, True)
            sess.add(obj)
            sess.flush()
            print("TROLOLO")
        return {'do': 'close', 'reload': True}
Exemplo n.º 3
0
def delete_record(request):
	#if d in GET, delete domain
	#if r in GET, delete record
	#before delete check if this record exists and belongs to auth_user
	#delete and redirect to main module page 
	#use _query to add aditional params when redirecting 
	loc = get_localizer(request)
	cfg = request.registry.settings
	sess = DBSession()
	csrf = request.POST.get('csrf', '')
	access_user = sess.query(AccessEntity).filter_by(nick=str(request.user)).first()
	user_domains = [d.id for d in sess.query(PDNSDomain).filter_by(account=str(request.user.id))]
	
	if csrf != request.get_csrf():
		request.session.flash({
				'text' : loc.translate(_('Error submitting form')),
				'class' : 'danger'
				})
		return HTTPSeeOther(location=request.route_url('pdns.cl.domains'), _query=(('error', 'asc'),))
	else:
		domainid = request.POST.get('domainid', None)
		recid = request.POST.get('recordid', None)
		if domainid and not recid:
			domain = sess.query(PDNSDomain).filter_by(id=int(request.POST.get('domainid', None))).first()
			if domain.id in user_domains:
				sess.delete(domain)
				sess.flush()

		elif recid:
			record = sess.query(PDNSRecord).filter_by(id=int(request.POST.get('recordid', None))).first()
			if record.domain_id in user_domains:
				sess.delete(record)			
				sess.flush()
	
		return HTTPSeeOther(location=request.route_url('pdns.cl.domains'))
Exemplo n.º 4
0
def deleteMailBox(request):
	loc = get_localizer(request)
	cfg = request.registry.settings
	sess = DBSession()
	errmess = None
	csrf = request.POST.get('csrf', '')
	access_user = sess.query(AccessEntity).filter_by(nick=str(request.user)).first()
	if csrf != request.get_csrf():
		request.session.flash({
				'text' : loc.translate(_('Error submitting form')),
				'class' : 'danger'
				})
		return HTTPSeeOther(location=request.route_url('postfix.cl.mail'), _query=(('error', 'asc'),))
	else:
		domainid = request.POST.get('domainid', None)
		mboxid = request.POST.get('mboxid', None)
		if mboxid:
			mbox = sess.query(PostfixMailbox).filter_by(id=int(mboxid)).first()
			if mbox.username == access_user.nick:
				sess.delete(mbox)
				sess.flush()
		elif domainid:
			domain = sess.query(PostfixDomain).filter_by(id=int(domainid)).first()
			domainadmins = sess.query(PostfixDomainAdmins).filter_by(domain=domain.domain)
			if access_user.nick in [adm.username for adm in domainadmins]:
				sess.delete(domain)
				sess.query(PostfixDomainAdmins).filter_by(domain=domain.domain).delete()
				sess.flush()

	return HTTPSeeOther(location=request.route_url('postfix.cl.mail'))
Exemplo n.º 5
0
	def _wizcb_submit_hdl(wiz, em, step, act, val, req):
		xcls = cls
		if isinstance(xcls, str):
			xcls = _name_to_class(xcls)

		sess = DBSession()
		cfg = get_current_registry().settings
	
		fieldIDs = json.loads(val['field_id'])
		fieldlist = val['field']
		templateName = val['template']
		templId = val['templ_id']

		for fid in fieldIDs:
			resvalue = {'templ_id' : templId, 
						'field_id' : fid, 
						'template' : templateName, 
						'field'    : sess.query(PDNSFieldType).filter(PDNSFieldType.id==fid).first()
						}
			em = ExtModel(xcls)
			obj = xcls()
			em.set_values(obj, resvalue, req, True)
			sess.add(obj)
			sess.flush()
			print("TROLOLO")
		return {
			'do'     : 'close',
			'reload' : True
			}
Exemplo n.º 6
0
	def delete(self, req, ctx, recurse=True, _flush=True):
		sess = DBSession()
		if recurse:
			for ch in self.children(ctx):
				self.delete(req, ch, recurse, False)
		sess.delete(ctx)
		if _flush:
			sess.flush()
Exemplo n.º 7
0
 def delete(self, req, ctx, recurse=True, _flush=True):
     sess = DBSession()
     if recurse:
         for ch in self.children(ctx):
             self.delete(req, ch, recurse, False)
     sess.delete(ctx)
     if _flush:
         sess.flush()
Exemplo n.º 8
0
def dyn_ticket_uwiz_update(params, request):
	tid = int(params['ticketid'])
	del params['ticketid']
	sess = DBSession()
	model = ExtModel(Ticket)
	ticket = sess.query(Ticket).get(tid)
	if ticket is None:
		raise KeyError('Invalid ticket ID')

	for param in ('tstid', 'toid', 'name', 'descr'):
		if param in params:
			del params[param]

#	TODO: ENTITIES_LIST
	if not request.has_permission('TICKETS_CHANGE_STATE'):
		if 'ttrid' in params:
			del params['ttrid']
	if not request.has_permission('TICKETS_CHANGE_FLAGS'):
		if 'flags' in params:
			del params['flags']
#	TODO: USERS_LIST
#	TODO: GROUPS_LIST

	sess.execute(SetVariable('ticketid', ticket.id))
	if 'ttrid' in params:
		ttr_id = params['ttrid']
		if ttr_id:
			ttr_id = int(ttr_id)
			trans = sess.query(TicketStateTransition).get(ttr_id)
			if trans:
				sess.execute(SetVariable('ttrid', trans.id))
				trans.apply(ticket)
		del params['ttrid']
	if 'show_client' in params:
		show_cl = params['show_client'].lower()
		if show_cl in {'true', '1', 'on'}:
			show_cl = True
		else:
			show_cl = False
		del params['show_client']
	else:
		show_cl = False
	sess.execute(SetVariable('show_client', npbool(show_cl)))
	if ('comments' in params) and request.has_permission('TICKETS_COMMENT', request.context, request):
		sess.execute(SetVariable('comments', params['comments']))
		del params['comments']
	else:
		sess.execute(SetVariable('comments', None))
	model.set_values(ticket, params, request)
	sess.flush()
	sess.execute(SetVariable('tcid', None))
	return {
		'success' : True,
		'action'  : {
			'do'     : 'close',
			'redraw' : []
		}
	}
Exemplo n.º 9
0
def client_oauth_register(request, regdict):
	nxt = request.route_url('access.cl.home')
	loc = get_localizer(request)
	headers = None
	#if authenticated_userid(request):
	#	 return HTTPSeeOther(location=nxt)

	cfg = request.registry.settings
	rate_id = int(cfg.get('netprofile.client.registration.rate_id', 1))
	state_id = int(cfg.get('netprofile.client.registration.state_id', 1))

	errors = {}
	sess = DBSession()

	login = regdict.get('username', None)
	passwd = regdict.get('password', None)
	email = regdict.get('email', None)
	name_family = regdict.get('familyname', '')
	name_given = regdict.get('givenname', '')

	### !!!!! What if user changes his password in out database?!
	if login is not None and passwd is not None:
		q = sess.query(AccessEntity).filter(AccessEntity.nick == login, AccessEntity.access_state != AccessState.block_inactive.value)
		if q is not None:
			for user in q:
				if user.password == passwd:
					headers = remember(request, login)
					return headers

	if headers is None:
		ent = PhysicalEntity()
		ent.nick = login
		ent.email = email
		ent.name_family = name_family
		ent.name_given = name_given
		ent.state_id = state_id

		stash = Stash()
		stash.entity = ent
		stash.name = loc.translate(_('Primary Account'))

		acc = AccessEntity()
		acc.nick = login
		acc.password = passwd
		acc.stash = stash
		acc.rate_id = rate_id
		acc.state_id = state_id
		ent.children.append(acc)
		
		sess.add(ent)
		sess.add(stash)
		sess.add(acc)
		sess.flush()
		headers = remember(request, login)
		return headers

	else:
		return False
Exemplo n.º 10
0
def dyn_ticket_uwiz_update(params, request):
    tid = int(params['ticketid'])
    del params['ticketid']
    sess = DBSession()
    model = ExtModel(Ticket)
    ticket = sess.query(Ticket).get(tid)
    if ticket is None:
        raise KeyError('Invalid ticket ID')

    for param in ('tstid', 'toid', 'name', 'descr'):
        if param in params:
            del params[param]

#	TODO: ENTITIES_LIST
    if not request.has_permission('TICKETS_CHANGE_STATE'):
        if 'ttrid' in params:
            del params['ttrid']
    if not request.has_permission('TICKETS_CHANGE_FLAGS'):
        if 'flags' in params:
            del params['flags']


#	TODO: USERS_LIST
#	TODO: GROUPS_LIST

    sess.execute(SetVariable('ticketid', ticket.id))
    if 'ttrid' in params:
        ttr_id = params['ttrid']
        if ttr_id:
            ttr_id = int(ttr_id)
            trans = sess.query(TicketStateTransition).get(ttr_id)
            if trans:
                sess.execute(SetVariable('ttrid', trans.id))
                trans.apply(ticket)
        del params['ttrid']
    if 'show_client' in params:
        show_cl = params['show_client'].lower()
        if show_cl in {'true', '1', 'on'}:
            show_cl = True
        else:
            show_cl = False
        del params['show_client']
    else:
        show_cl = False
    sess.execute(SetVariable('show_client', npbool(show_cl)))
    if ('comments' in params) and request.has_permission(
            'TICKETS_COMMENT', request.context, request):
        sess.execute(SetVariable('comments', params['comments']))
        del params['comments']
    else:
        sess.execute(SetVariable('comments', None))
    model.set_values(ticket, params, request)
    sess.flush()
    sess.execute(SetVariable('tcid', None))
    return {'success': True, 'action': {'do': 'close', 'redraw': []}}
Exemplo n.º 11
0
	def make_collection(self, req, parent, name, rtype, props):
		sess = DBSession()
		creator = getattr(parent, 'dav_create', None)
		if (creator is None) or (not callable(creator)):
			raise DAVNotImplementedError('Unable to create child node.')
		obj = creator(req, name, rtype.types, props)
		if len(props) == 0:
			pset = set(dprops.DEFAULT_PROPS)
		else:
			pset = set(props.keys())
		sess.flush()
		obj.__parent__ = parent
		return (obj, self.get_node_props(req, obj, pset))
Exemplo n.º 12
0
 def make_collection(self, req, parent, name, rtype, props):
     sess = DBSession()
     creator = getattr(parent, 'dav_create', None)
     if (creator is None) or (not callable(creator)):
         raise DAVNotImplementedError('Unable to create child node.')
     obj, modified = creator(req, name, rtype.types, props)
     if len(props) == 0:
         pset = set(dprops.DEFAULT_PROPS)
     else:
         pset = set(props.keys())
     sess.flush()
     obj.__parent__ = parent
     return (obj, self.get_node_props(req, obj, pset))
Exemplo n.º 13
0
def ff_tree_create(params, request):
	recs = []
	sess = DBSession()
	user = request.user
	total = 0
	for rec in params.get('records', ()):
		ff_name = rec.get('text')
		ff_parent = rec.get('parentId')
		# TODO: support changing uid/gid and rights, maybe?
		if not ff_name:
			raise ValueError('Empty folder names are not supported')
		if ff_parent and (ff_parent != 'root'):
			ff_parent = int(ff_parent)
		else:
			ff_parent = None

		ff = FileFolder(user=user, group=user.group)
		ff.name = ff_name
		root_ff = user.group.effective_root_folder
		if root_ff and (ff_parent is None):
			raise ValueError('Folder access denied')
		if ff_parent:
			ffp = sess.query(FileFolder).get(ff_parent)
			if ffp is None:
				raise KeyError('Unknown parent folder ID %d' % ff_parent)
			if (not ffp.can_write(user)) or (not ffp.can_traverse_path(user)):
				raise ValueError('Folder access denied')
			if root_ff and (not ffp.is_inside(root_ff)):
				raise ValueError('Folder access denied')
			ff.parent = ffp
		elif not user.root_writable:
			raise ValueError('Folder access denied')

		sess.add(ff)
		sess.flush()
		recs.append({
			'id'             : str(ff.id),
			'parentId'       : str(ff.parent.id) if ff.parent else 'root',
			'text'           : ff.name,
			'xhandler'       : 'NetProfile.controller.FileBrowser',
			'allow_read'     : ff.can_read(user),
			'allow_write'    : ff.can_write(user),
			'allow_traverse' : ff.can_traverse(user),
			'parent_write'   : ff.parent.can_write(user) if ff.parent else user.root_writable
		})
		total += 1
	return {
		'success' : True,
		'records' : recs,
		'total'   : total
	}
Exemplo n.º 14
0
def edit_record(request):
    loc = get_localizer(request)
    sess = DBSession()
    csrf = request.POST.get('csrf', '')
    user_domains = [
        d.id for d in sess.query(PDNSDomain)
        .filter_by(account=str(request.user.id))
    ]

    if csrf != request.get_csrf():
        request.session.flash({
                'text': loc.translate(_('Error submitting form')),
                'class': 'danger'
                })
        return HTTPSeeOther(location=request.route_url('pdns.cl.domains'))
    else:
        rectype = request.POST.get('type', None)
        if rectype == "domain":
            domain = sess.query(PDNSDomain).filter_by(
                id=int(request.POST.get('domainid', None))
            ).first()
            if domain.id in user_domains:
                domain.name = request.POST.get('hostName', None)
                domain.dtype = request.POST.get('hostType', None)
                domain.master = request.POST.get('hostValue', None)

        elif rectype == "record":
            record = sess.query(PDNSRecord).filter_by(
                id=int(request.POST.get('recordid', None))
            ).first()
            if record.domain_id in user_domains:
                record.name = request.POST.get('name', None)
                record.content = request.POST.get('content', None)
                record.rtype = request.POST.get('rtype', None)
                record.ttl = request.POST.get('ttl', None)
                if record.ttl == '':
                    record.ttl = None
                record.prio = request.POST.get('prio', None)
                if record.prio == '':
                    record.prio = None
    sess.flush()
    return HTTPSeeOther(location=request.route_url(
        'pdns.cl.domains',
        _query=(('sort', 'asc'),))
    )
Exemplo n.º 15
0
def delete_record(request):
    # if d in GET, delete domain
    # if r in GET, delete record
    # before delete check if this record exists and belongs to auth_user
    # delete and redirect to main module page
    # use _query to add aditional params when redirecting

    loc = get_localizer(request)
    sess = DBSession()
    csrf = request.POST.get('csrf', '')
    user_domains = [
        d.id for d in sess.query(PDNSDomain)
        .filter_by(account=str(request.user.id))
    ]

    if csrf != request.get_csrf():
        request.session.flash({
                'text': loc.translate(_('Error submitting form')),
                'class': 'danger'
                })
        return HTTPSeeOther(
            location=request.route_url('pdns.cl.domains'),
            _query=(('error', 'asc'),)
        )
    else:
        domainid = request.POST.get('domainid', None)
        recid = request.POST.get('recordid', None)
        if domainid and not recid:
            domain = sess.query(PDNSDomain).filter_by(
                id=int(request.POST.get('domainid', None))
            ).first()
            if domain.id in user_domains:
                sess.delete(domain)
                sess.flush()

        elif recid:
            record = sess.query(PDNSRecord).filter_by(
                id=int(request.POST.get('recordid', None))
            ).first()
            if record.domain_id in user_domains:
                sess.delete(record)
                sess.flush()

        return HTTPSeeOther(location=request.route_url('pdns.cl.domains'))
Exemplo n.º 16
0
def createMailBox(request):
	loc = get_localizer(request)
	cfg = request.registry.settings
	sess = DBSession()
	errmess = None
	csrf = request.POST.get('csrf', '')
	access_user = sess.query(AccessEntity).filter_by(nick=str(request.user)).first()
	admindomains = sess.query(PostfixDomainAdmins).filter_by(username=str(request.user))

	if csrf != request.get_csrf():
		request.session.flash({
				'text' : loc.translate(_('Error submitting form')),
				'class' : 'danger'
				})
		return HTTPSeeOther(location=request.route_url('postfix.cl.mail'))
	else:
		domain_name = request.POST.get('mbDomain', None)
		domain_descr = request.POST.get('mbDomainDescription', None)
		username = request.POST.get('mbUsername', None)
		mailbox_name = request.POST.get('mbName', None)
		mailbox_password = request.POST.get('mbPassword', None)
		if domain_name and username:
			if username == access_user.nick:
				if mailbox_name and mailbox_password:
					newmailbox = PostfixMailbox(
						username=username, 
						password=mailbox_password, 
						name=mailbox_name, 
						domain=domain_name
						)
					sess.add(newmailbox)
					sess.flush()
				else:
					if domain_name not in [ad.username for ad in admindomains]:
						newdomainadmin = PostfixDomainAdmins(username=username, domain=domain_name) 
						newdomain = PostfixDomain(domain=domain_name, description=domain_descr)
						sess.add(newdomainadmin)
						sess.add(newdomain)
						sess.flush()

	return HTTPSeeOther(location=request.route_url('postfix.cl.mail'))
Exemplo n.º 17
0
def editMailBox(request):
	loc = get_localizer(request)
	cfg = request.registry.settings
	sess = DBSession()
	errmess = None
	csrf = request.POST.get('csrf', '')
	access_user = sess.query(AccessEntity).filter_by(nick=str(request.user)).first()
	
	if csrf != request.get_csrf():
		request.session.flash({
				'text' : loc.translate(_('Error submitting form')),
				'class' : 'danger'
				})
		return HTTPSeeOther(location=request.route_url('postfix.cl.mail'))
	else:
		#get vars
		domain_name = request.POST.get('mbDomain', None)
		domain_descr = request.POST.get('mbDomainDescription', None)
		username = request.POST.get('mbUsername', None)
		mailbox_name = request.POST.get('mbName', None)
		mailbox_id = request.POST.get('id', None)
		domain_id = request.POST.get('did', None)
		mailbox_password = request.POST.get('mbPassword', None)
		if username:
			if username == access_user.nick:
				if mailbox_name and mailbox_password:
					mailbox = sess.query(PostfixMailbox).filter_by(id=int(mailbox_id)).first()
					mailbox.name = mailbox_name
					mailbox.password = mailbox_password
					mailbox.domain = domain_name

				else:
					domain = sess.query(PostfixDomain).filter_by(id=domain_id).first()
					domain.description = domain_descr

				sess.flush()

	return HTTPSeeOther(location=request.route_url('postfix.cl.mail'))
Exemplo n.º 18
0
def create_record(request):
	loc = get_localizer(request)
	cfg = request.registry.settings
	sess = DBSession()
	csrf = request.POST.get('csrf', '')
	if csrf != request.get_csrf():
		request.session.flash({
				'text' : loc.translate(_('Error submitting form')),
				'class' : 'danger'
				})
		return HTTPSeeOther(location=request.route_url('pdns.cl.domains'))
	else:
		#get fields related to obtained type and create corresponding fields
		rectype = request.POST.get('type', None)
		if rectype != "record" and rectype != "newdomain":
			#so we are creating some service, domain, mailserver, etc
			currentvalues = {}
			hostname = request.POST.get('hostName', None)
			currentvalues['name'] = hostname
			
			#check if we already have such domain name,
			#if so, return a warning111
			#domain_clash = sess.query(func.count('*'))\
			#		.select_from(PDNSDomain)\
			#		.filter(PDNSDomain.name == hostname)\
			#		.scalar()
			#if domain_clash > 0:
			#	request.session.flash({
			#		'text' : loc.translate(_('Domain already exists, please add corresponding records manually')),
			#		'class' : 'danger'
			#		})
			#	return HTTPSeeOther(location=request.route_url('pdns.cl.domains'))
			#if no same domain name warinigs returned, we can continue processing our data
			#host record

			#domaintype = request.POST.get('hosttype', 'NATIVE')
			domainip = request.POST.get('hostValue', None)
			#if IP-address is not specified, raise a warning
			if not domainip:
				request.session.flash({
						'text' : loc.translate(_('You need to specify IP address')),
						'class' : 'danger'
						})
				return HTTPSeeOther(location=request.route_url('pdns.cl.domains'))
			currentvalues['domainip'] = domainip
			
			#get the nameservers from the config
			ns1 = cfg.get('netprofile.client.pdns.ns1')
			ns2 = cfg.get('netprofile.client.pdns.ns2')

			currentvalues['nameserver1'] = ns1
			currentvalues['nameserver2'] = ns2

			currentvalues['ttl'] = 3600
			currentvalues['prefix'] = ''
			currentvalues['name'] = hostname
			#and here we create our something. 
			#as we have new service type, rectype, we can get all related fields

			newdomain = sess.query(PDNSDomain).filter(PDNSDomain.name==hostname).first()
			service_template = sess.query(PDNSTemplateType).filter(PDNSTemplateType.name==rectype).join(PDNSTemplate).all()
			
			#default values are stored as JSON in the database
			#if default value is a key of a dictionnary, lookup it's value in the currentvalues dict
			#else it is a complex value with prefix and value from currentvalues dict, as in jabber contents field
			#some examples:
			#Domain NS Record: {"ttl":"86400",  "content":"nameserver2"}
			#Mailserver CNAME Record: {"ttl":"3600",  "prefix":"mail", "content":"name"}
			#Jabber SRV Record: {"ttl":"3600",  "prefix":"_xmpp-client._tcp", "content":["5 0 5222 jabber", "name"]}
			for t in service_template:
				for f in t.template_fields:
					defvalues = json.loads(f.defaultvalues)
					newname = currentvalues['name']
					if 'prefix' in defvalues.keys():
						newname = "{0}.{1}".format(defvalues['prefix'], newname)
					newrtype = f.field.name
					
					defcontent = defvalues.get('content', None)
					if defcontent:
						if not isinstance(defcontent, list):
							newcontent = currentvalues.get(defcontent, None)
						else:
							def_in_cur = [defcontent.index(k) for k in filter(lambda x: x in defcontent, currentvalues.keys())]
							for i in def_in_cur:
								defcontent[i] = currentvalues[defcontent[i]]
							newcontent =".".join(defcontent)
					else:
						newcontent = ''

					newttl = int(defvalues.get('ttl', 3600))
					
					newRecord = PDNSRecord(
						domain = newdomain,
						name = newname,
						rtype = newrtype,
						content = newcontent,
						ttl = newttl,
					)
					sess.add(newRecord)
					sess.flush()
		elif rectype == "record":
			ttl = None if request.POST.get('ttl', None) == '' else request.POST.get('ttl', None);
			prio = None if request.POST.get('prio', None) == '' else request.POST.get('prio', None);
			newrecord = PDNSRecord(domain_id=int(request.POST.get('domainid', None)), name=request.POST.get('name', None), rtype=request.POST.get('rtype', None), content=request.POST.get('content', None), ttl=ttl, prio=prio)
			sess.add(newrecord)
			sess.flush()
		elif rectype == "newdomain":
			hostname = request.POST.get('hostName', '127.0.0.1')
			hosttype = request.POST.get('hostType', 'NATIVE')
			domain_clash = sess.query(func.count('*'))\
				.select_from(PDNSDomain)\
				.filter(PDNSDomain.name == hostname)\
				.scalar()
			if domain_clash > 0:
				request.session.flash({
						'text' : loc.translate(_('Domain already exists, please add corresponding records manually')),
						'class' : 'danger'
						})
				return HTTPSeeOther(location=request.route_url('pdns.cl.domains'))

			newdomain = PDNSDomain(
				name=hostname, 
				master='', 
				dtype=hosttype, 
				account=request.POST.get('user', None)
				)
			sess.add(newdomain)
			sess.flush()
			
	return HTTPSeeOther(location=request.route_url('pdns.cl.domains', _query=(('created', 1),)))
Exemplo n.º 19
0
def client_issue_new(ctx, req):
    loc = req.localizer
    cfg = req.registry.settings
    if not asbool(cfg.get('netprofile.client.ticket.enabled', True)):
        raise HTTPForbidden(detail=_('Issues view is disabled'))
    origin_id = int(cfg.get('netprofile.client.ticket.origin_id', 0))
    user_id = int(cfg.get('netprofile.client.ticket.assign_uid', 0))
    group_id = int(cfg.get('netprofile.client.ticket.assign_gid', 0))
    errors = {}
    sess = DBSession()
    ent = req.user.parent
    states = sess.query(TicketState)\
     .filter(TicketState.is_start == True, TicketState.allow_client == True)
    if 'submit' in req.POST:
        csrf = req.POST.get('csrf', '')
        name = req.POST.get('name', '')
        descr = req.POST.get('descr', '')
        state = int(req.POST.get('state', 0))
        if csrf != req.get_csrf():
            errors['csrf'] = _a('Error submitting form')
        else:
            l = len(name)
            if (l == 0) or (l > 254):
                errors['name'] = _a('Invalid field length')
            for s in states:
                if s.id == state:
                    state = s
                    break
            else:
                errors['state'] = _('Invalid issue type')
        if len(errors) == 0:
            tkt = Ticket()
            tkt.name = name
            tkt.state = state
            tkt.entity = ent
            tkt.show_client = True
            if descr:
                tkt.description = descr
            if origin_id:
                tkt.origin_id = origin_id
            if user_id:
                tkt.assigned_user_id = user_id
            if group_id:
                tkt.assigned_group_id = group_id
            sess.add(tkt)
            sess.flush()

            req.session.flash(
                {'text': loc.translate(_('New issue successfully created'))})
            return HTTPSeeOther(location=req.route_url(
                'tickets.cl.issues', traverse=(tkt.id, 'view')))
    tpldef = {
        'states':
        states,
        'crumbs': [{
            'text': loc.translate(_('My Issues')),
            'url': req.route_url('tickets.cl.issues', traverse=())
        }, {
            'text': loc.translate(_('New Issue'))
        }],
        'errors': {err: loc.translate(errors[err])
                   for err in errors}
    }
    req.run_hook('access.cl.tpldef', tpldef, req)
    req.run_hook('access.cl.tpldef.issue.new', tpldef, req)
    return tpldef
Exemplo n.º 20
0
	def _wizcb_submit_hdl(wiz, em, step, act, val, req):
		xcls = cls
		if isinstance(xcls, str):
			xcls = _name_to_class(xcls)

		sess = DBSession()
		cfg = get_current_registry().settings
		mailer = get_mailer(req)

		userIDs = json.loads(val['userid'])
		userlist = val['user']
		templateName = val['template']
		templId = val['templid']
		receiver = None
		sender = cfg.get('netprofile.mailing.sender', '*****@*****.**')
		sendername = cfg.get('sender.name', 'localadmin')
		mailhost = cfg.get('mail.host', 'localhost')

		for userid in userIDs:
			resvalue = {'userid' : userid}
			user = sess.query(AccessEntity).filter(AccessEntity.id==userid).first()
			subscr = sess.query(MailingSubscription).filter(MailingSubscription.userid==userid).first()
		
    		#a long try-except statement to check if user is in mailing list
			try:
				if subscr.issubscribed is True:
					templateBody = sess.query(MailingTemplate).filter(MailingTemplate.id==templId).first().body
					resvalue['user'] = user
					resvalue['template'] = templateBody
					resvalue['templid'] = templId
		
					if user.parent:
						try:
							receiver = user.parent.email
						except AttributeError:
							#raise error here
							print("################### USER'S PARENT HAVE NO EMAIL ATTRIBUTE #######################")
	
					if receiver is not None:
						msg_text = Attachment(data=templateBody,
											  content_type='text/plain; charset=\'utf-8\'',
											  disposition='inline',
											  transfer_encoding='quoted-printable'
											  )
						msg_html = Attachment(data=templateBody,
											  content_type='text/html; charset=\'utf-8\'',
											  disposition='inline',
											  transfer_encoding='quoted-printable'
											  )
						message = Message(
							subject=(templateName),
							sender=sender,
							recipients=(receiver,),
							body=msg_text,
							html=msg_html
							)

						mailer.send(message)
						resvalue['letteruid'] = hashlib.md5((templateBody + user.nick + str(datetime.datetime.now())).encode()).hexdigest()
						em = ExtModel(xcls)
						obj = xcls()
						em.set_values(obj, resvalue, req, True)
						sess.add(obj)
						sess.flush()
					else:
						print("################### USER HAVE NO EMAIL #######################")

			except AttributeError:
				print("########################## USER NOT IN SUBSCR LIST ###########################")

		return {
			'do'     : 'close',
			'reload' : True
			}
Exemplo n.º 21
0
def create_record(request):
	loc = get_localizer(request)
	cfg = request.registry.settings
	sess = DBSession()
	csrf = request.POST.get('csrf', '')
	if csrf != request.get_csrf():
		request.session.flash({
				'text' : loc.translate(_('Error submitting form')),
				'class' : 'danger'
				})
		return HTTPSeeOther(location=request.route_url('pdns.cl.domains'))
	else:
		rectype = request.POST.get('type', None)
		if rectype == "domain":
			name = request.POST.get('hostName', None)
			domain_clash = sess.query(func.count('*'))\
					.select_from(PDNSDomain)\
					.filter(PDNSDomain.name == name)\
					.scalar()
			if domain_clash > 0:
				request.session.flash({
					'text' : loc.translate(_('Domain already exists')),
					'class' : 'danger'
					})
				return HTTPSeeOther(location=request.route_url('pdns.cl.domains'))
			ns1 = cfg.get('netprofile.client.pdns.ns1')
			ns2 = cfg.get('netprofile.client.pdns.ns2')
			newdomain = PDNSDomain(name=name, master='', dtype='NATIVE', account=request.POST.get('user', None))

			newsoa = PDNSRecord()
			newsoa.domain = newdomain
			newsoa.name = name
			newsoa.rtype = 'SOA'
			newsoa.content = ns1
			newsoa.ttl = 86400

			newns1 = PDNSRecord()
			newns1.domain = newdomain
			newns1.name = name
			newns1.rtype = 'NS'
			newns1.content = ns1
			newns1.ttl = 86400

			newns2 = PDNSRecord()
			newns2.domain = newdomain
			newns2.name = name
			newns2.rtype = 'NS'
			newns2.content = ns2
			newns2.ttl = 86400

			sess.add(newdomain)
			sess.add(newsoa)
			sess.add(newns1)
			sess.add(newns2)

			sess.flush()
		elif rectype == "record":
			ttl = None if request.POST.get('ttl', None) == '' else request.POST.get('ttl', None);
			prio = None if request.POST.get('prio', None) == '' else request.POST.get('prio', None);
			newrecord = PDNSRecord(domain_id=int(request.POST.get('domainid', None)), name=request.POST.get('name', None), rtype=request.POST.get('rtype', None), content=request.POST.get('content', None), ttl=ttl, prio=prio)
			sess.add(newrecord)
			sess.flush()
		
	return HTTPSeeOther(location=request.route_url('pdns.cl.domains', _query=(('created', 1),)))
Exemplo n.º 22
0
def client_issue_new(ctx, req):
	loc = req.localizer
	cfg = req.registry.settings
	if not asbool(cfg.get('netprofile.client.ticket.enabled', True)):
		raise HTTPForbidden(detail=_('Issues view is disabled'))
	origin_id = int(cfg.get('netprofile.client.ticket.origin_id', 0))
	user_id = int(cfg.get('netprofile.client.ticket.assign_uid', 0))
	group_id = int(cfg.get('netprofile.client.ticket.assign_gid', 0))
	errors = {}
	sess = DBSession()
	ent = req.user.parent
	states = sess.query(TicketState)\
		.filter(TicketState.is_start == True, TicketState.allow_client == True)
	if 'submit' in req.POST:
		csrf = req.POST.get('csrf', '')
		name = req.POST.get('name', '')
		descr = req.POST.get('descr', '')
		state = int(req.POST.get('state', 0))
		if csrf != req.get_csrf():
			errors['csrf'] = _a('Error submitting form')
		else:
			l = len(name)
			if (l == 0) or (l > 254):
				errors['name'] = _a('Invalid field length')
			for s in states:
				if s.id == state:
					state = s
					break
			else:
				errors['state'] = _('Invalid issue type')
		if len(errors) == 0:
			tkt = Ticket()
			tkt.name = name
			tkt.state = state
			tkt.entity = ent
			tkt.show_client = True
			if descr:
				tkt.description = descr
			if origin_id:
				tkt.origin_id = origin_id
			if user_id:
				tkt.assigned_user_id = user_id
			if group_id:
				tkt.assigned_group_id = group_id
			sess.add(tkt)
			sess.flush()

			req.session.flash({
				'text' : loc.translate(_('New issue successfully created'))
			})
			return HTTPSeeOther(location=req.route_url('tickets.cl.issues', traverse=(tkt.id, 'view')))
	tpldef = {
		'states' : states,
		'crumbs' : [{
			'text' : loc.translate(_('My Issues')),
			'url'  : req.route_url('tickets.cl.issues', traverse=())
		}, {
			'text' : loc.translate(_('New Issue'))
		}],
		'errors' : {err: loc.translate(errors[err]) for err in errors}
	}
	req.run_hook('access.cl.tpldef', tpldef, req)
	req.run_hook('access.cl.tpldef.issue.new', tpldef, req)
	return tpldef
Exemplo n.º 23
0
def create_record(request):
    loc = get_localizer(request)
    cfg = request.registry.settings
    sess = DBSession()
    csrf = request.POST.get('csrf', '')
    if csrf != request.get_csrf():
        request.session.flash({
                'text': loc.translate(_('Error submitting form')),
                'class': 'danger'
                })
        return HTTPSeeOther(location=request.route_url('pdns.cl.domains'))
    else:
        # get fields related to obtained type and create corresponding fields
        rectype = request.POST.get('type', None)
        if rectype != "record" and rectype != "newdomain":
            # so we are creating some service, domain, mailserver, etc
            currentvalues = {}
            hostname = request.POST.get('hostName', None)
            currentvalues['name'] = hostname

            # check if we already have such domain name,
            # if so, return a warning111
            # domain_clash = sess.query(func.count('*'))\
            # 		.select_from(PDNSDomain)\
            # 		.filter(PDNSDomain.name == hostname)\
            # 		.scalar()
            # if domain_clash > 0:
            # 	request.session.flash({
            # 		'text' : loc.translate(_('Domain already exists, please add corresponding records manually')),
            # 		'class' : 'danger'
            # 		})
            # 	return HTTPSeeOther(location=request.route_url('pdns.cl.domains'))
            # if no same domain name warinigs returned, we can continue processing our data
            # host record

            # domaintype = request.POST.get('hosttype', 'NATIVE')
            domainip = request.POST.get('hostValue', None)
            # if IP-address is not specified, raise a warning
            if not domainip:
                request.session.flash({
                        'text': loc.translate(
                            _('You need to specify IP address')
                         ),
                        'class': 'danger'
                        })
                return HTTPSeeOther(
                    location=request.route_url('pdns.cl.domains')
                )
            currentvalues['domainip'] = domainip

            # get the nameservers from the config
            ns1 = cfg.get('netprofile.client.pdns.ns1')
            ns2 = cfg.get('netprofile.client.pdns.ns2')

            currentvalues['nameserver1'] = ns1
            currentvalues['nameserver2'] = ns2

            currentvalues['ttl'] = 3600
            currentvalues['prefix'] = ''
            currentvalues['name'] = hostname
            # and here we create our something. 
            # as we have new service type, rectype, we can get all related fields

            newdomain = sess.query(PDNSDomain).filter(
                PDNSDomain.name == hostname
            ).first()
            service_template = sess.query(PDNSTemplateType).filter(
                PDNSTemplateType.name == rectype
            ).join(PDNSTemplate).all()

            # default values are stored as JSON in the database
            # if default value is a key of a dictionnary, lookup it's value in the currentvalues dict
            # else it is a complex value with prefix and value from currentvalues dict, as in jabber contents field
            # some examples:
            # Domain NS Record: {"ttl":"86400",  "content":"nameserver2"}
            # Mailserver CNAME Record: {"ttl":"3600",  "prefix":"mail", "content":"name"}
            # Jabber SRV Record: {"ttl":"3600",  "prefix":"_xmpp-client._tcp", "content":["5 0 5222 jabber", "name"]}
            for t in service_template:
                for f in t.template_fields:
                    defvalues = json.loads(f.defaultvalues)
                    newname = currentvalues['name']
                    if 'prefix' in defvalues.keys():
                        newname = "{0}.{1}".format(
                            defvalues['prefix'],
                            newname
                        )
                    newrtype = f.field.name

                    defcontent = defvalues.get('content', None)
                    if defcontent:
                        if not isinstance(defcontent, list):
                            newcontent = currentvalues.get(defcontent, None)
                        else:
                            def_in_cur = [
                                defcontent.index(k) for k in filter(
                                    lambda x: x in defcontent,
                                    currentvalues.keys()
                                )
                            ]
                            for i in def_in_cur:
                                defcontent[i] = currentvalues[defcontent[i]]
                            newcontent = ".".join(defcontent)
                    else:
                        newcontent = ''

                    newttl = int(defvalues.get('ttl', 3600))

                    newRecord = PDNSRecord(
                        domain=newdomain,
                        name=newname,
                        rtype=newrtype,
                        content=newcontent,
                        ttl=newttl,
                    )
                    sess.add(newRecord)
                    sess.flush()
        elif rectype == "record":
            ttl = request.POST.get('ttl', None)
            if ttl == "":
                ttl = None
            prio = request.POST.get('prio', None)
            if prio == "":
                prio = None
            newrecord = PDNSRecord(
                domain_id=int(request.POST.get('domainid', None)),
                name=request.POST.get('name', None),
                rtype=request.POST.get('rtype', None),
                content=request.POST.get('content', None),
                ttl=ttl,
                prio=prio
            )
            sess.add(newrecord)
            sess.flush()
        elif rectype == "newdomain":
            hostname = request.POST.get('hostName', '127.0.0.1')
            hosttype = request.POST.get('hostType', 'NATIVE')
            domain_clash = sess.query(func.count('*'))\
                .select_from(PDNSDomain)\
                .filter(PDNSDomain.name == hostname)\
                .scalar()
            if domain_clash > 0:
                request.session.flash({
                        'text': loc.translate(
                            _('Domain already exists,'
                                ' please add corresponding records manually')
                        ),
                        'class': 'danger'
                        })
                return HTTPSeeOther(
                    location=request.route_url('pdns.cl.domains')
                )

            newdomain = PDNSDomain(
                name=hostname,
                master='',
                dtype=hosttype,
                account=request.POST.get('user', None)
                )
            sess.add(newdomain)
            sess.flush()

    return HTTPSeeOther(location=request.route_url(
        'pdns.cl.domains',
        _query=(('created', 1),)
        ))