def enable_sms_preauth(): with app.app_context(): from unifispot.superadmin.models import Account from unifispot.guest.newcontroller import Controller account = Account().query.first() account.en_sms_preauth = 1 db.session.commit()
def get(self,id): singleitem = Account().query.filter_by(id=current_user.account_id).first() if singleitem: return jsonify({'status': 1,'data':singleitem.get_settings()}) else: current_app.logger.debug("No Settings Entry in Settings table!! %s "%(request.url)) return jsonify({'status': 0,'msg':'No Settings Entry Found'})
def temp_authorize_guest(track_id): '''Function for giving temporary internet access for a client This function send API commands to controller, return ok ''' guest_track = Guesttrack.query.filter_by(track_id=track_id).first() if not guest_track: current_app.logger.error( "Called temp_authorize_guest with wrong track ID:%s" % track_id) return jsonify({'status': 0, 'msg': "Error"}) #validate session associated with this track ID guest_session = Guestsession.query.filter_by( id=guest_track.session_id).first() if not guest_session or guest_session.state != SESSION_TEMP_AUTH: current_app.logger.error( "Called temp_authorize_guest with wrong Session from track ID:%s" % track_id) return jsonify({'status': 0, 'msg': "Error"}) current_app.logger.debug( 'Wifiguest Log - Site ID:%s temp_authorize_guest for track ID:%s' % (guest_track.site_id, guest_track.id)) #prevent misuse if guest_session.temp_login >= 10 and guest_session.demo != 1: current_app.logger.info( 'Wifiguest Log - Site ID:%s temp_authorize_guest max tries reached for track ID:%s' % (guest_track.site_id, guest_track.id)) return jsonify({ 'status': 0, 'msg': "You have already used up temporary logins for today" }) else: guest_session.temp_login += 1 db.session.commit() #get details from track ID and authorize if not current_app.config['NO_UNIFI']: account = Account().query.filter_by( id=guest_session.site.account_id).first() settings = account.get_settings() try: c = Controller(settings['unifi_server'], settings['unifi_user'], settings['unifi_pass'], '8443', 'v4', guest_track.site.unifi_id) c.authorize_guest(guest_track.device_mac, 5, ap_mac=guest_track.ap_mac) except: current_app.logger.exception( 'Exception occured while trying to authorize User') return jsonify({'status': 0, 'msg': "Error!!"}) return jsonify({'status': 1, 'msg': "DONE"}) else: return jsonify({'status': 1, 'msg': "DEBUG enabled"})
def get(self, id): singleitem = Account().query.filter_by( id=current_user.account_id).first() if singleitem: return jsonify({'status': 1, 'data': singleitem.get_settings()}) else: current_app.logger.debug( "No Settings Entry in Settings table!! %s " % (request.url)) return jsonify({'status': 0, 'msg': 'No Settings Entry Found'})
def post(self,id): singleitem = Account().query.filter_by(id=current_user.account_id).first() form1 = self.get_form_obj() form1.populate() if form1.validate_on_submit(): singleitem.populate_settings(form1) try: db.session.commit() except IntegrityError: return jsonify({'status': 0,'msg':'Value already exists in the database'}) return jsonify({'status': 1}) else: return jsonify({'status':0,'msg': get_errors(form1)})
def fb_ips(): with app.app_context(): from unifispot.superadmin.models import Account from unifispot.guest.newcontroller import Controller account = Account().query.first() settings = account.get_settings() site_id = 'ieu6ek9y' site_code = '572a12afe4b078cda06e7e41' portal_ip = '139.59.192.71' portal_subnet = '139.59.192.71/32' portal_hostname = 'urbanespot.com' c = Controller(settings['unifi_server'], settings['unifi_user'], settings['unifi_pass'],'8443','v4',site_id) c.set_guest_access(site_id,site_code,portal_ip,portal_subnet,portal_hostname)
def fb_ips(): with app.app_context(): from unifispot.superadmin.models import Account from unifispot.guest.newcontroller import Controller account = Account().query.first() settings = account.get_settings() site_id = '' site_code = '' portal_ip = '' portal_subnet = '' portal_hostname = '' c = Controller(settings['unifi_server'], settings['unifi_user'], settings['unifi_pass'],'8443','v4',site_id) c.set_guest_access(site_id,site_code,portal_ip,portal_subnet,portal_hostname)
def authorize_guest(track_id): '''Function called after respective auth mechanisms are completed This function send API commands to controller, redirect user to correct URL ''' # #Validate track id and get all the needed variables guest_track = Guesttrack.query.filter_by(track_id=track_id).first() if not guest_track: current_app.logger.error("Called authorize_guest with wrong track ID:%s"%track_id) abort(404) #validate session associated with this track ID guest_session = Guestsession.query.filter_by(id=guest_track.session_id).first() if not guest_session: current_app.logger.error("Called authorize_guest with wrong Session from track ID:%s"%track_id) abort(404) #Check if the session is authorized if not guest_session.state == SESSION_AUTHORIZED or guest_session.expiry < arrow.utcnow().naive: current_app.logger.error("Called authorize_guest with wrong Non Authorized session with track ID:%s"%track_id) abort(404) current_app.logger.debug('Wifiguest Log - Site ID:%s authorize_guest with trackid :%s'%(guest_track.site_id,guest_track.id)) #Send unifi API commands if the user has completed login duration = guest_session.duration if guest_session.duration else 60 if not current_app.config['NO_UNIFI'] : #code to send auth command to controller account = Account().query.filter_by(id=guest_session.site.account_id).first() settings = account.get_settings() try: c = Controller(settings['unifi_server'], settings['unifi_user'], settings['unifi_pass'],'8443','v4',guest_track.site.unifi_id) c.authorize_guest(guest_track.device_mac,duration,ap_mac=guest_track.ap_mac) except: current_app.logger.exception('Wifiguest Log - Site ID:%s authorize_guest exception with trackid :%s'%(guest_track.site_id,guest_track.id)) abort(500) #update session expiry to now + authorized time guest_session.expiry = arrow.utcnow().replace(minutes=duration + 10).naive db.session.commit() #Code to handle guest after successful login #if guest_track.site.redirect_method == REDIRECT_ORIG_URL and guest_track.orig_url: #return redirect(format_url(guest_track.orig_url),code=302) #elif guest_track.site.redirect_url: #redirect User to default URL if configured # return redirect(format_url(guest_track.site.redirect_url),code=302) #else: #redirect user to google.com return redirect(format_url("www.google.com"),code=302)
def fb_ips(): with app.app_context(): from unifispot.superadmin.models import Account from unifispot.guest.newcontroller import Controller account = Account().query.first() settings = account.get_settings() site_id = '' site_code = '' portal_ip = '' portal_subnet = '' portal_hostname = '' c = Controller(settings['unifi_server'], settings['unifi_user'], settings['unifi_pass'], '8443', 'v4', site_id) c.set_guest_access(site_id, site_code, portal_ip, portal_subnet, portal_hostname)
def init_data(): with app.app_context(): from sqlalchemy.exc import OperationalError from flask_security.utils import encrypt_password from unifispot.models import User from unifispot.superadmin.models import Account from unifispot.admin.models import Admin try: account = Account.query.filter_by(id=1).first() except: app.logger.debug( "No Account table Entry found,could be running migration ") else: if not account: #create default admin user enc_pass = encrypt_password('password') account = Account() db.session.add(account) admin_user = Admin(email='*****@*****.**', password=enc_pass, displayname="Admin User", active=1) admin_user.account = account db.session.add(admin_user) db.session.commit()
def get(self,id): client_list = [] if not id: #get all APs status if not current_app.config['NO_UNIFI']: account = Account().query.filter_by(id=current_user.account_id).first() settings = account.get_settings() if not settings: current_app.logger.debug("No Settings Entry in User table!! %s "%(request.url)) return jsonify({'status': 0,'msg':'Error while loading settings'}) else: c = Controller(settings['unifi_server'], settings['unifi_user'], settings['unifi_pass'],version='v4',site_id='default') if current_user.type =='admin': sites = Wifisite.query.filter_by(account_id=current_user.account_id).all() elif current_user.type =='client': sites = Wifisite.query.filter_by(client_id=current_user.id).all() if sites: c = Controller(settings['unifi_server'], settings['unifi_user'], settings['unifi_pass'],version='v4',site_id='default') for site in sites: site_clients = c.get_clients(site_id=site.unifi_id) for site_client in site_clients: if site_client.get('is_guest'): client_list.append(guest_status_generate(site_client,site.name)) else: client_list = [['SITE1','11:22:33:44:55:66','11:22:33:44:55:66',"40",'00:41','<span class="label label-success">Authorized</span>'],['SITE1','11:22:33:44:55:66','11:22:33:44:55:66',"40",'00:41','<span class="label label-success">Authorized</span>'],['SITE1','11:22:33:44:55:66','11:22:33:44:55:66',"40",'00:41','<span class="label label-success">Authorized</span>']] else: if not current_app.config['NO_UNIFI']: account = Account().query.filter_by(id=current_user.account_id).first() settings = account.get_settings() wifisite = Wifisite.query.filter_by(id=id).first() if not settings: current_app.logger.debug("No Settings Entry in User table!! %s "%(request.url)) return jsonify({'status': 0,'msg':'Error while loading settings'}) if current_user.type =='admin': wifisite = Wifisite.query.filter(and_(Wifisite.id==id,Wifisite.account_id==current_user.account_id)).first() elif current_user.type =='client': wifisite = Wifisite.query.filter(and_(Wifisite.id==id,Wifisite.client_id==current_user.id)).first() if wifisite: c = Controller(settings['unifi_server'], settings['unifi_user'], settings['unifi_pass'],version='v4',site_id='default') site_clients = c.get_clients(site_id=wifisite.unifi_id) for site_client in site_clients: if site_client.get('is_guest'): client_list.append(guest_status_generate(site_client,wifisite.name)) else: client_list = [['SITE1','11:22:33:44:55:66','11:22:33:44:55:66',"40",'00:41','<span class="label label-success">Authorized</span>'],['SITE1','11:22:33:44:55:66','11:22:33:44:55:66',"40",'00:41','<span class="label label-success">Authorized</span>'],['SITE1','11:22:33:44:55:66','11:22:33:44:55:66',"40",'00:41','<span class="label label-success">Authorized</span>']] return jsonify({'status': 1,'data':client_list})
def get(self,id): ap_list = [] if not id: #get all APs status if not current_app.config['NO_UNIFI']: account = Account().query.filter_by(id=current_user.account_id).first() settings = account.get_settings() if not settings: current_app.logger.debug("No Settings Entry in User table!! %s "%(request.url)) return jsonify({'status': 0,'msg':'Error while loading settings'}) else: c = Controller(settings['unifi_server'], settings['unifi_user'], settings['unifi_pass'],version='v4',site_id='default') if current_user.type =='admin': sites = Wifisite.query.filter_by(account_id=current_user.account_id).all() elif current_user.type =='client': sites = Wifisite.query.filter_by(client_id=current_user.id).all() if sites: for site in sites: site_aps = c.get_aps(site_id=site.unifi_id) for site_ap in site_aps: ap_list.append([site_ap.get('mac'),site_ap.get('name'),site.name,ap_status_generate(site_ap.get('state'))]) else: ap_list = [['11:22:33:44:55:66',"AP1",'SITE1','<span class="label label-success">AP Active</span>'],['11:22:33:44:55:66',"AP4",'SITE4',ap_status_generate(2)],['11:22:33:44:55:66',"AP1",'SIT31',ap_status_generate(1)],['11:22:33:44:55:66',"AP1",'SITE1',ap_status_generate(1)]] else: if not current_app.config['NO_UNIFI']: account = Account().query.filter_by(id=current_user.account_id).first() settings = account.get_settings() if current_user.type =='admin': wifisite = Wifisite.query.filter(and_(Wifisite.id==id,Wifisite.account_id==current_user.account_id)).first() elif current_user.type =='client': wifisite = Wifisite.query.filter(and_(Wifisite.id==id,Wifisite.client_id==current_user.id)).first() if not settings: current_app.logger.debug("No Settings Entry in User table!! %s "%(request.url)) return jsonify({'status': 0,'msg':'Error while loading settings'}) if wifisite: c = Controller(settings['unifi_server'], settings['unifi_user'], settings['unifi_pass'],version='v4',site_id='default') site_aps = c.get_aps(site_id=wifisite.unifi_id) for site_ap in site_aps: ap_list.append([site_ap.get('mac'),site_ap.get('name'),wifisite.name,ap_status_generate(site_ap.get('state'))]) else: ap_list = [['11:22:33:44:55:66',"AP1",'SITE1',ap_status_generate(1)],['11:22:33:44:55:66',"AP4",'SITE4',ap_status_generate(2)],['11:22:33:44:55:66',"AP1",'SIT31',ap_status_generate(1)],['11:22:33:44:55:66',"AP1",'SITE1',ap_status_generate(1)]] return jsonify({'status': 1,'data':ap_list})
def post(self, id): singleitem = Account().query.filter_by( id=current_user.account_id).first() form1 = self.get_form_obj() form1.populate() if form1.validate_on_submit(): singleitem.populate_settings(form1) try: db.session.commit() except IntegrityError: return jsonify({ 'status': 0, 'msg': 'Value already exists in the database' }) return jsonify({'status': 1}) else: return jsonify({'status': 0, 'msg': get_errors(form1)})
def celery_session_monitor(*args, **kwargs): current_app.logger.info('-----------Running celery_session_monitor-----------------------') sites = Wifisite.query.all() for site in sites: if site.enable_session_limit or site.voucher_login_en() : current_app.logger.info('celery_session_monitor processing Site:%s'%site.name) account = Account().query.filter_by(id=site.account_id).first() settings = account.get_settings() try: c = Controller(settings['unifi_server'], settings['unifi_user'], settings['unifi_pass'],'8443','v4',site.unifi_id) #get all STAs stas = c.get_clients() for sta in stas: if sta.get('is_guest') and sta.get('authorized'): rx_bytes = int(sta.get('rx_bytes')) tx_bytes = int(sta.get('tx_bytes')) total_data = rx_bytes + tx_bytes data_mb = int(math.ceil((total_data/1024000.0))) mac = sta.get('mac') guest_session = Guestsession.query.filter_by(site_id=site.id,mac=mac).first() if not guest_session: current_app.logger.debug('MAC:%s in site:%s have no session'%(mac,site.name)) continue current_app.logger.debug('MAC:%s in site:%s seems to have used \ data:%s Mb'%(mac,site.name,data_mb)) if guest_session.state == GUESTRACK_VOUCHER_AUTH: #if voucher authorized check for balance data in voucher current_app.logger.debug('MAC:%s in site:%s seems to have authorized via Voucher '%(mac,site.name)) voucher = Voucher.query.filter_by(site_id=site.id,device_id=guest_session.device_id).first() if not voucher: current_app.logger.error('MAC:%s in site:%s no_voucher found '%(mac,site.name)) continue if voucher.bytes_t and data_mb > voucher.data_available(): current_app.logger.debug('MAC:%s in site:%s seems to have exceeded voucher:%s limit \ hence disconnecting'%(mac,site.name,voucher.id)) #if not voucher authorized check if device exceeded session limit if session limit is enabled else: if site.enable_session_limit and data_mb > int(site.daily_data_limit) : current_app.logger.debug('MAC:%s in site:%s seems to have exceeded data \ hence disconnecting'%(mac,site.name)) c.unauthorize_guest(mac) except: current_app.logger.exception('Exception while monitoring site:%s'%site.name)
def populate(self): self.timezone.choices = [ (tz_name, tz_formated) for tz_offset, tz_name, tz_formated in zones.get_timezones() ] self.template.choices = [('template1', 'Template1'), ('template2', 'Template2')] self.reports_type.choices = [(CLIENT_REPORT_NONE, 'No Reporting'), (CLIENT_REPORT_WEEKLY, 'Weekly Reports'), (CLIENT_REPORT_MONTHLY, 'Monthly Reports') ] self.client_id.choices = [] self.api_export.choices = [(API_END_POINT_NONE, 'None'), (API_END_POINT_MAIL_CHIMP, 'MailChimp')] self.unifi_id.choices = [] for user in Client.query.filter_by( account_id=current_user.account_id).all(): self.client_id.choices.append((user.id, user.displayname)) if not current_app.config['NO_UNIFI']: account = Account().query.filter_by( id=current_user.account_id).first() settings = account.get_settings() try: c = Controller(settings['unifi_server'], settings['unifi_user'], settings['unifi_pass'], version='v4', site_id='default') for site in c.get_sites(): self.unifi_id.choices.append( (site.get('name'), site.get('desc'))) except: flash( "Error connecting to Unifi Controller,please check Host/Credentials", 'danger') else: self.unifi_id.choices = [('site1', 'SITE1'), ('site2', 'SITE2'), ('site3', 'SITE3')]
def populate(self): self.timezone.choices = [ (tz_name,tz_formated)for tz_offset, tz_name, tz_formated in zones.get_timezones() ] self.template.choices = [('template1','Template1'),('template2','Template2') ] self.reports_type.choices = [(CLIENT_REPORT_NONE,'No Reporting'),(CLIENT_REPORT_WEEKLY,'Weekly Reports'),(CLIENT_REPORT_MONTHLY,'Monthly Reports')] self.client_id.choices = [] self.api_export.choices = [(API_END_POINT_NONE,'None'),(API_END_POINT_MAIL_CHIMP,'MailChimp')] self.unifi_id.choices = [] for user in Client.query.filter_by(account_id=current_user.account_id).all(): self.client_id.choices.append((user.id,user.displayname)) if not current_app.config['NO_UNIFI']: account = Account().query.filter_by(id=current_user.account_id).first() settings = account.get_settings() try: c = Controller(settings['unifi_server'], settings['unifi_user'], settings['unifi_pass'],version='v4',site_id='default') for site in c.get_sites(): self.unifi_id.choices.append((site.get('name'),site.get('desc'))) except: flash("Error connecting to Unifi Controller,please check Host/Credentials",'danger') else: self.unifi_id.choices = [('site1','SITE1'),('site2','SITE2'),('site3','SITE3')]
def temp_authorize_guest(track_id): '''Function for giving temporary internet access for a client This function send API commands to controller, return ok ''' guest_track = Guesttrack.query.filter_by(track_id=track_id).first() if not guest_track : current_app.logger.error("Called temp_authorize_guest with wrong track ID:%s"%track_id) return jsonify({'status':0,'msg': "Error"}) #validate session associated with this track ID guest_session = Guestsession.query.filter_by(id=guest_track.session_id).first() if not guest_session or guest_session.state != SESSION_TEMP_AUTH: current_app.logger.error("Called temp_authorize_guest with wrong Session from track ID:%s"%track_id) return jsonify({'status':0,'msg': "Error"}) current_app.logger.debug('Wifiguest Log - Site ID:%s temp_authorize_guest for track ID:%s'%(guest_track.site_id,guest_track.id)) #prevent misuse if guest_session.temp_login >= 10 and guest_session.demo != 1 : current_app.logger.info('Wifiguest Log - Site ID:%s temp_authorize_guest max tries reached for track ID:%s'%(guest_track.site_id,guest_track.id)) return jsonify({'status':0,'msg': "You have already used up temporary logins for today"}) else: guest_session.temp_login += 1 db.session.commit() #get details from track ID and authorize if not current_app.config['NO_UNIFI'] : account = Account().query.filter_by(id=guest_session.site.account_id).first() settings = account.get_settings() try: c = Controller(settings['unifi_server'], settings['unifi_user'], settings['unifi_pass'],'8443','v4',guest_track.site.unifi_id) c.authorize_guest(guest_track.device_mac,5,ap_mac=guest_track.ap_mac) except: current_app.logger.exception('Exception occured while trying to authorize User') return jsonify({'status':0,'msg': "Error!!"}) return jsonify({'status':1,'msg': "DONE"}) else: return jsonify({'status':1,'msg': "DEBUG enabled"})
def get(self, id): client_list = [] if not id: #get all APs status if not current_app.config['NO_UNIFI']: account = Account().query.filter_by( id=current_user.account_id).first() settings = account.get_settings() if not settings: current_app.logger.debug( "No Settings Entry in User table!! %s " % (request.url)) return jsonify({ 'status': 0, 'msg': 'Error while loading settings' }) if current_user.type == 'admin': sites = Wifisite.query.filter_by( account_id=current_user.account_id).all() elif current_user.type == 'client': sites = Wifisite.query.filter_by( client_id=current_user.id).all() if sites: try: c = Controller(settings['unifi_server'], settings['unifi_user'], settings['unifi_pass'], version='v4', site_id='default', port=settings['unifi_port']) except: msg = 'Exception while trying to do Unifi Login check controller ip/username/password' current_app.logger.exception(msg) return jsonify({'status': 1, 'data': [], 'error': msg}) for site in sites: try: site_clients = c.get_clients(site_id=site.unifi_id) for site_client in site_clients: if site_client.get('is_guest'): client_list.append( guest_status_generate( site_client, site.name)) except: msg = 'Exception while fetching Clients for site:%s check siteid' % site.name current_app.logger.exception(msg) return jsonify({ 'status': 1, 'data': [], 'error': msg }) else: client_list = [ [ 'SITE1', '11:22:33:44:55:66', '11:22:33:44:55:66', "40", '00:41', '<span class="label label-success">Authorized</span>' ], [ 'SITE1', '11:22:33:44:55:66', '11:22:33:44:55:66', "40", '00:41', '<span class="label label-success">Authorized</span>' ], [ 'SITE1', '11:22:33:44:55:66', '11:22:33:44:55:66', "40", '00:41', '<span class="label label-success">Authorized</span>' ] ] else: if not current_app.config['NO_UNIFI']: account = Account().query.filter_by( id=current_user.account_id).first() settings = account.get_settings() wifisite = Wifisite.query.filter_by(id=id).first() if not settings: current_app.logger.debug( "No Settings Entry in User table!! %s " % (request.url)) return jsonify({ 'status': 0, 'msg': 'Error while loading settings' }) if current_user.type == 'admin': wifisite = Wifisite.query.filter( and_(Wifisite.id == id, Wifisite.account_id == current_user.account_id)).first() elif current_user.type == 'client': wifisite = Wifisite.query.filter( and_(Wifisite.id == id, Wifisite.client_id == current_user.id)).first() if wifisite: try: c = Controller(settings['unifi_server'], settings['unifi_user'], settings['unifi_pass'], version='v4', site_id='default', port=settings['unifi_port']) except: msg = 'Exception while trying to do Unifi Login check controller ip/username/password' current_app.logger.exception(msg) return jsonify({'status': 1, 'data': [], 'error': msg}) try: site_clients = c.get_clients(site_id=wifisite.unifi_id) for site_client in site_clients: if site_client.get('is_guest'): client_list.append( guest_status_generate( site_client, wifisite.name)) except: msg = 'Exception while fetching Clients for site:%s check siteid' % wifisite.name current_app.logger.exception(msg) return jsonify({'status': 1, 'data': [], 'error': msg}) else: client_list = [ [ 'SITE1', '11:22:33:44:55:66', '11:22:33:44:55:66', "40", '00:41', '<span class="label label-success">Authorized</span>' ], [ 'SITE1', '11:22:33:44:55:66', '11:22:33:44:55:66', "40", '00:41', '<span class="label label-success">Authorized</span>' ], [ 'SITE1', '11:22:33:44:55:66', '11:22:33:44:55:66', "40", '00:41', '<span class="label label-success">Authorized</span>' ] ] return jsonify({'status': 1, 'data': client_list})
def authorize_guest(track_id): '''Function called after respective auth mechanisms are completed This function send API commands to controller, redirect user to correct URL ''' # #Validate track id and get all the needed variables guest_track = Guesttrack.query.filter_by(track_id=track_id).first() if not guest_track: current_app.logger.error( "Called authorize_guest with wrong track ID:%s" % track_id) abort(404) #validate session associated with this track ID guest_session = Guestsession.query.filter_by( id=guest_track.session_id).first() if not guest_session: current_app.logger.error( "Called authorize_guest with wrong Session from track ID:%s" % track_id) abort(404) #Check if the session is authorized if not guest_session.state == SESSION_AUTHORIZED or guest_session.expiry < arrow.utcnow( ).naive: current_app.logger.error( "Called authorize_guest with wrong Non Authorized session with track ID:%s" % track_id) abort(404) current_app.logger.debug( 'Wifiguest Log - Site ID:%s authorize_guest with trackid :%s' % (guest_track.site_id, guest_track.id)) #Send unifi API commands if the user has completed login duration = guest_session.duration if guest_session.duration else 60 if not current_app.config['NO_UNIFI']: #code to send auth command to controller account = Account().query.filter_by( id=guest_session.site.account_id).first() settings = account.get_settings() try: c = Controller(settings['unifi_server'], settings['unifi_user'], settings['unifi_pass'], '8443', 'v4', guest_track.site.unifi_id) c.authorize_guest(guest_track.device_mac, duration, ap_mac=guest_track.ap_mac) except: current_app.logger.exception( 'Wifiguest Log - Site ID:%s authorize_guest exception with trackid :%s' % (guest_track.site_id, guest_track.id)) abort(500) #update session expiry to now + authorized time guest_session.expiry = arrow.utcnow().replace(minutes=duration + 10).naive db.session.commit() #Code to handle guest after successful login landing_site = Wifisite.query.filter_by(id=guest_track.site_id).first() landing_page = Landingpage.query.filter_by( id=landing_site.default_landing).first() return render_template('guest/%s/show_message.html' % landing_site.template, landing_site=landing_site, landing_page=landing_page)
def get_modal_obj(self): return Account()
def temp_authorize_guest(track_id): '''Function for giving temporary internet access for a client, if TEMP_LOGIN_ENABLED set to True This function send API commands to controller, return ok ''' if not current_app.config['TEMP_LOGIN_ENABLED']: return jsonify({'status':1,'msg': "TEMP Login Disabled"}) #can't use validate_track as return values needed to be json objects guest_track = Guesttrack.query.filter_by(track_id=track_id).first() if not guest_track : current_app.logger.error("Called temp_authorize_guest with wrong track ID:%s"%track_id) return jsonify({'status':0,'msg': "Error"}) if not guest_track.is_temp_authorized(): current_app.logger.error("Called temp_authorize_guest with not authorized track ID:%s"%track_id) return jsonify({'status':0,'msg': "Error"}) landing_site = Wifisite.query.filter_by(id=guest_track.site_id).first() guest_device = Device.query.filter(and_(Device.site_id==landing_site.id,Device.mac==guest_track.device_mac)).first() current_app.logger.debug('Wifiguest Log - Site ID:%s temp_authorize_guest for MAC:%s'%(guest_track.site_id,guest_track.device_mac)) #prevent misuse if guest_device.get_monthly_usage() >= landing_site.monthly_data_limit: current_app.logger.debug('Wifiguest Log - Site ID:%s guest_device MAC:%s exceeded the monthly data limit:%s'%(landing_site.id,guest_device.mac,landing_site.monthly_data_limit)) return jsonify({'status':0,'msg': "Looks like you have exceed your monthly free bandwidth"}) #get all guest_tracks in last 5hrs last5hrs = arrow.utcnow().replace(hours=-5).naive tracks = Guesttrack.query.filter(and_(Guesttrack.site_id==guest_track.site_id,Guesttrack.device_mac==guest_track.device_mac, Guesttrack.timestamp>=last5hrs)).all() total_attemps = 0 for track in tracks: total_attemps += track.temp_login if total_attemps >= 5 and guest_track.demo != 1 : current_app.logger.info('Wifiguest Log - Site ID:%s temp_authorize_guest max tries reached for MAC:%s'%(guest_track.site_id,guest_track.device_mac)) return jsonify({'status':0,'msg': "You have already used up temporary logins for today"}) else: guest_track.temp_login += 1 db.session.commit() #create a new session guest_session = Guestsession(site=landing_site,device=guest_device) guest_session.state = guest_track.state guest_session.mac = guest_device.mac guest_session.guesttracks.append(guest_track) db.session.add(guest_session) guest_track.session_id = guest_session.id db.session.commit() #get details from track ID and authorize if not current_app.config['NO_UNIFI'] : account = Account().query.filter_by(id=guest_session.site.account_id).first() settings = account.get_settings() try: c = Controller(settings['unifi_server'], settings['unifi_user'], settings['unifi_pass'],'8443','v4',guest_track.site.unifi_id) c.authorize_guest(guest_track.device_mac,5,ap_mac=guest_track.ap_mac) except: current_app.logger.exception('Exception occured while trying to authorize User') return jsonify({'status':0,'msg': "Error!!"}) return jsonify({'status':1,'msg': "DONE"}) else: return jsonify({'status':1,'msg': "DEBUG enabled"})
def authorize_guest(track_id,guest_track,landing_site,guest_device): '''Function called after respective auth mechanisms are completed This function send API commands to controller, redirect user to correct URL ''' #validate guest_track if not guest_track.is_authorized(): current_app.logger.error('Wifiguest Log - Site ID:%s guest_device MAC:%s tried to \ %s without being authorized'%(landing_site.id,guest_track.device_mac,request.url)) abort(404) if guest_track.state == GUESTRACK_VOUCHER_AUTH: voucher = Voucher.query.filter(and_(Voucher.device_id==guest_device.id,Voucher.site_id==landing_site.id)).first() if not voucher: current_app.logger.error('Wifiguest Log - Site ID:%s guest_device MAC:%s tried to \ %s with GUESTRACK_VOUCHER_AUTH but no proper voucher '%(landing_site.id,guest_track.device_mac,request.url)) abort(404) duration = guest_track.duration else: duration = landing_site.session_timelimit or 60 #create a new session guest_session = Guestsession(site=landing_site,device=guest_device) guest_session.state = guest_track.state guest_session.mac = guest_device.mac guest_session.guesttracks.append(guest_track) db.session.add(guest_session) guest_track.session_id = guest_session.id if guest_track.state == GUESTRACK_VOUCHER_AUTH: voucher.sessions.append(guest_session) guest_session.voucher_id = voucher.id db.session.commit() if not current_app.config['NO_UNIFI'] : #code to send auth command to controller account = Account().query.filter_by(id=guest_session.site.account_id).first() settings = account.get_settings() try: c = Controller(settings['unifi_server'], settings['unifi_user'], settings['unifi_pass'],'8443','v4',guest_track.site.unifi_id) c.authorize_guest(guest_track.device_mac,duration,ap_mac=guest_track.ap_mac) except: current_app.logger.exception('Wifiguest Log - Site ID:%s guest_device MAC:%s tried to \ %s with but exception while connecting to controller '%(landing_site.id,guest_track.device_mac,request.url)) abort(500) #time.sleep(5) #Code to handle guest after successful login #if guest_track.site.redirect_method == REDIRECT_ORIG_URL and guest_track.orig_url: #return redirect(format_url(guest_track.orig_url),code=302) #elif guest_track.site.redirect_url: #redirect User to default URL if configured # return redirect(format_url(guest_track.site.redirect_url),code=302) #else: #redirect user to google.com redirect_url = landing_site.redirect_url or 'http://www.unifispot.com' landing_page = Landingpage.query.filter_by(id=landing_site.default_landing).first() return render_template('guest/%s/show_message.html'%landing_site.template,landing_site=landing_site,landing_page=landing_page,redirect_url=redirect_url)
def init_data(session): account1 = Account(name='Account1') account2 = Account(name='Account2') account3 = Account(name='Account3') account4 = Account(name='Account4') account5 = Account(name='Account5') session.add(account1) session.add(account2) session.add(account3) session.add(account4) session.add(account5) ##----------------Add users which will be used always--------- enc_pass = encrypt_password('zaqxswcdevfr1') admin_user1 = Admin(email='*****@*****.**',password=enc_pass,displayname= "Admin1",active=1) admin_user2 = Admin(email='*****@*****.**',password=enc_pass,displayname= "Admin2",active=1) admin_user3 = Admin(email='*****@*****.**',password=enc_pass,displayname= "TEST Admin1",active=1) admin_user4 = Admin(email='*****@*****.**',password=enc_pass,displayname= "TEST Admin2",active=1) admin_user5 = Admin(email='*****@*****.**',password=enc_pass,displayname= "TEST Admin3",active=1) admin_user6 = Admin(email='*****@*****.**',password=enc_pass,displayname= "TEST Admin4",active=1) session.add(admin_user1) session.add(admin_user2) session.add(admin_user3) session.add(admin_user4) session.add(admin_user5) session.add(admin_user6) admin_user1.account = account1 admin_user2.account = account1 admin_user3.account = account2 admin_user4.account = account2 admin_user5.account = account2 admin_user6.account = account2 enc_pass = encrypt_password('zaqxswcdevfr1') client_user1 = Client(email='*****@*****.**',password=enc_pass,displayname= "client1",active=1) client_user2 = Client(email='*****@*****.**',password=enc_pass,displayname= "client2",active=1) client_user3 = Client(email='*****@*****.**',password=enc_pass,displayname= "client2",active=1) session.add(client_user1) session.add(client_user2) session.add(client_user3) client_user1.account = account1 client_user2.account = account2 client_user3.account = account1 # #------------site1 will be configured with some basic settings for the landing page-- #Used to test social landing site1 = Wifisite(name='Client1 Site1',unifi_id='site1',auth_fb_like=1,timezone="Europe/Copenhagen",auth_method= AUTH_TYPE_ALL) site2 = Wifisite(name='Client1 Site2',unifi_id='site2',timezone="Europe/Copenhagen",auth_method= AUTH_TYPE_ALL) site3 = Wifisite(name='Client2 Site1',unifi_id='site3',timezone="Europe/Copenhagen",auth_method= AUTH_TYPE_ALL) session.add(site1) session.add(site2) session.add(site3) site1.account = account1 site2.account = account1 site3.account = account2 site1.client = client_user1 site2.client = client_user1 site3.client = client_user2 session.commit() landing1 = Landingpage() landing1.site = site1 site1.landingpages.append(landing1) session.add(landing1) session.commit() site1.default_landing = landing1.id landing2 = Landingpage() landing2.site = site2 session.add(landing2) session.commit() site2.landingpages.append(landing2) session.add(landing2) site2.default_landing = landing2.id session.commit() landing3 = Landingpage() landing3.site = site3 session.add(landing3) session.commit() site3.landingpages.append(landing3) session.add(landing3) site3.default_landing = landing3.id session.commit()
def celery_session_monitor(*args, **kwargs): current_app.logger.info( '-----------Running celery_session_monitor-----------------------') sites = Wifisite.query.all() for site in sites: if site.enable_session_limit or site.voucher_login_en(): current_app.logger.info( 'celery_session_monitor processing Site:%s' % site.name) account = Account().query.filter_by(id=site.account_id).first() settings = account.get_settings() try: c = Controller(settings['unifi_server'], settings['unifi_user'], settings['unifi_pass'], '8443', 'v4', site.unifi_id) #get all STAs stas = c.get_clients() for sta in stas: if sta.get('is_guest') and sta.get('authorized'): rx_bytes = int(sta.get('rx_bytes')) tx_bytes = int(sta.get('tx_bytes')) total_data = rx_bytes + tx_bytes data_mb = int(math.ceil((total_data / 1024000.0))) mac = sta.get('mac') guest_session = Guestsession.query.filter_by( site_id=site.id, mac=mac).first() if not guest_session: current_app.logger.debug( 'MAC:%s in site:%s have no session' % (mac, site.name)) continue current_app.logger.debug( 'MAC:%s in site:%s seems to have used \ data:%s Mb' % (mac, site.name, data_mb)) if guest_session.state == GUESTRACK_VOUCHER_AUTH: #if voucher authorized check for balance data in voucher current_app.logger.debug( 'MAC:%s in site:%s seems to have authorized via Voucher ' % (mac, site.name)) voucher = Voucher.query.filter_by( site_id=site.id, device_id=guest_session.device_id).first() if not voucher: current_app.logger.error( 'MAC:%s in site:%s no_voucher found ' % (mac, site.name)) continue if data_mb > voucher.data_available(): current_app.logger.debug( 'MAC:%s in site:%s seems to have exceeded voucher:%s limit \ hence disconnecting' % (mac, site.name, voucher.id)) #if not voucher authorized check if device exceeded session limit if session limit is enabled else: if site.enable_session_limit and data_mb > int( site.daily_data_limit): current_app.logger.debug( 'MAC:%s in site:%s seems to have exceeded data \ hence disconnecting' % (mac, site.name)) c.unauthorize_guest(mac) except: current_app.logger.exception( 'Exception while monitoring site:%s' % site.name)
def demo_init(): with app.app_context(): from sqlalchemy.exc import OperationalError from flask_security.utils import encrypt_password from unifispot.models import User from unifispot.superadmin.models import Account from unifispot.admin.models import Admin from unifispot.client.models import Client, Wifisite, Landingpage, Voucherdesign from unifispot.guest.models import Guest import arrow from random import randint from unifispot.analytics.models import Sitestat from unifispot.base.utils.helper import get_random_integers from faker import Factory fake = Factory.create() try: account = Account.query.filter_by(id=1).first() except: app.logger.debug( "No Account table Entry found,could be running migration ") else: if not account: #create default admin user enc_pass = encrypt_password('password') account = Account() db.session.add(account) admin_user = Admin(email='*****@*****.**', password=enc_pass, displayname="Admin User1", active=1) admin_user2 = Admin(email='*****@*****.**', password=enc_pass, displayname="Admin User2", active=1) admin_user3 = Admin(email='*****@*****.**', password=enc_pass, displayname="Admin User3", active=1) admin_user.account = account admin_user2.account = account admin_user3.account = account db.session.add(admin_user) db.session.add(admin_user2) db.session.add(admin_user3) client_user1 = Client(email='*****@*****.**', password=enc_pass, displayname="client1", active=1) db.session.add(client_user1) client_user1.account = account site1 = Wifisite(name='Client1 Site1', unifi_id='site1', auth_fb_like=1, timezone="Europe/Copenhagen", auth_method=AUTH_TYPE_ALL, smsauth=1) db.session.add(site1) site1.account = account site1.client = client_user1 landing1 = Landingpage() landing1.site = site1 site1.landingpages.append(landing1) db.session.add(landing1) db.session.commit() site1.default_landing = landing1.id design1 = Voucherdesign() design1.site = site1 db.session.add(design1) db.session.commit() site2 = Wifisite(name='Client1 Site2', unifi_id='site1', auth_fb_like=1, timezone="Europe/Copenhagen", auth_method=AUTH_TYPE_ALL, smsauth=1) db.session.add(site2) site2.account = account site2.client = client_user1 landing2 = Landingpage() landing2.site = site2 site1.landingpages.append(landing2) db.session.add(landing2) db.session.commit() design2 = Voucherdesign() design2.site = site2 db.session.add(design2) site1.default_landing = landing2.id db.session.commit() ##-----------------------Stats for site1 now = arrow.now() month_start = now.floor('month') days = (now.ceil('month') - month_start).days for i in range(days): day_key = month_start.replace(days=i).floor('day').naive daystat = Sitestat(site_id=site1.id, date=day_key) num_visits = randint(10, 50) num_logins = randint(5, num_visits) num_newlogins = randint(5, num_logins) logins = get_random_integers(4, num_logins) daystat.num_visits = num_visits daystat.num_likes = randint(1, 10) daystat.num_checkins = randint(1, 10) daystat.num_newlogins = num_newlogins daystat.num_repeats = num_logins - num_newlogins daystat.num_emails = logins[0] daystat.num_fb = logins[1] daystat.num_vouchers = logins[2] daystat.num_phones = logins[3] db.session.add(daystat) db.session.commit() ##-----------------------Stats for site2 for i in range(days): day_key = month_start.replace(days=i).floor('day').naive daystat = Sitestat(site_id=site2.id, date=day_key) num_visits = randint(10, 50) num_logins = randint(5, num_visits) num_newlogins = randint(5, num_logins) logins = get_random_integers(4, num_logins) daystat.num_visits = num_visits daystat.num_likes = randint(1, 10) daystat.num_checkins = randint(1, 10) daystat.num_newlogins = num_newlogins daystat.num_repeats = num_logins - num_newlogins daystat.num_emails = logins[0] daystat.num_fb = logins[1] daystat.num_vouchers = logins[2] daystat.num_phones = logins[3] db.session.add(daystat) db.session.commit() ##------------------guests for site1 for i in range(100): db.session.add( Guest(firstname=fake.first_name(), lastname=fake.last_name(), email=fake.email())) db.session.commit()
def get(self, id): ap_list = [] if not id: #get all APs status if not current_app.config['NO_UNIFI']: account = Account().query.filter_by( id=current_user.account_id).first() settings = account.get_settings() if not settings: current_app.logger.debug( "No Settings Entry in User table!! %s " % (request.url)) return jsonify({ 'status': 0, 'msg': 'Error while loading settings' }) else: c = Controller(settings['unifi_server'], settings['unifi_user'], settings['unifi_pass'], version='v4', site_id='default') if current_user.type == 'admin': sites = Wifisite.query.filter_by( account_id=current_user.account_id).all() elif current_user.type == 'client': sites = Wifisite.query.filter_by( client_id=current_user.id).all() if sites: for site in sites: site_aps = c.get_aps(site_id=site.unifi_id) for site_ap in site_aps: ap_list.append([ site_ap.get('mac'), site_ap.get('name'), site.name, ap_status_generate(site_ap.get('state')) ]) else: ap_list = [[ '11:22:33:44:55:66', "AP1", 'SITE1', '<span class="label label-success">AP Active</span>' ], [ '11:22:33:44:55:66', "AP4", 'SITE4', ap_status_generate(2) ], [ '11:22:33:44:55:66', "AP1", 'SIT31', ap_status_generate(1) ], [ '11:22:33:44:55:66', "AP1", 'SITE1', ap_status_generate(1) ]] else: if not current_app.config['NO_UNIFI']: account = Account().query.filter_by( id=current_user.account_id).first() settings = account.get_settings() if current_user.type == 'admin': wifisite = Wifisite.query.filter( and_(Wifisite.id == id, Wifisite.account_id == current_user.account_id)).first() elif current_user.type == 'client': wifisite = Wifisite.query.filter( and_(Wifisite.id == id, Wifisite.client_id == current_user.id)).first() if not settings: current_app.logger.debug( "No Settings Entry in User table!! %s " % (request.url)) return jsonify({ 'status': 0, 'msg': 'Error while loading settings' }) if wifisite: c = Controller(settings['unifi_server'], settings['unifi_user'], settings['unifi_pass'], version='v4', site_id='default') site_aps = c.get_aps(site_id=wifisite.unifi_id) for site_ap in site_aps: ap_list.append([ site_ap.get('mac'), site_ap.get('name'), wifisite.name, ap_status_generate(site_ap.get('state')) ]) else: ap_list = [[ '11:22:33:44:55:66', "AP1", 'SITE1', ap_status_generate(1) ], [ '11:22:33:44:55:66', "AP4", 'SITE4', ap_status_generate(2) ], [ '11:22:33:44:55:66', "AP1", 'SIT31', ap_status_generate(1) ], [ '11:22:33:44:55:66', "AP1", 'SITE1', ap_status_generate(1) ]] return jsonify({'status': 1, 'data': ap_list})