Ejemplo n.º 1
0
def ui_host_manager_add(host_uuid):
    host_uuid = validate_uuid(host_uuid)
    host = models.ManagedHost.query.filter_by(uuid=host_uuid).first()
    if not host or current_user not in host.managers:
        abort(403, 'No host found with given id and managed by you')
    form = forms.HostAddManagerForm()
    if form.validate_on_submit():
        email = form.email.data.lower()
        managers = models.Manager.query.filter(
            models.Manager.email.ilike(email))
        if managers.first():
            for manager in managers:
                if host in manager.hosts:
                    abort(403, f"Host already managed by {html.escape(email)}")
                else:
                    manager.hosts.append(host)
        else:
            # create new manager
            manager = models.Manager(email=email)
            db.session.add(manager)
            manager.hosts.append(host)
        db.commit_and_sync()
        return redirect(url_for("ui_host", host_uuid=host_uuid))
    else:
        return render_template('host-manager-add.html',
                               title=f'Add manager for {host.hostname}',
                               host=host,
                               form=form)
Ejemplo n.º 2
0
def init_db():
    # Create all tables
    models.db.create_all()

    bank = [('Beijing Bank', 'Beijing', 0.0),
            ('Shanghai Bank', 'Shanghai', 0.0), ('Hefei Bank', 'Hefei', 0.0),
            ('Nanjing Bank', 'Nanjing', 0.0)]
    staff = [
        ('staff_1', '大司马', '13312312345', '芜湖市起飞区', '2012-08-17', 'depart_1'),
        ('staff_2', '李姐', '13323323333', '理解市李姐万岁', '2019-08-31', 'depart_3'),
        ('staff_3', '韩金龙', '13323311451', '这波市肉弹冲击', '2020-01-31', 'depart_5'),
        ('staff_4', '神魔恋', '17344455555', '李在赣神魔市', '2020-01-01', 'depart_2'),
        ('staff_5', '小王', '18912345678', '北京市海淀区', '2018-01-31', 'depart_4'),
        ('staff_6', '小李', '13012345678', '合肥市包河区', '2018-02-28', 'depart_2'),
        ('staff_7', '小郭', '18900011100', '合肥市蜀山区', '2018-10-31', 'depart_3'),
        ('staff_8', '小史', '18912321232', '广东省深圳市', '2000-01-31', 'depart_3')
    ]

    department = [('depart_1', '市场部', '普通', 'staff_1', 'Beijing Bank'),
                  ('depart_2', '市场部', '普通', 'staff_2', 'Beijing Bank'),
                  ('depart_3', '市场部', '特殊', 'staff_3', 'Shanghai Bank'),
                  ('depart_4', '人事部', '普通', 'staff_4', 'Nanjing Bank'),
                  ('depart_5', '人事部', '普通', 'staff_5', 'Hefei Bank')]

    manager = [
        ('staff_1', 'depart_1'),
        ('staff_2', 'depart_2'),
        ('staff_3', 'depart_3'),
        ('staff_4', 'depart_4'),
        ('staff_5', 'depart_5'),
    ]

    # add Banks
    for item in bank:
        models.db.session.add(models.SubBank(*item))
    # add Staffs without foreign key
    for item in staff:
        models.db.session.add(models.Staff(*item[:-1]))
    # add department without foreign key
    for item in department:
        models.db.session.add(models.Department(*item[:-2]))
    models.db.session.commit()

    # add foreign key
    for item in manager:
        models.db.session.add(models.Manager(*item))
    models.db.session.commit()
    for item in staff:
        result = models.Staff.query.filter(
            models.Staff.s_identity_code == item[0]).first()
        result.s_d_code = item[-1]
        models.db.session.commit()

    for item in department:
        result = models.Department.query.filter(
            models.Department.d_code == item[0]).first()
        result.d_m_identity_code = item[-2]
        result.d_sb_name = item[-1]
        models.db.session.commit()
