NitinBot002 commited on
Commit
b50d4c9
·
verified ·
1 Parent(s): 0466bc7

Upload 3 files

Browse files
Files changed (3) hide show
  1. Dockerfile +22 -0
  2. app.py +238 -0
  3. requirements.txt +1 -0
Dockerfile ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Use an official Python runtime as a parent image
2
+ FROM python:3.11-slim
3
+
4
+ # Set the working directory in the container
5
+ WORKDIR /app
6
+
7
+ # Copy the current directory contents into the container at /app
8
+ COPY . /app
9
+
10
+ # Install any needed packages specified in requirements.txt
11
+ RUN pip install --no-cache-dir -r requirements.txt
12
+
13
+ # Make port 8000 available to the world outside this container
14
+ EXPOSE 8000
15
+
16
+ # Define environment variable for Flask app and set Flask environment to development
17
+ ENV FLASK_APP=app.py
18
+ ENV FLASK_DEBUG=1
19
+ ENV FLASK_ENV=development
20
+
21
+ # Run app.py when the container launches
22
+ CMD ["flask", "run", "--host=0.0.0.0", "--port=8000"]
app.py ADDED
@@ -0,0 +1,238 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from flask import Flask, request, redirect, url_for, render_template_string
2
+ import sqlite3
3
+ import threading
4
+ import webbrowser
5
+
6
+ app = Flask(__name__)
7
+ DB_NAME = "risk_system.db"
8
+
9
+ # ---------- DATABASE SETUP ----------
10
+ def init_db():
11
+ conn = sqlite3.connect(DB_NAME)
12
+ cursor = conn.cursor()
13
+
14
+ cursor.execute("""
15
+ CREATE TABLE IF NOT EXISTS risk_list (
16
+ number TEXT PRIMARY KEY,
17
+ risk_level TEXT,
18
+ reviews TEXT
19
+ )
20
+ """)
21
+
22
+ cursor.execute("""
23
+ CREATE TABLE IF NOT EXISTS aadhar_mapping (
24
+ number TEXT PRIMARY KEY,
25
+ aadhar TEXT
26
+ )
27
+ """)
28
+
29
+ cursor.execute("""
30
+ CREATE TABLE IF NOT EXISTS aadhar_numbers (
31
+ aadhar TEXT,
32
+ number TEXT
33
+ )
34
+ """)
35
+
36
+ conn.commit()
37
+ conn.close()
38
+
39
+ init_db()
40
+
41
+ # ---------- HELPER FUNCTIONS ----------
42
+ def get_db():
43
+ return sqlite3.connect(DB_NAME)
44
+
45
+ def check_and_flag(number):
46
+ conn = get_db()
47
+ cursor = conn.cursor()
48
+ result = {"number": number, "risk": None, "reviews": None, "aadhar": None, "linked_numbers": []}
49
+
50
+ # Step 1: Risk List lookup
51
+ cursor.execute("SELECT risk_level, reviews FROM risk_list WHERE number=?", (number,))
52
+ row = cursor.fetchone()
53
+ if row:
54
+ result["risk"] = row[0]
55
+ result["reviews"] = row[1]
56
+
57
+ # Step 2: Aadhaar mapping
58
+ cursor.execute("SELECT aadhar FROM aadhar_mapping WHERE number=?", (number,))
59
+ aadhar_row = cursor.fetchone()
60
+ if aadhar_row:
61
+ aadhar = aadhar_row[0]
62
+ result["aadhar"] = aadhar
63
+
64
+ cursor.execute("SELECT number FROM aadhar_numbers WHERE aadhar=?", (aadhar,))
65
+ linked_numbers = [n[0] for n in cursor.fetchall()]
66
+ result["linked_numbers"] = linked_numbers
67
+
68
+ # Step 3: If risky, flag all linked numbers
69
+ if row:
70
+ for n in linked_numbers:
71
+ cursor.execute("INSERT OR IGNORE INTO risk_list VALUES (?, ?, ?)",
72
+ (n, row[0], "Auto-flagged via Aadhaar link"))
73
+ conn.commit()
74
+
75
+ conn.close()
76
+ return result
77
+
78
+ def add_review(number, review, risk_level="Medium"):
79
+ conn = get_db()
80
+ cursor = conn.cursor()
81
+
82
+ cursor.execute("SELECT reviews FROM risk_list WHERE number=?", (number,))
83
+ row = cursor.fetchone()
84
+ if row:
85
+ updated_reviews = row[0] + " | " + review
86
+ cursor.execute("UPDATE risk_list SET reviews=?, risk_level=? WHERE number=?",
87
+ (updated_reviews, risk_level, number))
88
+ else:
89
+ cursor.execute("INSERT INTO risk_list VALUES (?, ?, ?)", (number, risk_level, review))
90
+
91
+ conn.commit()
92
+ conn.close()
93
+
94
+ def get_all_risks():
95
+ conn = get_db()
96
+ cursor = conn.cursor()
97
+ cursor.execute("SELECT * FROM risk_list")
98
+ rows = cursor.fetchall()
99
+ conn.close()
100
+ return rows
101
+
102
+ # ---------- HTML TEMPLATES ----------
103
+ INDEX_HTML = """
104
+ <!DOCTYPE html>
105
+ <html lang="en">
106
+ <head>
107
+ <meta charset="UTF-8">
108
+ <title>Risk Checker</title>
109
+ <style>
110
+ body { font-family: Arial, sans-serif; margin: 30px; }
111
+ h1 { color: #333; }
112
+ form { margin-bottom: 20px; }
113
+ input, select, button { padding: 8px; margin: 5px; }
114
+ .result { border: 1px solid #ddd; padding: 15px; border-radius: 8px; background: #f9f9f9; }
115
+ .risk { color: red; font-weight: bold; }
116
+ </style>
117
+ </head>
118
+ <body>
119
+ <h1>📞fraud Risk Checker</h1>
120
+
121
+ <!-- Check Number -->
122
+ <form method="POST">
123
+ <input type="text" name="number" placeholder="Enter mobile number" required>
124
+ <button type="submit">Check</button>
125
+ </form>
126
+
127
+ {% if result %}
128
+ <div class="result">
129
+ <h3>Result for {{ result.number }}</h3>
130
+ <p><b>Risk:</b> <span class="risk">{{ result.risk if result.risk else "Not in Risk List" }}</span></p>
131
+ <p><b>Reviews:</b> {{ result.reviews if result.reviews else "None" }}</p>
132
+ <p><b>Aadhaar:</b> {{ result.aadhar if result.aadhar else "Not linked" }}</p>
133
+ <p><b>Linked Numbers:</b> {{ result.linked_numbers if result.linked_numbers else "None" }}</p>
134
+ </div>
135
+ {% endif %}
136
+
137
+ <!-- Add Review -->
138
+ <h3>Add Review</h3>
139
+ <form action="{{ url_for('review_number') }}" method="POST">
140
+ <input type="text" name="number" placeholder="Number" required>
141
+ <input type="text" name="review" placeholder="Write your review" required>
142
+ <select name="risk_level">
143
+ <option value="Low">Low</option>
144
+ <option value="Medium" selected>Medium</option>
145
+ <option value="High">High</option>
146
+ </select>
147
+ <button type="submit">Submit Review</button>
148
+ </form>
149
+
150
+ <p><a href="{{ url_for('seed_data') }}">Seed demo data</a> | <a href="{{ url_for('all_risks') }}">View all risks</a></p>
151
+ </body>
152
+ </html>
153
+ """
154
+
155
+ ALL_RISKS_HTML = """
156
+ <!DOCTYPE html>
157
+ <html lang="en">
158
+ <head>
159
+ <meta charset="UTF-8">
160
+ <title>All Risky Numbers</title>
161
+ <style>
162
+ body { font-family: Arial, sans-serif; margin: 30px; }
163
+ table { border-collapse: collapse; width: 100%; }
164
+ th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
165
+ th { background-color: #f2f2f2; }
166
+ </style>
167
+ </head>
168
+ <body>
169
+ <h1>⚠ All Risky Numbers</h1>
170
+ <table>
171
+ <tr>
172
+ <th>Number</th>
173
+ <th>Risk Level</th>
174
+ <th>Reviews</th>
175
+ </tr>
176
+ {% for row in risks %}
177
+ <tr>
178
+ <td>{{ row[0] }}</td>
179
+ <td>{{ row[1] }}</td>
180
+ <td>{{ row[2] }}</td>
181
+ </tr>
182
+ {% endfor %}
183
+ </table>
184
+ <p><a href="{{ url_for('home') }}">Back</a></p>
185
+ </body>
186
+ </html>
187
+ """
188
+
189
+ # ---------- FLASK ROUTES ----------
190
+ @app.route("/", methods=["GET", "POST"])
191
+ def home():
192
+ result = None
193
+ if request.method == "POST":
194
+ number = request.form.get("number")
195
+ result = check_and_flag(number)
196
+ return render_template_string(INDEX_HTML, result=result)
197
+
198
+ @app.route("/review", methods=["POST"])
199
+ def review_number():
200
+ number = request.form.get("number")
201
+ review = request.form.get("review")
202
+ risk_level = request.form.get("risk_level", "Medium")
203
+ if number and review:
204
+ add_review(number, review, risk_level)
205
+ return redirect(url_for("home"))
206
+
207
+ @app.route("/all")
208
+ def all_risks():
209
+ risks = get_all_risks()
210
+ return render_template_string(ALL_RISKS_HTML, risks=risks)
211
+
212
+ @app.route("/seed")
213
+ def seed_data():
214
+ conn = get_db()
215
+ cursor = conn.cursor()
216
+
217
+ cursor.execute("INSERT OR IGNORE INTO risk_list VALUES (?, ?, ?)",
218
+ ("9999999999", "High", "Fraudulent calls reported"))
219
+
220
+ cursor.execute("INSERT OR IGNORE INTO aadhar_mapping VALUES (?, ?)",
221
+ ("9999999999", "AADHAR123"))
222
+ cursor.execute("INSERT OR IGNORE INTO aadhar_mapping VALUES (?, ?)",
223
+ ("8888888888", "AADHAR123"))
224
+
225
+ cursor.execute("INSERT OR IGNORE INTO aadhar_numbers VALUES (?, ?)", ("AADHAR123", "9999999999"))
226
+ cursor.execute("INSERT OR IGNORE INTO aadhar_numbers VALUES (?, ?)", ("AADHAR123", "8888888888"))
227
+ cursor.execute("INSERT OR IGNORE INTO aadhar_numbers VALUES (?, ?)", ("AADHAR123", "7777777777"))
228
+
229
+ conn.commit()
230
+ conn.close()
231
+ return redirect(url_for("home"))
232
+ def open_browser():
233
+ webbrowser.open_new("http://127.0.0.1:8000/")
234
+
235
+ # ---------- RUN ----------
236
+ if __name__ == "__main__":
237
+ threading.Timer(1, open_browser).start()
238
+ app.run(debug=False, port=8000, use_reloader=False)
requirements.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ flask