Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
5df8e24
Update pipeline-config.yaml (#440)
bkaiserinfosec Dec 30, 2023
c3fb035
Update tox.ini (#441)
bkaiserinfosec Dec 30, 2023
57a681a
Feature/fix toxi (#443)
bkaiserinfosec Dec 30, 2023
b3d741c
Feature/fix toxi (#445)
bkaiserinfosec Dec 30, 2023
f62e0d1
Feature/fix toxi (#447)
bkaiserinfosec Dec 31, 2023
5c40b88
Feature/fix toxi (#449)
bkaiserinfosec Jan 1, 2024
b8d2775
Update Jenkinsfile (#452)
bkaiserinfosec Jan 4, 2024
9e4030d
Feature/jenkinsfile updates (#453)
bkaiserinfosec Jan 8, 2024
fb5d50f
Feature/jenkinsfile updates (#455)
bkaiserinfosec Jan 8, 2024
deaed40
Merge branch 'main' into release/0.2.0-beta/Test-1
bkaiserinfosec Jan 8, 2024
22fc757
Feature/jenkinsfile updates (#457)
bkaiserinfosec Jan 8, 2024
48869b8
Feature/jenkinsfile updates (#459)
bkaiserinfosec Jan 8, 2024
b88f33e
Feature/jenkinsfile updates (#461)
bkaiserinfosec Jan 8, 2024
3058cc8
Feature/jenkinsfile updates (#463)
bkaiserinfosec Jan 8, 2024
eae9cfd
Feature/jenkinsfile updates (#465)
bkaiserinfosec Jan 8, 2024
b1d3586
Feature/jenkinsfile updates (#467)
bkaiserinfosec Jan 10, 2024
a688f72
Feature/jenkinsfile updates (#469)
bkaiserinfosec Jan 10, 2024
d0edd8f
Update Jenkinsfile
bkaiserinfosec Jan 13, 2024
6bc2607
Update pipeline-config.yaml
bkaiserinfosec Jan 13, 2024
4e2bc4a
Update values.yaml
bkaiserinfosec Jan 13, 2024
fba2f2b
Update values.yaml
bkaiserinfosec Jan 13, 2024
1a298c0
Update Jenkinsfile
bkaiserinfosec Jan 15, 2024
ef00ba5
Update values.yaml
bkaiserinfosec Jan 15, 2024
f497be3
Update pipeline-config.yaml
bkaiserinfosec Jan 17, 2024
ee6d9dd
Feature/jenkinsfile updates (#473)
bkaiserinfosec Jan 17, 2024
22a872b
Feature/jenkinsfile updates (#474)
bkaiserinfosec Feb 27, 2024
64ed436
Merge branch 'main' into release/0.1.0-beta/Prod-azure
bkaiserinfosec Feb 27, 2024
1169457
Feature/jenkinsfile updates (#476)
bkaiserinfosec Feb 27, 2024
4b6af0b
Feature/jenkinsfile updates (#478)
bkaiserinfosec Feb 28, 2024
cebffc6
Update pipeline-config.yaml
bkaiserinfosec Feb 28, 2024
38282ba
Feature/jenkinsfile updates (#481)
bkaiserinfosec Feb 28, 2024
86da6a0
Feature/jenkinsfile updates (#483)
bkaiserinfosec Feb 28, 2024
e019ade
Feature/jenkinsfile updates (#485)
bkaiserinfosec Mar 9, 2024
33e0b20
Feature/jenkinsfile updates (#487)
bkaiserinfosec Mar 9, 2024
509a6f1
Update pipeline-config.yaml
bkaiserinfosec Mar 9, 2024
a52196c
Feature/jenkinsfile updates (#490)
bkaiserinfosec Mar 9, 2024
716c878
Merge branch 'main' into release/0.1.0-beta/Prod-azure
bkaiserinfosec Mar 9, 2024
0f39204
Update pipeline-config.yaml
bkaiserinfosec Mar 9, 2024
ce79251
Update Jenkinsfile (#493)
bkaiserinfosec Mar 10, 2024
686ae51
Update security_quality_gate.py (#495)
bkaiserinfosec Mar 13, 2024
b4c8b1d
Feature/update jenkins config (#497)
bkaiserinfosec Mar 13, 2024
0cc02a4
Feature/update security gate config (#499)
bkaiserinfosec Mar 13, 2024
1b2577e
Merge branch 'main' into release/0.1.0-beta/Prod-azure
bkaiserinfosec Mar 13, 2024
0cab74c
Feature/update settings function (#501)
bkaiserinfosec Mar 18, 2024
a598136
Feature/update release based db settings (#503)
bkaiserinfosec Mar 18, 2024
bc17dcc
Feature/update release based db settings (#505)
bkaiserinfosec Mar 18, 2024
14e819d
Merge branch 'main' into release/0.1.0-beta/Prod-azure
bkaiserinfosec Mar 18, 2024
334bc68
Feature/fix db syntax (#507)
bkaiserinfosec Mar 18, 2024
24a95b3
Feature/fix db syntax (#509)
bkaiserinfosec Mar 18, 2024
74b26f7
Merge branch 'main' into release/0.1.0-beta/Prod-azure
bkaiserinfosec Mar 18, 2024
0b07ab0
Feature/fix syntax error (#511)
bkaiserinfosec Mar 18, 2024
e246ba0
Feature/fix syntax error (#513)
bkaiserinfosec Mar 18, 2024
4cf2ebf
Merge branch 'main' into release/0.1.0-beta/Prod-azure
bkaiserinfosec Mar 18, 2024
f98f329
Feature/fix syntax error (#515)
bkaiserinfosec Mar 20, 2024
e50317f
Feature/fix syntax error (#517)
bkaiserinfosec Mar 22, 2024
6eb3118
Merge branch 'main' into release/0.1.0-beta/Prod-azure
bkaiserinfosec Mar 22, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
430 changes: 217 additions & 213 deletions src/config_engine.py

Large diffs are not rendered by default.

3 changes: 1 addition & 2 deletions src/run.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,9 @@
import datetime
import os
from vr.admin.oauth2 import config_oauth
from config_engine import ENV, INSECURE_OAUTH


if ENV == 'test' or INSECURE_OAUTH:
if app.config['ENV'] == 'test' or app.config['INSECURE_OAUTH']:
os.environ['AUTHLIB_INSECURE_TRANSPORT'] = '1'
else:
os.environ['AUTHLIB_INSECURE_TRANSPORT'] = '0'
Expand Down
102 changes: 71 additions & 31 deletions src/vr/__init__.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
import datetime
import requests
from config_engine import ENV, PROD_DB_URI, AUTH_TYPE, APP_EXT_URL, LDAP_HOST, LDAP_PORT, LDAP_BASE_DN, \
LDAP_USER_DN, LDAP_GROUP_DN, LDAP_USER_RDN_ATTR, LDAP_USER_LOGIN_ATTR, LDAP_BIND_USER_DN, LDAP_BIND_USER_PASSWORD, \
AZAD_CLIENT_ID, AZAD_CLIENT_SECRET, AZAD_AUTHORITY, JENKINS_USER, JENKINS_ENABLED
from config_engine import getConfigs
from flask import Flask
from flask_bootstrap import Bootstrap
from flask_login import LoginManager
Expand All @@ -11,8 +9,7 @@
from flask_wtf.csrf import CSRFProtect
from flaskext.markdown import Markdown
from vr.db_models.setup import _init_db
if AUTH_TYPE == 'ldap':
from flask_ldap3_login import LDAP3LoginManager

import base64
import logging
import sys
Expand All @@ -31,48 +28,41 @@
from requests.auth import HTTPBasicAuth
from vr.db_models.updates import createNewTables

if AUTH_TYPE == 'azuread':

app = Flask(__name__)

getConfigs(app.config)

if app.config['AUTH_TYPE'] == 'azuread':
from flask_session import Session
import msal
from flask import session, url_for

if app.config['AUTH_TYPE'] == 'ldap':
from flask_ldap3_login import LDAP3LoginManager

app = Flask(__name__)
moment = Moment(app)
Markdown(app)
csrf = CSRFProtect(app)

app.config['APP_EXT_URL'] = APP_EXT_URL

app.config['RUNTIME_ENV'] = ENV
app.config['RUNTIME_ENV'] = app.config['ENV']
if app.config['RUNTIME_ENV'] == 'test':
DB_URI = 'sqlite:///database.db'
import sqlite3
else:
DB_URI = PROD_DB_URI
DB_URI = app.config['PROD_DB_URI']
import mysql.connector

app.config['SQLALCHEMY_DATABASE_URI'] = DB_URI
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

if AUTH_TYPE == 'ldap':
# LDAP Configuration
app.config['LDAP_HOST'] = LDAP_HOST
app.config['LDAP_PORT'] = LDAP_PORT
app.config['LDAP_BASE_DN'] = LDAP_BASE_DN
app.config['LDAP_USER_DN'] = LDAP_USER_DN
app.config['LDAP_GROUP_DN'] = LDAP_GROUP_DN
app.config['LDAP_USER_RDN_ATTR'] = LDAP_USER_RDN_ATTR
app.config['LDAP_USER_LOGIN_ATTR'] = LDAP_USER_LOGIN_ATTR
app.config['LDAP_BIND_USER_DN'] = LDAP_BIND_USER_DN
app.config['LDAP_BIND_USER_PASSWORD'] = LDAP_BIND_USER_PASSWORD

if app.config['AUTH_TYPE'] == 'ldap':
# Flask-LDAP3-Login Manager
ldap_manager = LDAP3LoginManager(app)
elif AUTH_TYPE == 'azuread':
app.config['CLIENT_ID'] = AZAD_CLIENT_ID
app.config['CLIENT_SECRET'] = AZAD_CLIENT_SECRET
app.config['AUTHORITY'] = AZAD_AUTHORITY
elif app.config['AUTH_TYPE'] == 'azuread':
app.config['CLIENT_ID'] = app.config['AZAD_CLIENT_ID']
app.config['CLIENT_SECRET'] = app.config['AZAD_CLIENT_SECRET']
app.config['AUTHORITY'] = app.config['AZAD_AUTHORITY']
app.config['REDIRECT_PATH'] = "/getAToken"
app.config['ENDPOINT'] = 'https://graph.microsoft.com/v1.0/me/memberOf'
app.config['SCOPE'] = ["User.ReadBasic.All", "Group.Read.All", "Application.Read.All"]
Expand Down Expand Up @@ -151,7 +141,7 @@ def _get_token_from_cache(scope=None):
app.register_blueprint(api)

bootstrap = Bootstrap(app)
if AUTH_TYPE == 'local' or AUTH_TYPE == 'azuread':
if app.config['AUTH_TYPE'] == 'local' or app.config['AUTH_TYPE'] == 'azuread':
login_manager.init_app(app)
login_manager.login_view = 'admin.login'

Expand All @@ -162,9 +152,10 @@ def _get_token_from_cache(scope=None):
app.logger.addHandler(stdout_handler)



@app.template_filter('format_datetime')
def format_datetime(value):
if ENV == 'test':
if app.config['ENV'] == 'test':
try:
formatted = datetime.datetime.strptime(value, "%Y-%m-%dT%H:%M:%S.%f")
except:
Expand All @@ -185,6 +176,8 @@ def base64encode(value):
createNewTables(app)

## Cronjob-like tasks section ##


def train_model_every_six_hours():
scheduler = BackgroundScheduler()
scheduler.add_job(train_model, 'interval', hours=6)
Expand Down Expand Up @@ -220,6 +213,53 @@ def connect_to_db():
cur = db.cursor()
return cur, db

def getPersistentConfig():
try:
cur, db = connect_to_db()
sql = 'SELECT * FROM AppConfig WHERE 1=1'
cur.execute(sql)
row = cur.fetchone()
if row[2]:
app.config['APP_EXT_URL'] = row[3]
app.config['AUTH_TYPE'] = row[4]
app.config['AZAD_AUTHORITY'] = row[5]
app.config['AZAD_CLIENT_ID'] = row[6]
app.config['AZAD_CLIENT_SECRET'] = row[7]
app.config['AZURE_KEYVAULT_NAME'] = row[8]
app.config['ENV'] = row[9]
app.config['INSECURE_OAUTH'] = row[10]
app.config['JENKINS_ENABLED'] = row[37]
app.config['JENKINS_HOST'] = row[11]
app.config['JENKINS_KEY'] = row[12]
app.config['JENKINS_PROJECT'] = row[13]
app.config['JENKINS_STAGING_PROJECT'] = row[14]
app.config['JENKINS_TOKEN'] = row[15]
app.config['JENKINS_USER'] = row[16]
app.config['LDAP_BASE_DN'] = row[17]
app.config['LDAP_BIND_USER_DN'] = row[18]
app.config['LDAP_BIND_USER_PASSWORD'] = row[19]
app.config['LDAP_GROUP_DN'] = row[20]
app.config['LDAP_HOST'] = row[21]
app.config['LDAP_PORT'] = row[22]
app.config['LDAP_USER_DN'] = row[23]
app.config['LDAP_USER_LOGIN_ATTR'] = row[24]
app.config['LDAP_USER_RDN_ATTR'] = row[25]
app.config['PROD_DB_URI'] = row[26]
app.config['SMTP_ADMIN_EMAIL'] = row[27]
app.config['SMTP_HOST'] = row[28]
app.config['SMTP_PASSWORD'] = row[29]
app.config['SMTP_USER'] = row[30]
app.config['SNOW_ENABLED'] = row[38]
app.config['SNOW_CLIENT_ID'] = row[31]
app.config['SNOW_CLIENT_SECRET'] = row[32]
app.config['SNOW_INSTANCE_NAME'] = row[33]
app.config['SNOW_PASSWORD'] = row[34]
app.config['SNOW_USERNAME'] = row[35]
app.config['VERSION'] = row[36]
except:
print('AppConfig Database table is either unreachable or not setup.')

getPersistentConfig()

def train_model():
try:
Expand Down Expand Up @@ -337,7 +377,7 @@ def rsa_long_decrypt(priv_obj, msg, length=256):


def get_jenkins_data():
user_check = JENKINS_USER
user_check = app.config['JENKINS_USER']
if user_check != 'changeme':
app.logger.info('Getting Jenkins Data')
cur, db = connect_to_db()
Expand Down Expand Up @@ -452,5 +492,5 @@ def get_jenkins_data():

# Call the Jobs Here #
train_model_every_six_hours()
if JENKINS_ENABLED == 'yes':
if app.config['JENKINS_ENABLED'] == 'yes':
get_jenkins_data_every_hour()
4 changes: 2 additions & 2 deletions src/vr/admin/auth_functions.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import jwt
from time import time
from vr.functions.mysql_db import connect_to_db
from config_engine import ENV
from vr import app


# Error handler
Expand Down Expand Up @@ -49,7 +49,7 @@ def create_api_key(user_id, otp_secret, expires_in=2592000):
def verify_api_key(token):
try:
cur, db = connect_to_db()
if ENV == 'test':
if app.config['ENV'] == 'test':
sql = 'SELECT oc.user_id, u.is_admin FROM oauth2_client oc JOIN oauth2_token ot ON oc.client_id=ot.client_id JOIN User u ON oc.user_id=u.id WHERE ot.id=?'
else:
sql = 'SELECT oc.user_id, u.is_admin FROM oauth2_client oc JOIN oauth2_token ot ON oc.client_id=ot.client_id JOIN User u ON oc.user_id=u.id WHERE ot.id=%s'
Expand Down
8 changes: 4 additions & 4 deletions src/vr/admin/email_alerts.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import smtplib
from email.mime import multipart
from email.mime import text as mimetext
from config_engine import SMTP_HOST, SMTP_USER, SMTP_PASSWORD, SMTP_ADMIN_EMAIL
from vr import app


def send_email(msg_fromaddr, msg_toaddr, msg_subject, msg_body):
Expand All @@ -11,9 +11,9 @@ def send_email(msg_fromaddr, msg_toaddr, msg_subject, msg_body):
msg['To'] = msg_toaddr
msg['Subject'] = msg_subject
msg.attach(mimetext.MIMEText(message, 'html'))
server = smtplib.SMTP(SMTP_HOST)
server = smtplib.SMTP(app.config['SMTP_HOST'])
server.starttls()
server.login(SMTP_USER, SMTP_PASSWORD)
server.login(app.config['SMTP_USER'], app.config['SMTP_PASSWORD'])
server.ehlo()
text = msg.as_string()
server.sendmail(msg_fromaddr, msg_toaddr, text)
Expand All @@ -24,7 +24,7 @@ def send_registration_email(ext_url, username, first_name, last_name, token, ema
msg_subject = "SecuSphere User Registration"
msg_body = generate_registration_msg(ext_url, username, first_name, last_name, token)
try:
send_email(SMTP_ADMIN_EMAIL, email_to, msg_subject, msg_body)
send_email(app.config['SMTP_ADMIN_EMAIL'], email_to, msg_subject, msg_body)
except:
return 'error'

Expand Down
9 changes: 4 additions & 5 deletions src/vr/admin/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from flask_login import UserMixin
from vr import db, app
from vr.functions.mysql_db import connect_to_db
from datetime import datetime, timedelta
from datetime import datetime
import jwt
from vr.admin.helper_functions import hash_password,verify_password
from vr.admin.functions import db_connection_handler
Expand All @@ -17,8 +17,7 @@
OAuth2AuthorizationCodeMixin,
OAuth2TokenMixin,
)
from config_engine import AUTH_TYPE
if AUTH_TYPE == 'ldap':
if app.config['AUTH_TYPE'] == 'ldap':
from vr import ldap_manager

if app.config['RUNTIME_ENV'] == 'test':
Expand Down Expand Up @@ -190,11 +189,11 @@ def verify_username_token(self, token, given_id):
else:
return

if AUTH_TYPE == 'local' or AUTH_TYPE == 'azuread':
if app.config['AUTH_TYPE'] == 'local' or app.config['AUTH_TYPE'] == 'azuread':
@login_manager.user_loader
def load_user(id):
return User.query.get(int(id))
elif AUTH_TYPE == 'ldap':
elif app.config['AUTH_TYPE'] == 'ldap':
# User Loader for LDAP
@login_manager.user_loader
def load_user(user_id):
Expand Down
3 changes: 1 addition & 2 deletions src/vr/admin/routes/forgotpw.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
from vr.admin.email_alerts import send_email, generate_evnt_msg
from vr.functions.timefunctions import return_datetime_now
from vr.admin.helper_functions import hash_password
from config_engine import SMTP_ADMIN_EMAIL
from vr.admin.functions import db_connection_handler


Expand All @@ -32,7 +31,7 @@ def forgotpw():
action_list = [action]
st = 'n'
msg_body = generate_evnt_msg(msg_subject, now, evt_list, action_list, st)
msg_fromaddr = SMTP_ADMIN_EMAIL
msg_fromaddr = app.config['SMTP_ADMIN_EMAIL']
try:
send_email(msg_fromaddr, email, msg_subject, msg_body)
warnmsg = ('pwresetemail', 'success')
Expand Down
3 changes: 1 addition & 2 deletions src/vr/admin/routes/forgotun.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
from vr.admin.models import User, LoginForm
from vr.admin.email_alerts import send_email, generate_evnt_msg
from vr.functions.timefunctions import return_datetime_now
from config_engine import SMTP_ADMIN_EMAIL


NAV_CAT= { "name": "Admin", "url": "admin.admin_dashboard"}
Expand All @@ -28,7 +27,7 @@ def forgotun():
action_list = [action]
st = 'n'
msg_body = generate_evnt_msg(msg_subject,now,evt_list,action_list,st)
msg_fromaddr = SMTP_ADMIN_EMAIL
msg_fromaddr = app.config['SMTP_ADMIN_EMAIL']
try:
send_email(msg_fromaddr, email, msg_subject, msg_body)
warnmsg = ('pwresetemail', 'success')
Expand Down
15 changes: 7 additions & 8 deletions src/vr/admin/routes/login.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,9 @@
from vr.admin.models import User, LoginForm, AuthAttempts, AppConfig
from vr.admin.functions import _auth_user, _entity_permissions_filter, _entity_page_permissions_filter, check_lockout, log_failed_attempt
from vr.admin.functions import db_connection_handler
from config_engine import AUTH_TYPE
if AUTH_TYPE == 'ldap':
if app.config['AUTH_TYPE'] == 'ldap':
from flask_ldap3_login.forms import LDAPLoginForm
elif AUTH_TYPE == 'azuread':
elif app.config['AUTH_TYPE'] == 'azuread':
import requests
import msal
from vr import _build_auth_code_flow, _load_cache, _save_cache, _build_msal_app, _get_token_from_cache
Expand All @@ -35,7 +34,7 @@ def login():
return redirect(url_for('admin.register'))
ad_auth_url = None
warnmsg = ''
if AUTH_TYPE == 'local':
if app.config['AUTH_TYPE'] == 'local':
if current_user.is_authenticated:
flash('You are already logged in.', 'danger')
return redirect(url_for('assets.all_applications'))
Expand All @@ -60,7 +59,7 @@ def login():
mfa_password = resp[2]
# attempt to log the user in
return _login_attempt(user, username, password, userid, form, mfa_password)
elif AUTH_TYPE == 'ldap':
elif app.config['AUTH_TYPE'] == 'ldap':
form = LDAPLoginForm()
if form.validate_on_submit():
# Log the user in
Expand All @@ -71,15 +70,15 @@ def login():
# Print the form errors
print("Form validation failed with errors:", form.errors)
return render_template(LDAP_LOGIN_TEMPLATE, form=form, errors=form.errors)
elif AUTH_TYPE == 'azuread':
elif app.config['AUTH_TYPE'] == 'azuread':
form = LoginForm(request.form)
session["flow"] = _build_auth_code_flow(scopes=app.config['SCOPE'])
ad_auth_url = session["flow"]["auth_uri"]
if form.errors:
warnmsg = (form.errors, 'danger')
return render_template(LOGIN_TEMPLATE, form=form, warnmsg=warnmsg, auth_type=AUTH_TYPE, auth_url=ad_auth_url)
return render_template(LOGIN_TEMPLATE, form=form, warnmsg=warnmsg, auth_type=app.config['AUTH_TYPE'], auth_url=ad_auth_url)

if AUTH_TYPE == 'azuread':
if app.config['AUTH_TYPE'] == 'azuread':
@app.route(app.config['REDIRECT_PATH']) # Its absolute URL must match your app's redirect_uri set in AAD
def authorized():
try:
Expand Down
6 changes: 3 additions & 3 deletions src/vr/admin/routes/logout.py
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
from flask_login import logout_user, login_required
from flask import session, redirect, url_for
from vr.admin import admin
from config_engine import AUTH_TYPE
from vr import app


NAV_CAT= { "name": "Admin", "url": "admin.admin_dashboard"}


if AUTH_TYPE == 'local':
if app.config['AUTH_TYPE'] == 'local':
@admin.route('/logout')
@login_required
def logout():
logout_user()
del session['username']
return redirect(url_for('admin.login'))
elif AUTH_TYPE == 'azuread':
elif app.config['AUTH_TYPE'] == 'azuread':
@admin.route('/logout')
def logout():
logout_user()
Expand Down
Loading