Ejemplo n.º 3
0
# Initialize the environment and connection to Firebase
config = {
    "apiKey": "AIzaSyCvZiWJAD9pac9LHACfsKupXAAvyN7INAk",
    "authDomain": "gank-5502c.firebaseapp.com",
    "databaseURL": "https://gank-5502c.firebaseio.com",
    "projectId": "gank-5502c",
    "storageBucket": "gank-5502c.appspot.com",
    "messagingSenderId": "591295625571",
    "appId": "1:591295625571:web:8c5fd9f70d0c46b839fb56",
    "measurementId": "G-R9MGVMM9S0"
}
firebase = pyrebase.initialize_app(config)
db = firebase.database()

application = Flask(__name__)
logman = LoginManager(application)
logman.login_view = '/'
logman.login_message = 'Access denied. Please login first.'

manager = models.Manager(db)
manager.setup_email('*****@*****.**', 'Gank1234')


@logman.user_loader
def load_user(userid):
    return manager.get(userid)


from app import routes
from app import extraction
from app.extraction import schemaExtraction
db.session.add(rest2)
db.session.add(mi21)
db.session.add(mi22)

user1 = models.Customer(username="******", email="*****@*****.**")
user1.set_password("jason")

user2 = models.Customer(username="******", email="*****@*****.**")
user2.set_password("paul")

db.session.add(user1)
db.session.add(user2)

# Managers

manager1 = models.Manager(username="******", email="*****@*****.**")
manager1.set_password("pat")

manager2 = models.Manager(username="******", email="*****@*****.**")
manager2.set_password("sal")

rest1.manager.append(manager1)
rest2.manager.append(manager2)

db.session.add(manager1)
db.session.add(manager2)

# Cooks

cook1 = models.Cook(username="******", email="*****@*****.**")
cook1.set_password("khan")
Ejemplo n.º 5
0
def app_init():
    """Get DB from permanent storage if needed. Upgrade database if needed."""
    debug(f"{whoami()} called")
    if db.db_permstore_instance:
        db.db_permstore_instance.get_from_permstore()

    fresh_db = False
    try:
        # baaad hack, but flask_migrate.current() returns nothing, and I don't know how to test if DB is newly created (i.e. sqlite), or existed before
        if not db.engine.dialect.has_table(db.engine, 'alembic_version'):
            # the only reason i know for this is when database is newly created
            # and we definitely should not run db.create_all() before migration!
            fresh_db = True
    except Exception as e:
        error(
            f"got exception while trying to get db revision: {e} (enable debug for more)"
        )
        debug(f"exception follows:", exc_info=True)

    debug("running db.create_all()")
    db.create_all()
    debug("done db.create_all()")

    try:
        if fresh_db:
            info("This is a fresh database, marking it as latest revision")
            run_in_child_process(flask_migrate.stamp)
        else:
            debug("Trying to perform database migration")
            run_in_child_process(flask_migrate.upgrade)
    except Exception as e:
        error(
            f"got exception while trying to upgrade db revision: {e} (enable debug for more)"
        )
        debug(f"exception follows:", exc_info=True)

    if os.environ.get('APP_ENVIRONMENT', None) == "dev":

        if models.Manager.query.count():
            debug(
                "skipping creation of dev objects - database already has objects"
            )
        else:
            debug("creating dev objects")

            host1 = models.ManagedHost(uuid=new_host_uuid(),
                                       hostname='testhost.tld')
            db.session.add(host1)
            host2 = models.ManagedHost(uuid=new_host_uuid(),
                                       hostname='otherhost.dom')
            db.session.add(host2)
            user1 = models.ManagedUser(uuid=new_user_uuid(),
                                       login="******",
                                       host=host1)
            db.session.add(user1)
            user2 = models.ManagedUser(uuid=new_user_uuid(),
                                       login="******",
                                       host=host1)
            db.session.add(user2)
            manager1 = models.Manager()
            manager1.hosts.append(host1)
            manager1.hosts.append(host2)
            db.session.add(manager1)

            db.commit_and_sync()
            debug("done creating dev objects")

            # TODO: remove this in production
            debug("creating built-in objects")
            host = models.ManagedHost.query.filter_by(
                uuid='59e8368c-7dbc-11ea-923e-7cb0c2957d37').first()
            if not host:
                debug("creating host")
                host = models.ManagedHost(uuid=str(
                    uuid.UUID('59e8368c-7dbc-11ea-923e-7cb0c2957d37')),
                                          hostname='john')
                user = models.ManagedUser(uuid=new_user_uuid(),
                                          login='******',
                                          host=host)
                db.session.add(user)
                db.session.add(host)
            manager1 = models.Manager.query.filter_by(
                email='*****@*****.**').first()
            if not manager1:
                debug("creating manager [email protected]")
                manager1 = models.Manager(
                    ext_auth_type=models.ExtAuthTypeGoogleAuth,
                    ext_auth_id='118295366576899719337',
                    email='*****@*****.**')
                manager1.hosts.append(host)
                db.session.add(manager1)
            #manager2 = models.Manager.query.filter_by(email='*****@*****.**').first()
            #if not manager2:
            #    debug("creating manager [email protected]")
            #    manager2 = models.Manager(ext_auth_type=models.ExtAuthTypeGoogleAuth,
            #                              ext_auth_id='103494272264223262600', email='*****@*****.**')
            #    manager2.hosts.append(host)
            #    db.session.add(manager2)
            db.commit_and_sync()
            debug("done creating built-in objects")
            # debug(dumpdata())
    debug(f"{whoami()} finished")
