• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

marscoin / martianrepublic / 23804883405

31 Mar 2026 03:14PM UTC coverage: 11.195% (+1.8%) from 9.347%
23804883405

push

github

Martian Congress
refactor: Tier 1 — security fixes, route standardization, code style, docs

S9:  File upload path traversal — assert realpath() within allowed dirs,
     sanitize citizen address in file paths
S11: Citizen registry queries capped with LIMIT 100
S12: External HTTP calls — replaced file_get_contents with Http::timeout()
     in CongressController, Wallet/ApiController, AppHelper
A8:  All routes converted to Laravel 9+ array notation
     [Controller::class, 'method']
D2:  Created DEVELOPMENT.md — complete setup guide for contributors
D4:  Laravel Pint code style enforced across 211 files

Tests updated: public route assertions corrected after route syntax
standardization exposed that old string-notation routes never resolved
properly in tests.

127 tests, 251 assertions, 0 PHPStan errors.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

302 of 3262 new or added lines in 58 files covered. (9.26%)

139 existing lines in 24 files now uncovered.

620 of 5538 relevant lines covered (11.2%)

1.54 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

9.56
/app/Http/Controllers/Wallet/DashboardController.php
1
<?php
2

3
namespace App\Http\Controllers\Wallet;
4

5
use App\Http\Controllers\Controller;
6
use App\Includes\AppHelper;
7
use App\Models\Citizen;
8
use App\Models\CivicWallet;
9
use App\Models\Feed;
10
use App\Models\HDWallet;
11
use App\Models\Profile;
12
use App\Models\Proposals;
13
use App\Models\User;
14
use BaconQrCode\Renderer\Image\ImagickImageBackEnd;
15
use BaconQrCode\Renderer\ImageRenderer;
16
use BaconQrCode\Renderer\RendererStyle\RendererStyle;
17
use BaconQrCode\Writer;
18
use Illuminate\Http\Request;
19
use Illuminate\Support\Facades\Auth;
20
use Illuminate\Support\Facades\Cache;
21
use Illuminate\Support\Facades\Log;
22
use Illuminate\Support\Facades\View;
23
use PragmaRX\Google2FA\Google2FA;
24