Ejemplo n.º 6
0
def login_callback():
    """Callback for Google Auth"""
    # Get authorization code Google sent back to you
    code = request.args.get("code")

    # Find out what URL to hit to get tokens that allow you to ask for
    # things on behalf of a user
    google_provider_cfg = get_google_provider_cfg()
    token_endpoint = google_provider_cfg["token_endpoint"]

    # Prepare and send a request to get tokens! Yay tokens!
    token_url, headers, body = client.prepare_token_request(
        token_endpoint,
        authorization_response=request.url,
        redirect_url=request.base_url,
        code=code)
    token_response = requests.post(
        token_url,
        headers=headers,
        data=body,
        auth=(GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET),
    )

    # Parse the tokens!
    client.parse_request_body_response(json.dumps(token_response.json()))

    # Now that you have tokens (yay) let's find and hit the URL
    # from Google that gives you the user's profile information,
    # including their Google profile image and email
    userinfo_endpoint = google_provider_cfg["userinfo_endpoint"]
    uri, headers, body = client.add_token(userinfo_endpoint)
    userinfo_response = requests.get(uri, headers=headers, data=body)

    # You want to make sure their email is verified.
    # The user authenticated with Google, authorized your
    # app, and now you've verified their email through Google!
    if userinfo_response.json().get("email_verified"):
        unique_id = userinfo_response.json()["sub"]
        users_email = userinfo_response.json()["email"].lower()
        # picture = userinfo_response.json()["picture"]
        users_name = userinfo_response.json()["given_name"]
    else:
        return "User email not available or not verified by Google.", 400

    # Create a user in your db with the information provided by Google
    user = models.Manager.query.filter_by(
        ext_auth_id=unique_id,
        ext_auth_type=models.ExtAuthTypeGoogleAuth).first()
    if not user:
        # no user with given id, try to search by email among google-hosted users
        user = models.Manager.query.filter_by(
            email=users_email,
            ext_auth_type=models.ExtAuthTypeGoogleAuth).first()
        if not user:
            # no user with this email among google-hosted users, try to search by email with no type set
            user = models.Manager.query.filter(
                db.and_(models.Manager.email == users_email,
                        models.Manager.ext_auth_type == None)).first()
    if user:
        # update user's data if we already have it
        if user.name != users_name: user.name = users_name
        if user.email != users_email: user.email = users_email
        if user.ext_auth_type != models.ExtAuthTypeGoogleAuth:
            user.ext_auth_type = models.ExtAuthTypeGoogleAuth
        # if user.picture != picture: user.picture = picture
    else:
        user = models.Manager(ext_auth_id=unique_id,
                              ext_auth_type=models.ExtAuthTypeGoogleAuth,
                              name=users_name,
                              email=users_email)
        db.session.add(user)
    db.commit_and_sync(sync_priority=SyncPriorityDelayed)

    login_user(user, remember=True)

    return redirect(url_for("webroot"))