25
class DashboardController extends Controller
26
{
27
    /**
28
     * Setup the layout used by the controller.
29
     *
30
     * @return void
31
     */
32
    public function __construct() {}
7✔
33

NEW
34
    public function index()
×
35
    {
NEW
36
        return redirect('/wallet/dashboard');
×
37
    }
38

NEW
39
    protected function showLogout()
×
40
    {
41

NEW
42
        if (Auth::check()) {
×
NEW
43
            $uid = Auth::user()->id;
×
NEW
44
            $profile = Profile::where('userid', '=', $uid)->first();
×
45

NEW
46
            $profile->wallet_open = 0;
×
NEW
47
            $profile->civic_wallet_open = 0;
×
NEW
48
            $profile->save();
×
49
        }
50

NEW
51
        Auth::logout();
×
52

NEW
53
        return redirect('/login');
×
54
    }
55

NEW
56
    protected function show2FA(Request $request)
×
57
    {
58

NEW
59
        if (Auth::check()) {
×
NEW
60
            $email = Auth::user()->email;
×
NEW
61
            $uid = Auth::user()->id;
×
NEW
62
            $google2fa = app(Google2FA::class);
×
NEW
63
            $secret = $request->input('secret');
×
NEW
64
            if ($secret) {
×
65
                // Rate limit 2FA attempts: 5 per 15 minutes
NEW
66
                $cacheKey = '2fa_attempts:'.Auth::id();
×
NEW
67
                $attempts = (int) Cache::get($cacheKey, 0);
×
NEW
68
                if ($attempts >= 5) {
×
NEW
69
                    return redirect('/twofa')->with('error', 'Too many failed attempts. Please wait 15 minutes.');
×
70
                }
71

NEW
72
                $view = View::make('wallet.hello2fa');
×
NEW
73
                $view->qrcode_image = null;
×
NEW
74
                $profile = Profile::where('userid', '=', Auth::user()->id)->first();
×
NEW
75
                $google2fa_secret = $profile->twofakey;
×
NEW
76
                $valid = $google2fa->verifyKey($google2fa_secret, $secret);
×
77

NEW
78
                if ($valid) {
×
NEW
79
                    $profile->twofaset = 1;
×
NEW
80
                    $profile->save();
×
NEW
81
                    $view->isvalid = 'Success';
×
82

NEW
83
                    return redirect('wallet/dashboard')->with('success', 'Two-factor authentication enabled! Your account is now secured.');
×
84
                } else {
NEW
85
                    Cache::put($cacheKey, $attempts + 1, now()->addMinutes(15));
×
NEW
86
                    $view->isvalid = 'Failed';
×
87
                }
88

NEW
89
                return $view;
×
90
            } else {
NEW
91
                $profile = Profile::where('userid', '=', Auth::user()->id)->first();
×
92

NEW
93
                if (! $profile) {
×
NEW
94
                    $key = $google2fa->generateSecretKey();
×
NEW
95
                    $g2faUrl = $google2fa->getQRCodeUrl(
×
NEW
96
                        'marscoinwallet',
×
NEW
97
                        $email,
×
NEW
98
                        $key
×
NEW
99
                    );
×
100

NEW
101
                    $profile = new Profile;
×
NEW
102
                    $profile->userid = $uid;
×
NEW
103
                    $profile->twofaset = 0;
×
NEW
104
                    $profile->twofakey = $key;
×
NEW
105
                    $profile->save();
×
NEW
106
                    $writer = new Writer(
×
NEW
107
                        new ImageRenderer(
×
NEW
108
                            new RendererStyle(300),
×
NEW
109
                            new ImagickImageBackEnd
×
NEW
110
                        )
×
NEW
111
                    );
×
112

NEW
113
                    $view = View::make('wallet.hello2fa');
×
NEW
114
                    $view->isvalid = null;
×
NEW
115
                    $view->qrcode_image = base64_encode($writer->writeString($g2faUrl));
×
116

NEW
117
                    return $view;
×
NEW
118
                } elseif ($profile && $profile->twofaset == 0) {
×
119

NEW
120
                    $key = $google2fa->generateSecretKey();
×
NEW
121
                    $g2faUrl = $google2fa->getQRCodeUrl(
×
NEW
122
                        'marscoinwallet',
×
NEW
123
                        $email,
×
NEW
124
                        $key
×
NEW
125
                    );
×
126

NEW
127
                    $profile->userid = $uid;
×
NEW
128
                    $profile->twofakey = $key;
×
NEW
129
                    $profile->save();
×
130

NEW
131
                    $writer = new Writer(
×
NEW
132
                        new ImageRenderer(
×
NEW
133
                            new RendererStyle(300),
×
NEW
134
                            new ImagickImageBackEnd
×
NEW
135
                        )
×
NEW
136
                    );
×
NEW
137
                    $view = View::make('wallet.hello2fa');
×
NEW
138
                    $view->isvalid = null;
×
NEW
139
                    $view->qrcode_image = base64_encode($writer->writeString($g2faUrl));
×
140

NEW
141
                    return $view;
×
142
                }
143
                // else
144
                // {
145
                //         return redirect('wallet/dashboard');
146
                // }
147
            }
148
        } else {
NEW
149
            return redirect('/login');
×
150
        }
151
    }
152

NEW
153
    protected function show2FAChallenge(Request $request)
×
154
    {
NEW
155
        if (Auth::check()) {
×
NEW
156
            $email = Auth::user()->email;
×
NEW
157
            $uid = Auth::user()->id;
×
NEW
158
            $google2fa = app(Google2FA::class);
×
NEW
159
            $secret = $request->input('secret');
×
160

NEW
161
            if ($secret) {
×
162
                // Rate limit 2FA attempts: 5 per 15 minutes
NEW
163
                $cacheKey = '2fa_attempts:'.Auth::id();
×
NEW
164
                $attempts = (int) Cache::get($cacheKey, 0);
×
NEW
165
                if ($attempts >= 5) {
×
NEW
166
                    return redirect('/twofachallenge')->with('error', 'Too many failed attempts. Please wait 15 minutes.');
×
167
                }
168

NEW
169
                $profile = Profile::where('userid', '=', Auth::user()->id)->first();
×
NEW
170
                $google2fa_secret = $profile->twofakey;
×
NEW
171
                $valid = $google2fa->verifyKey($google2fa_secret, $secret);
×
NEW
172
                if ($valid) {
×
NEW
173
                    Cache::forget($cacheKey);
×
174

NEW
175
                    $profile->openchallenge = 0;
×
NEW
176
                    $profile->save();
×
177

NEW
178
                    return redirect('wallet/dashboard');
×
179
                } else {
NEW
180
                    Cache::put($cacheKey, $attempts + 1, now()->addMinutes(15));
×
NEW
181
                    $view = View::make('wallet.challenge2fa');
×
182

NEW
183
                    return $view;
×
184
                }
185
            } else {
NEW
186
                $view = View::make('wallet.challenge2fa');
×
187

NEW
188
                return $view;
×
189
            }
190
        } else {
NEW
191
            return redirect('/login');
×
192
        }
193
    }
194

NEW
195
    protected function showChallenge()
×
196
    {
NEW
197
        if (Auth::check()) {
×
198
            // check if 2FA is on. If not, go to 2FA screen first
NEW
199
            $uid = Auth::user()->id;
×
NEW
200
            $profile = Profile::where('userid', '=', $uid)->first();
×
NEW
201
            if (! $profile) {
×
NEW
202
                return redirect('/twofa');
×
203
            } else {
NEW
204
                $is2faset = $profile->twofaset;
×
NEW
205
                $profile->openchallenge = 1;
×
NEW
206
                $profile->wallet_open = 0;
×
NEW
207
                $profile->save();
×
NEW
208
                if (! $is2faset) {
×
NEW
209
                    return redirect('/twofa');
×
210
                } else {
NEW
211
                    return redirect('/twofachallenge');
×
212
                }
213
            }
214
        } else {
NEW
215
            return redirect('/login');
×
216
        }
217
    }
218

NEW
219
    protected function showDashboard()
×
220
    {
NEW
221
        if (Auth::check()) {
×
NEW
222
            $uid = Auth::user()->id;
×
NEW
223
            $profile = Profile::where('userid', '=', $uid)->first();
×
NEW
224
            $wallet = HDWallet::where('user_id', '=', $uid)->get();
×
NEW
225
            $civic_wallet = CivicWallet::where('user_id', '=', $uid)->first();
×
NEW
226
            if (! $profile) {
×
NEW
227
                return redirect('/twofa');
×
228
            } else {
NEW
229
                if ($profile->openchallenge == 1 || is_null($profile->openchallenge)) {
×
NEW
230
                    return redirect('/twofachallenge');
×
231
                }
232
            }
NEW
233
            $view = View::make('wallet.dashboard');
×
NEW
234
            $view->public_addr = '';
×
235

236
            // Collect ALL wallet addresses for this user
NEW
237
            $allAddresses = [];
×
NEW
238
            if ($civic_wallet) {
×
NEW
239
                $allAddresses[] = $civic_wallet->public_addr;
×
240
            }
NEW
241
            $hdWallets = HDWallet::where('user_id', '=', $uid)->get();
×
NEW
242
            foreach ($hdWallets as $hw) {
×
NEW
243
                if (! in_array($hw->public_addr, $allAddresses)) {
×
NEW
244
                    $allAddresses[] = $hw->public_addr;
×
245
                }
246
            }
247

NEW
248
            $isWalletOpen = ($profile->civic_wallet_open > 0 || $profile->wallet_open > 0);
×
249

NEW
250
            if ($isWalletOpen && count($allAddresses) > 0) {
×
251
                // Primary address for transaction display (civic first)
NEW
252
                $view->public_addr = $civic_wallet ? $civic_wallet->public_addr : $allAddresses[0];
×
253
                // Pass all addresses for aggregated transaction view
NEW
254
                $view->all_addresses = $allAddresses;
×
NEW
255
                $view->has_civic_wallet = ($civic_wallet !== null);
×
NEW
256
                $view->has_wallet = true;
×
NEW
257
                $view->wallet_open = true;
×
258
            } else {
NEW
259
                $view->public_addr = '';
×
NEW
260
                $view->all_addresses = [];
×
NEW
261
                $view->has_civic_wallet = ($civic_wallet !== null);
×
NEW
262
                $view->has_wallet = count($allAddresses) > 0;
×
NEW
263
                $view->wallet_open = false;
×
264
            }
265

NEW
266
            $view->transactions = [];
×
267

268
            // Cache dashboard stats to reduce DB/API calls on every page load
NEW
269
            $view->coincount = AppHelper::getMarscoinTotalAmount();
×
NEW
270
            $view->forum_count = Cache::remember('forum_recent_count', 300, function () {
×
NEW
271
                return AppHelper::checkForRecentPosts();
×
NEW
272
            });
×
NEW
273
            $view->proposal_count = Cache::remember('proposal_open_count', 300, function () {
×
NEW
274
                return Proposals::countOpenProposals();
×
NEW
275
            });
×
NEW
276
            $citizenStatus = AppHelper::getCitizenStatus($uid);
×
NEW
277
            $view->citizen_status = $citizenStatus ? $citizenStatus->type : 'GP';
×
278

NEW
279
            return $view;
×
280
        } else {
NEW
281
            return redirect('/login');
×
282
        }
283
    }
284

285
    // Wallet history
286

287
    // Create Wallet Wizard (full-page, replaces modal)
NEW
288
    public function showCreateWallet()
×
289
    {
NEW
290
        if (! Auth::check()) {
×
NEW
291
            return redirect('/login');
×
292
        }
NEW
293
        $uid = Auth::user()->id;
×
NEW
294
        $profile = Profile::where('userid', $uid)->first();
×
NEW
295
        if (! $profile) {
×
NEW
296
            return redirect('/twofa');
×
297
        }
NEW
298
        if ($profile->openchallenge == 1 || is_null($profile->openchallenge)) {
×
NEW
299
            return redirect('/twofachallenge');
×
300
        }
301

NEW
302
        $view = View::make('wallet.create');
×
NEW
303
        $data = json_decode(file_get_contents('/home/mars/constitution/marswallet.json'), true);
×
NEW
304
        $view->SALT = $data['salt'];
×
NEW
305
        $view->iv = $data['iv'];
×
306

NEW
307
        return $view;
×
308
    }
309

310
    // Show HD Wallet (Not Open)
311
    // /wallet/dashboard/hd
NEW
312
    protected function listHDWallet(Request $request)
×
313
    {
NEW
314
        if (Auth::check()) {
×
NEW
315
            $uid = Auth::user()->id;
×
NEW
316
            $profile = Profile::where('userid', '=', $uid)->first();
×
317

NEW
318
            $key = $request->input('key');
×
NEW
319
            if ($key == 'none') {
×
NEW
320
                Log::debug('Something went wrong with key storage');
×
NEW
321
                $profile->wallet_open = 0;
×
NEW
322
                $profile->civic_wallet_open = 0;
×
NEW
323
                $profile->save();
×
324

NEW
325
                return redirect('/wallet/dashboard');
×
326
            }
327

328
            // if wallet currently open, redirect to hd-open
NEW
329
            if ($profile->wallet_open > 0) {
×
NEW
330
                return redirect('/wallet/dashboard/hd-open');
×
331
            }
NEW
332
            if ($profile->civic_wallet_open > 0) {
×
NEW
333
                return redirect('/wallet/dashboard/hd-open');
×
334
            }
335

336
            // list of all user wallets.
NEW
337
            $wallets = HDWallet::where('user_id', '=', $uid)->get();
×
338

339
            // only one civic wallet ever...
NEW
340
            $civic_wallet = CivicWallet::where('user_id', '=', $uid)->first();
×
341

342
            // get balance of wallets.
NEW
343
            foreach ($wallets as $wallet) {
×
NEW
344
                $wallet->balance = AppHelper::getMarscoinBalance($wallet->public_addr);
×
345
            }
346

347
            // handle redirects...
NEW
348
            if (! $profile) {
×
NEW
349
                return redirect('/twofa');
×
350
            } else {
NEW
351
                if ($profile->openchallenge == 1 || is_null($profile->openchallenge)) {
×
NEW
352
                    return redirect('/twofachallenge');
×
353
                }
354
            }
NEW
355
            if ($profile->wallet_open >= 1 && ! is_null($wallets)) {
×
NEW
356
                return redirect('/wallet/dashboard/hd-open');
×
357
            }
358

NEW
359
            $view = View::make('wallet.hd');
×
360

NEW
361
            if (! is_null($civic_wallet)) {
×
NEW
362
                $view->civic_balance = AppHelper::getMarscoinBalance($civic_wallet->public_addr);
×
NEW
363
                $view->network = AppHelper::getMarscoinNetworkInfo();
×
NEW
364
                $view->user = Auth::user();
×
NEW
365
                $view->citizen = Citizen::where('userid', '=', $uid)->first();
×
NEW
366
                $view->profile = $profile;
×
NEW
367
                $view->public_addr = $civic_wallet->public_addr;
×
368

NEW
369
                $view->general_public = $profile->general_public;
×
NEW
370
                $view->citizen = $profile->citizen;
×
NEW
371
                $view->applied = $profile->has_application;
×
NEW
372
                $view->wallet_open = $profile->civic_wallet_open;
×
373
            }
374

NEW
375
            if (is_null($civic_wallet)) {
×
NEW
376
                $view->wallet_open = 0;
×
NEW
377
                $view->wallets = null;
×
NEW
378
                $view->encrypted_seed = null;
×
NEW
379
                $view->civic_wallet = null;
×
NEW
380
                $view->public_addr = null;
×
NEW
381
                $view->citizen = null;
×
NEW
382
                $view->applied = null;
×
383
            } else {
NEW
384
                $view->civic_wallet = $civic_wallet;
×
NEW
385
                $view->wallet_open = $profile->wallet_open;
×
NEW
386
                $view->encrypted_seed = $civic_wallet->encrypted_seed;
×
NEW
387
                $view->wallets = $wallets;
×
NEW
388
                $view->citizen = null;
×
NEW
389
                $view->applied = null;
×
390
            }
391

NEW
392
            $data = json_decode(file_get_contents('/home/mars/constitution/marswallet.json'), true);
×
NEW
393
            $view->SALT = $data['salt'];
×
NEW
394
            $view->iv = $data['iv'];
×
395

396
            // Pre-compute all wallet seeds for multi-wallet discovery
NEW
397
            $allSeeds = [];
×
NEW
398
            if ($wallets) {
×
NEW
399
                foreach ($wallets as $w) {
×
NEW
400
                    if ($w->encrypted_seed && $w->public_addr) {
×
NEW
401
                        $allSeeds[] = ['s' => $w->encrypted_seed, 'a' => $w->public_addr, 't' => 'hd'];
×
402
                    }
403
                }
404
            }
NEW
405
            if ($civic_wallet && $civic_wallet->encrypted_seed) {
×
NEW
406
                $allSeeds[] = ['s' => $civic_wallet->encrypted_seed, 'a' => $civic_wallet->public_addr, 't' => 'civic'];
×
407
            }
NEW
408
            $view->all_seeds_json = json_encode($allSeeds);
×
409

NEW
410
            return $view;
×
411
        } else {
NEW
412
            return redirect('/login');
×
413
        }
414
    }
415

416
    // Show HD Wallet (Open)
417
    // /wallet/dashboard/hd-open
NEW
418
    protected function showHDOpen(Request $request)
×
419
    {
NEW
420
        if (Auth::check()) {
×
NEW
421
            $uid = Auth::user()->id;
×
NEW
422
            $profile = Profile::where('userid', '=', $uid)->first();
×
NEW
423
            $wallets = HDWallet::where('user_id', '=', $uid)->get();
×
NEW
424
            $civic_wallet = CivicWallet::where('user_id', '=', $uid)->first();
×
425

NEW
426
            if (! $profile) {
×
NEW
427
                return redirect('/twofa');
×
428
            } else {
NEW
429
                if ($profile->openchallenge == 1 || is_null($profile->openchallenge)) {
×
NEW
430
                    return redirect('/twofachallenge');
×
431
                }
432
            }
NEW
433
            $data = json_decode($request->input('wallet'));
×
434

NEW
435
            if ($data || ($wallets || $civic_wallet)) {
×
436
                // Fetch wallet info from profile if this is not a newly unlocked wallet
NEW
437
                if (is_null($data)) {
×
NEW
438
                    $data = HDWallet::where('id', '=', $profile->wallet_open)->first();
×
439
                }
NEW
440
                if (is_null($data)) {
×
NEW
441
                    $data = CivicWallet::where('user_id', '=', $uid)->first();
×
442
                }
NEW
443
                if (is_null($data)) {
×
NEW
444
                    $profile->wallet_open = 0;
×
NEW
445
                    $profile->civic_wallet_open = 0;
×
NEW
446
                    $profile->save();
×
447

NEW
448
                    return redirect('/wallet/dashboard/hd');
×
449
                }
450

NEW
451
                $view = View::make('wallet.hd-open');
×
452

NEW
453
                $codes = json_decode(file_get_contents('/home/mars/constitution/marswallet.json'), true);
×
NEW
454
                $view->SALT = $codes['salt'];
×
NEW
455
                $view->iv = $codes['iv'];
×
456

NEW
457
                $view->public_addr = $data->public_addr;
×
NEW
458
                $view->encrypted_seed = $data->encrypted_seed;
×
NEW
459
                $view->fullname = Auth::user()->fullname;
×
NEW
460
                $view->wallet_open = $data->id;
×
461

NEW
462
                $isCivicWalletOpen = $civic_wallet && $data && $civic_wallet->id === $data->id;
×
463

NEW
464
                if ($isCivicWalletOpen) {
×
NEW
465
                    $profile->wallet_open = 0;
×
NEW
466
                    $profile->civic_wallet_open = $civic_wallet->id;
×
NEW
467
                    $view->is_civic_wallet = $isCivicWalletOpen;
×
468
                } else {
NEW
469
                    $profile->wallet_open = $data->id;
×
NEW
470
                    $profile->civic_wallet_open = 0;
×
NEW
471
                    $view->is_civic_wallet = 0;
×
472
                }
NEW
473
                $profile->save();
×
474

475
                // Pass civic wallet address for HD discovery linking
NEW
476
                $view->civic_addr = $civic_wallet ? $civic_wallet->public_addr : '';
×
477

478
                // Pass ALL wallet encrypted seeds for multi-wallet discovery
479
                // Some wallets were encrypted with legacy 1-round PBKDF2
NEW
480
                $allWallets = [];
×
NEW
481
                foreach ($wallets as $w) {
×
NEW
482
                    if ($w->encrypted_seed && $w->public_addr) {
×
NEW
483
                        $allWallets[] = [
×
NEW
484
                            'encrypted_seed' => $w->encrypted_seed,
×
NEW
485
                            'public_addr' => $w->public_addr,
×
NEW
486
                            'type' => 'hd',
×
NEW
487
                        ];
×
488
                    }
489
                }
NEW
490
                if ($civic_wallet && $civic_wallet->encrypted_seed) {
×
NEW
491
                    $allWallets[] = [
×
NEW
492
                        'encrypted_seed' => $civic_wallet->encrypted_seed,
×
NEW
493
                        'public_addr' => $civic_wallet->public_addr,
×
NEW
494
                        'type' => 'civic',
×
NEW
495
                    ];
×
496
                }
NEW
497
                $view->all_wallets = json_encode($allWallets);
×
498

NEW
499
                return $view;
×
500
            } else {
NEW
501
                return redirect('/wallet/dashboard/hd');
×
502
            }
503

504
        } else {
NEW
505
            return redirect('/login');
×
506
        }
507
    }
508

509
    // Show HD Wallet (Close)
NEW
510
    protected function showHDClose()
×
511
    {
NEW
512
        if (Auth::check()) {
×
NEW
513
            $uid = Auth::user()->id;
×
NEW
514
            $profile = Profile::where('userid', '=', $uid)->first();
×
515

NEW
516
            if (! $profile) {
×
NEW
517
                return redirect('/twofa');
×
518
            } else {
NEW
519
                if ($profile->openchallenge == 1 || is_null($profile->openchallenge)) {
×
NEW
520
                    return redirect('/twofachallenge');
×
521
                }
522
            }
NEW
523
            Log::info('set open wallet to zero');
×
NEW
524
            $profile->wallet_open = 0;
×
NEW
525
            $profile->civic_wallet_open = 0;
×
NEW
526
            $profile->save();
×
527

528
            // Render the close view so client-side JS can clear localStorage,
529
            // then redirect via JS. Previously this was a server redirect which
530
            // meant the close() JS function never ran and keys persisted.
NEW
531
            $view = View::make('wallet.hd-close');
×
NEW
532
            $view->wallet_open = 0;
×
533

NEW
534
            return $view;
×
535

536
        } else {
NEW
537
            return redirect('/login');
×
538
        }
539
    }
540

NEW
541
    protected function forgetWallet(Request $request)
×
542
    {
NEW
543
        if (Auth::check()) {
×
NEW
544
            $uid = Auth::user()->id;
×
NEW
545
            $walletid = $request->input('hdwallet_id');
×
546

547
            // Civic wallet reset (only if no on-chain activity)
NEW
548
            if ($request->input('civic_reset')) {
×
NEW
549
                $hasActivity = Feed::where('userid', $uid)->whereIn('tag', ['GP', 'CT', 'ED'])->exists();
×
NEW
550
                if ($hasActivity) {
×
NEW
551
                    return response()->json(['error' => 'Cannot reset: on-chain civic activity exists'], 403);
×
552
                }
NEW
553
                $civic = CivicWallet::where('id', $walletid)->where('user_id', $uid)->first();
×
NEW
554
                if ($civic) {
×
NEW
555
                    $profile = Profile::where('userid', $uid)->first();
×
NEW
556
                    if ($profile) {
×
NEW
557
                        $profile->civic_wallet_open = 0;
×
NEW
558
                        $profile->has_application = 0;
×
NEW
559
                        $profile->save();
×
560
                    }
NEW
561
                    Citizen::where('userid', $uid)->delete();
×
NEW
562
                    $civic->delete();
×
563

NEW
564
                    return response()->json(['success' => 'Civic wallet reset successfully']);
×
565
                }
566
            }
567

568
            // Regular HD wallet delete
NEW
569
            $wallet = HDWallet::where('id', $walletid)->where('user_id', $uid)->firstOrFail();
×
NEW
570
            $wallet->delete();
×
571

NEW
572
            return response()->json(['success' => 'Wallet deleted successfully']);
×
573
        }
574

NEW
575
        return response()->json(['error' => 'Unauthorized'], 403);
×
576
    }
577

578
    public function postCreateWallet(Request $request)
1✔
579
    {
580
        if (Auth::check()) {
1✔
581
            $uid = Auth::user()->id;
1✔
582
            $profile = Profile::where('userid', '=', $uid)->first();
1✔
583
            $hd_wallet = HDWallet::where('user_id', '=', $uid)->get();
1✔
584
            $civic = CivicWallet::where('user_id', '=', $uid)->first();
1✔
585

586
            Log::info('See if user has civic wallet');
1✔
587
            // Check if the user has a Civic wallet already, even if it's not opened
588
            $civicExists = CivicWallet::where('user_id', '=', $uid)->exists();
1✔
589

590
            // user must insert password.. no null accepted...
591

592
            // 3 States of Wallets:
593
            // 1) NO civic + No wallets
594
            // 2) Civic + No wallets
595
            // 3) Civic + wallets
596
            if ($request->input('wallet_name') == 'Imported') {
1✔
NEW
597
                Log::debug('imported wallets are not being stored ... yet');
×
NEW
598
                $new_wallet = new HDWallet;
×
NEW
599
                $new_wallet->encrypted_seed = 'ADHOC';
×
NEW
600
                $new_wallet->public_addr = $request->input('public_addr');
×
NEW
601
                $new_wallet->backup = 1;
×
NEW
602
                $new_wallet->user_id = $uid;
×
NEW
603
                $new_wallet->wallet_type = $request->input('wallet_name');
×
NEW
604
                $new_wallet->save();
×
NEW
605
                $profile->wallet_open = $new_wallet->id;
×
NEW
606
                $profile->civic_wallet_open = 0;
×
NEW
607
                $profile->save();
×
608

NEW
609
                return redirect('/wallet/dashboard/hd-open')->with('message', 'Wallet Successfully Opened!');
×
610
            } elseif (! $civicExists && $profile->civic_wallet_open == 0 && $profile->wallet_open == 0) {
1✔
611
                Log::debug('first wallet created has to be civic wallet');
1✔
612
                $new_civic_wallet = new CivicWallet;
1✔
613
                if (empty($request->input('password'))) {
1✔
614
                    $new_civic_wallet->encrypted_seed = 'UNSET';
1✔
615
                } else {
NEW
616
                    $new_civic_wallet->encrypted_seed = $request->input('password');
×
617
                }
618
                $new_civic_wallet->public_addr = $request->input('public_addr');
1✔
619

620
                $new_civic_wallet->backup = 1;
1✔
621

622
                $new_civic_wallet->user_id = $uid;
1✔
623
                $new_civic_wallet->wallet_type = $request->input('wallet_name');
1✔
624
                $new_civic_wallet->save();
1✔
625

626
                $profile->civic_wallet_open = $new_civic_wallet->id;
1✔
627
                $profile->wallet_open = 0;
1✔
628
                $profile->save();
1✔
629

630
                return redirect('/wallet/dashboard/hd-open')->with('message', 'Wallet Successfully Opened!');
1✔
NEW
631
            } elseif ($civicExists || $profile->civic_wallet_open == 1) {
×
NEW
632
                Log::debug('non-civic wallet being created');
×
NEW
633
                $new_wallet = new HDWallet;
×
634

NEW
635
                $encseed = $request->input('password');
×
NEW
636
                if (empty($encseed)) {
×
NEW
637
                    $new_wallet->encrypted_seed = 'ADHOC';
×
638
                } else {
NEW
639
                    $new_wallet->encrypted_seed = $request->input('password');
×
640
                }
641

NEW
642
                $new_wallet->public_addr = $request->input('public_addr');
×
643

NEW
644
                $new_wallet->backup = 1;
×
645

NEW
646
                $new_wallet->user_id = $uid;
×
NEW
647
                $new_wallet->wallet_type = $request->input('wallet_name');
×
648

NEW
649
                $new_wallet->save();
×
650

NEW
651
                $profile->wallet_open = $new_wallet->id;
×
NEW
652
                $profile->civic_wallet_open = 0;
×
NEW
653
                $profile->save();
×
654

NEW
655
                return redirect('/wallet/dashboard/hd-open')->with('message', 'Wallet Successfully Opened!');
×
656
            } else {
NEW
657
                Log::debug('no wallet entry created in local db cache');
×
658

NEW
659
                return redirect('/wallet/dashboard/hd');
×
660
            }
661

662
            return redirect('/wallet/dashboard/hd');
663

664
        } else {
665

NEW
666
            return redirect('/login');
×
667
        }
668
    }
669

670
    // GET
671
    // Open Pre-Existing Wallet
672
    public function getWallet(Request $request)
2✔
673
    {
674
        if (Auth::check()) {
2✔
675

676
            $uid = Auth::user()->id;
2✔
677
            $profile = Profile::where('userid', '=', $uid)->first();
2✔
678

679
            // Try HD wallet first, then civic wallet
680
            $hd_wallet = HDWallet::where('user_id', '=', $uid)->first();
2✔
681
            $civic_wallet = CivicWallet::where('user_id', '=', $uid)->first();
2✔
682

683
            if ($hd_wallet) {
2✔
684
                $profile->wallet_open = $hd_wallet->id;
1✔
685
            } elseif ($civic_wallet) {
1✔
686
                $profile->civic_wallet_open = $civic_wallet->id;
1✔
687
            }
688
            $profile->save();
2✔
689

690
            return redirect('wallet/dashboard/hd-open')->with('message', 'Wallet Successfully Open!');
2✔
691
        } else {
NEW
692
            return redirect('/login');
×
693
        }
694
    }
695

696
    public function failWallet()
1✔
697
    {
698

699
        return redirect('wallet/dashboard/hd')->with('error', 'Wallet unlock failed. Please check your credentials and try again.');
1✔
700
    }
701

702
    // Logout of Wallet ONLY
703
    public function walletLogout()
1✔
704
    {
705
        if (Auth::check()) {
1✔
706

707
            $uid = Auth::user()->id;
1✔
708
            $profile = Profile::where('userid', '=', $uid)->first();
1✔
709
            $profile->wallet_open = 0;
1✔
710
            $profile->civic_wallet_open = 0;
1✔
711
            $profile->save();
1✔
712

713
            return redirect('/wallet/dashboard');
1✔
714
        }
715

716
    }
717

NEW
718
    protected function showProfile()
×
719
    {
NEW
720
        if (Auth::check()) {
×
NEW
721
            $uid = Auth::user()->id;
×
NEW
722
            $profile = Profile::where('userid', '=', $uid)->first();
×
NEW
723
            if (! $profile) {
×
NEW
724
                return redirect('/twofa');
×
725
            } else {
NEW
726
                if ($profile->openchallenge == 1 || is_null($profile->openchallenge)) {
×
NEW
727
                    return redirect('/twofachallenge');
×
728
                }
729
            }
NEW
730
            $user = Auth::user();
×
NEW
731
            $citizen = $user->citizen;
×
NEW
732
            $view = View::make('wallet.profile');
×
NEW
733
            $view->network = AppHelper::getMarscoinNetworkInfo();
×
NEW
734
            $view->user = $user;
×
NEW
735
            $view->citizen = $citizen;
×
NEW
736
            $view->profile = $profile;
×
737

NEW
738
            return $view;
×
739
        } else {
NEW
740
            return redirect('/login');
×
741
        }
742
    }
743

NEW
744
    protected function showReports()
×
745
    {
NEW
746
        if (Auth::check()) {
×
NEW
747
            $uid = Auth::user()->id;
×
NEW
748
            $profile = Profile::where('userid', '=', $uid)->first();
×
NEW
749
            if (! $profile) {
×
NEW
750
                return redirect('/twofa');
×
751
            } else {
NEW
752
                if ($profile->openchallenge == 1 || is_null($profile->openchallenge)) {
×
NEW
753
                    return redirect('/twofachallenge');
×
754
                }
755
            }
NEW
756
            $user = Auth::user();
×
NEW
757
            $citizen = $user->citizen;
×
NEW
758
            $view = View::make('wallet.reports');
×
NEW
759
            $view->network = AppHelper::getMarscoinNetworkInfo();
×
NEW
760
            $view->user = $user;
×
NEW
761
            $view->citizen = $citizen;
×
NEW
762
            $view->profile = $profile;
×
763

NEW
764
            return $view;
×
765
        } else {
NEW
766
            return redirect('/login');
×
767
        }
768
    }
769

NEW
770
    protected function anchor()
×
771
    {
772

NEW
773
        if (Auth::check()) {
×
NEW
774
            $uid = Auth::user()->id;
×
NEW
775
            $profile = Profile::where('userid', '=', $uid)->first();
×
NEW
776
            $wallet = HDWallet::where('user_id', '=', $uid)->first();
×
777

NEW
778
            if (! $profile) {
×
NEW
779
                return redirect('/twofa');
×
780
            } else {
NEW
781
                if ($profile->openchallenge == 1 || is_null($profile->openchallenge)) {
×
NEW
782
                    return redirect('/twofachallenge');
×
783
                }
784
            }
NEW
785
            $view = View::make('wallet.anchor');
×
786

NEW
787
            if ($wallet) {
×
NEW
788
                $view->public_address = $wallet['public_addr'];
×
789
            } else {
NEW
790
                $view->balance = 0;
×
NEW
791
                $view->public_address = '';
×
792
            }
793

NEW
794
            return $view;
×
795
        } else {
NEW
796
            return redirect('/login');
×
797
        }
798
    }
799

NEW
800
    protected function showCamera()
×
801
    {
NEW
802
        if (Auth::check()) {
×
NEW
803
            $uid = Auth::user()->id;
×
NEW
804
            $profile = Profile::where('userid', '=', $uid)->first();
×
NEW
805
            if (! $profile) {
×
NEW
806
                return redirect('/twofa');
×
807
            } else {
NEW
808
                if ($profile->openchallenge == 1 || is_null($profile->openchallenge)) {
×
NEW
809
                    return redirect('/twofachallenge');
×
810
                }
811
            }
NEW
812
            $user = Auth::user();
×
NEW
813
            $citizen = $user->citizen;
×
NEW
814
            $view = View::make('wallet.camera');
×
NEW
815
            $view->email = Auth::user()->email;
×
NEW
816
            $view->network = AppHelper::getMarscoinNetworkInfo();
×
NEW
817
            $view->user = $user;
×
NEW
818
            $view->citizen = $citizen;
×
NEW
819
            $view->profile = $profile;
×
820

NEW
821
            return $view;
×
822
        } else {
NEW
823
            return redirect('/login');
×
824
        }
825
    }
826
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc