Skip to content

Commit

Permalink
I2P Fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
everoddandeven committed Feb 18, 2025
1 parent 32f350a commit 1cf5295
Show file tree
Hide file tree
Showing 11 changed files with 197 additions and 23 deletions.
2 changes: 2 additions & 0 deletions src/app/core/services/daemon/daemon.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -453,6 +453,8 @@ export class DaemonService {
if (!this.i2pService.running) await this.i2pService.start();
console.log('started i2pd service');

this.settings.padTransactions = true;

if (this.i2pService.settings.txProxyEnabled) {
this.settings.setTxProxy(this.i2pService.txProxy, 'i2p');
}
Expand Down
4 changes: 4 additions & 0 deletions src/app/core/services/electron/electron.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -244,6 +244,10 @@ export class ElectronService {
return await promise;
}

public async getAppDataPath(): Promise<string> {
return await this.getPath('appData');
}

private _osType?: { platform: string; arch: string; };

public async getOsType(): Promise<{ platform: string, arch: string }> {
Expand Down
42 changes: 41 additions & 1 deletion src/app/core/services/i2p/i2p-daemon.service.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { EventEmitter, Injectable } from '@angular/core';
import { I2pDaemonSettings, LocalDestinationsData, MainData, TunnelInfo, TunnelsData } from '../../../../common';
import { I2pDaemonSettings, LocalDestinationsData, MainData, RouterCommandResultData, TokenData, TunnelInfo, TunnelsData } from '../../../../common';
import { IDBPDatabase, openDB } from 'idb';

@Injectable({
Expand Down Expand Up @@ -284,6 +284,46 @@ export class I2pDaemonService {
return LocalDestinationsData.fromWrapper(await this.fetchContent('?page=local_destinations'));
}

public async getTokenData(): Promise<TokenData> {
return TokenData.fromWrapper(await this.fetchContent('?page=commands'));
}

public async runPeerTest(): Promise<RouterCommandResultData> {
const tokenData = await this.getTokenData();

return RouterCommandResultData.fromWrapper(await this.fetchContent(`?cmd=run_peer_test&token=${tokenData.token}`));
}

public async reloadTunnelsConfiguration(): Promise<RouterCommandResultData> {
const tokenData = await this.getTokenData();

return RouterCommandResultData.fromWrapper(await this.fetchContent(`?cmd=reload_tunnels_config&token=${tokenData.token}`));
}

public async declineTransitTunnels(): Promise<RouterCommandResultData> {
const tokenData = await this.getTokenData();

return RouterCommandResultData.fromWrapper(await this.fetchContent(`?cmd=disable_transit&token=${tokenData.token}`));
}

public async setLogLevel(logLevel: 'none' | 'critical' | 'error' | 'warn' | 'info' | 'debug'): Promise<RouterCommandResultData> {
const tokenData = await this.getTokenData();

return RouterCommandResultData.fromWrapper(await this.fetchContent(`?cmd=set_loglevel&level=${logLevel}&token=${tokenData.token}`));
}

public async startGracefulShutdown(): Promise<RouterCommandResultData> {
const tokenData = await this.getTokenData();

return RouterCommandResultData.fromWrapper(await this.fetchContent(`?cmd=shutdown_start&token=${tokenData.token}`));
}

public async forceShutdown(): Promise<RouterCommandResultData> {
const tokenData = await this.getTokenData();

return RouterCommandResultData.fromWrapper(await this.fetchContent(`?cmd=terminate&token=${tokenData.token}`));
}

public async getI2pTunnels(): Promise<TunnelsData> {
return TunnelsData.fromWrapper(await this.fetchContent('?page=i2p_tunnels'));
}
Expand Down
25 changes: 20 additions & 5 deletions src/app/pages/i2p-webconsole/i2p-webconsole.component.html
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,22 @@ <h1 class="h2">I2P</h1>
</ul>
</div>
</div>
<div class="tab-content tab-grow" id="pills-tabContent">

<div *ngIf="!running || stopping || starting" class="h-100 p-5 text-bg-dark rounded-3 m-4 text-center">
<h2><i class="bi bi-exclamation-diamond m-4"></i>{{ alertTitle }}</h2>
@if(stopping || starting) {
<button class="btn btn-outline-light" type="button" disabled>
<span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span>
{{ alertMessage }}
</button>
}
@else {
<p>{{ alertMessage }}</p>
}

</div>

<div [hidden]="!running || stopping || starting" class="tab-content tab-grow" id="pills-tabContent">

<div class="tab-pane fade show active" id="pills-overview" role="tabpanel" aria-labelledby="pills-overview-tab" tabindex="0">
<div class="card p-1">
Expand Down Expand Up @@ -68,23 +83,23 @@ <h4 class="mb-3">Commands</h4>
<div class="col-md-4">
<label for="import-config-file" class="form-label">Run peer test</label>
<div class="input-group mb-3">
<button type="button" class="btn btn-secondary btn-sm"><i class="bi bi-play-fill"></i> Run</button>
<button type="button" class="btn btn-secondary btn-sm" (click)="runPeerTest()"><i class="bi bi-play-fill"></i> Run</button>
</div>
<small class="text-body-secondary">Check network connectivity</small>
</div>

<div class="col-md-4">
<label for="export-config-file" class="form-label">Reload tunnels configuration</label>
<div class="input-group mb-3">
<button type="button" class="btn btn-secondary btn-sm"><i class="bi bi-play-fill"></i> Run</button>
<button type="button" class="btn btn-secondary btn-sm" (click)="reloadTunnelsConfiguration()"><i class="bi bi-play-fill"></i> Run</button>
</div>
<small class="text-body-secondary">Reload configuration and restart tunnels</small>
</div>

<div class="col-md-4">
<label for="export-config-file" class="form-label">Decline transit tunnels</label>
<div class="input-group mb-3">
<button type="button" class="btn btn-secondary btn-sm"><i class="bi bi-play-fill"></i> Run</button>
<button type="button" class="btn btn-secondary btn-sm" (click)="declineTransitTunnels()"><i class="bi bi-play-fill"></i> Run</button>
</div>
<small class="text-body-secondary">Stop connectivity to transit tunnels</small>
</div>
Expand All @@ -111,7 +126,7 @@ <h4 class="mb-3">Miscellaneous</h4>
<div class="col-md-8">
<label for="export-config-file" class="form-label">Update Logging Level</label>
<div class="input-group mb-3">
<button type="button" class="btn btn-secondary btn-sm"><i class="bi bi-play-fill"></i> Update</button>
<button type="button" class="btn btn-secondary btn-sm" (click)="setLogLevel()"><i class="bi bi-play-fill"></i> Update</button>
</div>
</div>

Expand Down
75 changes: 73 additions & 2 deletions src/app/pages/i2p-webconsole/i2p-webconsole.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,39 @@ export class I2pWebconsoleComponent extends BasePageComponent implements OnDestr
public localDestinations: LocalDestinationsData = new LocalDestinationsData();
public i2pTunnels: TunnelsData = new TunnelsData();

public loggingLevel: string = 'warn';
public loggingLevel: 'none' | 'critical' | 'error' | 'warn' | 'info' | 'debug' = 'warn';

public get stopping(): boolean {
return this.i2pService.stopping;
}

public get starting(): boolean {
return this.i2pService.starting;
}

public get running(): boolean {
return this.i2pService.running;
}

public get enabled(): boolean {
return this.i2pService.settings.enabled;
}

public get alertTitle(): string {
if (this.starting) return "Starting I2P Service";
if (this.stopping) return "Stopping I2P Service";
if (!this.enabled) return "I2P Service disabled";
else if (!this.running) return "I2P Service not running";
return "";
}

public get alertMessage(): string {
if (this.starting) return "I2P Service is starting";
if (this.stopping) return "I2P Service is shutting down gracefully";
if (!this.enabled) return "Enable I2P in daemon settings";
else if (!this.running) return "Start monero daemon to active I2P service";
return "";
}

constructor(navbarService: NavbarService, private i2pService: I2pDaemonService) {
super(navbarService);
Expand All @@ -38,7 +70,7 @@ export class I2pWebconsoleComponent extends BasePageComponent implements OnDestr
private readonly refreshHandler: () => void = () => this.refresh();

private async refresh(): Promise<void> {
if (this.refreshing) return;
if (this.refreshing || !this.running) return;
this.refreshing = true;

try {
Expand Down Expand Up @@ -67,5 +99,44 @@ export class I2pWebconsoleComponent extends BasePageComponent implements OnDestr
clearInterval(this.refreshInterval);
}

public async runPeerTest(): Promise<void> {

Check failure on line 102 in src/app/pages/i2p-webconsole/i2p-webconsole.component.ts

View workflow job for this annotation

GitHub Actions / build (20)

Async method 'runPeerTest' has no 'await' expression
try {
const result = this.i2pService.runPeerTest();
console.log(result);
}
catch (error: any) {
console.error(error);
}
}

public async reloadTunnelsConfiguration(): Promise<void> {

Check failure on line 112 in src/app/pages/i2p-webconsole/i2p-webconsole.component.ts

View workflow job for this annotation

GitHub Actions / build (20)

Async method 'reloadTunnelsConfiguration' has no 'await' expression
try {
const result = this.i2pService.reloadTunnelsConfiguration();
console.log(result);
}
catch (error: any) {
console.error(error);
}
}

public async declineTransitTunnels(): Promise<void> {

Check failure on line 122 in src/app/pages/i2p-webconsole/i2p-webconsole.component.ts

View workflow job for this annotation

GitHub Actions / build (20)

Async method 'declineTransitTunnels' has no 'await' expression
try {
const result = this.i2pService.declineTransitTunnels();
console.log(result);
}
catch (error: any) {
console.error(error);
}
}

public async setLogLevel(): Promise<void> {

Check failure on line 132 in src/app/pages/i2p-webconsole/i2p-webconsole.component.ts

View workflow job for this annotation

GitHub Actions / build (20)

Async method 'setLogLevel' has no 'await' expression
try {
const result = this.i2pService.setLogLevel(this.loggingLevel);
console.log(result);
}
catch (error: any) {
console.error(error);
}
}
}

9 changes: 9 additions & 0 deletions src/app/shared/components/sidebar/sidebar.component.scss
Original file line number Diff line number Diff line change
Expand Up @@ -73,3 +73,12 @@ main {
background-repeat: no-repeat;
background-position: center;
}

.onion-tor {
display: inline-block;
width: 24px;
height: 24px;
background-image: url('data:image/svg+xml,<svg width="180px" height="180px" viewBox="0 0 180 180" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g id="tor-glyph" stroke="none" stroke-width="1" fill="#000000" fill-rule="evenodd"><path d="M90.1846205,163.631147 L90.1846205,152.721073 C124.743583,152.621278 152.726063,124.581416 152.726063,89.9975051 C152.726063,55.4160892 124.743583,27.3762266 90.1846205,27.2764318 L90.1846205,16.366358 C130.768698,16.4686478 163.633642,49.3909741 163.633642,89.9975051 C163.633642,130.606531 130.768698,163.531352 90.1846205,163.631147 Z M90.1846205,125.444642 C109.677053,125.342352 125.454621,109.517381 125.454621,89.9975051 C125.454621,70.4801242 109.677053,54.6551533 90.1846205,54.5528636 L90.1846205,43.6452847 C115.704663,43.7450796 136.364695,64.4550091 136.364695,89.9975051 C136.364695,115.542496 115.704663,136.252426 90.1846205,136.35222 L90.1846205,125.444642 Z M90.1846205,70.9167267 C100.640628,71.0165216 109.090758,79.5165493 109.090758,89.9975051 C109.090758,100.480956 100.640628,108.980984 90.1846205,109.080778 L90.1846205,70.9167267 Z M0,89.9975051 C0,139.705328 40.2921772,180 90,180 C139.705328,180 180,139.705328 180,89.9975051 C180,40.2921772 139.705328,0 90,0 C40.2921772,0 0,40.2921772 0,89.9975051 Z" id="tor-glyph" fill="#000000"></path></g></svg>');
background-size: contain;
background-repeat: no-repeat;
}
13 changes: 4 additions & 9 deletions src/app/shared/components/sidebar/sidebar.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,18 +53,13 @@ export class SidebarComponent {
new NavLink('Network', '/network', 'bi bi-hdd-network', 'bottom'),
new NavLink('Peers', '/peers', 'bi bi-people', 'bottom'),
new NavLink('Bans', '/bans', 'bi bi-ban', 'bottom'),
new NavLink('Logs', '/logs', 'bi bi-terminal', 'bottom')
];

if (this.i2pEnabled) {
this.navLinks.push(new NavLink('I2P', '/i2pwebconsole', 'bi bi-incognito', 'bottom'));
}

this.navLinks.push(
new NavLink('Logs', '/logs', 'bi bi-terminal', 'bottom'),
//new NavLink('TOR', '/torconsole', 'bi bi-bullseye', "bottom"),
new NavLink('I2P', '/i2pwebconsole', 'bi bi-hurricane', 'bottom'),
new NavLink('Version', '/version', 'bi bi-git', 'bottom'),
new NavLink('Settings', '/settings', 'bi bi-gear', 'bottom'),
new NavLink('About', '/about', 'bi bi-info-circle', 'bottom')
);
];

return this.navLinks;
}
Expand Down
20 changes: 20 additions & 0 deletions src/common/i2p/RouterCommandResultData.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { I2PData } from "./I2PData";

export class RouterCommandResultData extends I2PData {
public message: string = "";

public static fromWrapper(wrapper: HTMLElement): RouterCommandResultData {
const elements = wrapper.getElementsByClassName("content");
const content = elements.item(0);

if (!content) {
throw new Error("Content not found");
}

const data = new RouterCommandResultData();

data.message = content.textContent ? content.textContent : 'Unknown error';

return data;
}
}
4 changes: 0 additions & 4 deletions src/common/i2p/RouterCommandsData.ts

This file was deleted.

21 changes: 21 additions & 0 deletions src/common/i2p/TokenData.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import { I2PData } from "./I2PData";

export class TokenData extends I2PData {
public token: string = "";

public static fromWrapper(wrapper: HTMLElement): TokenData {
const collection = wrapper.getElementsByTagName("input");

for(let i = 0; i < collection.length; i++) {
const element = collection.item(i);
if (!element) continue;
if (element.name === 'token') {
const data = new TokenData();
data.token = element.value;
return data;
}
}

throw new Error("Token data not found in wrapper");
}
}
5 changes: 3 additions & 2 deletions src/common/i2p/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
export { I2PData } from './I2PData';
export { MainData } from './MainData';
export { RouterCommandsData } from './RouterCommandsData';
export { RouterCommandResultData } from './RouterCommandResultData';
export { LocalDestinationsData } from './LocalDestinationsData';
export { TunnelsData, TunnelInfo } from './TunnelsData';
export { TunnelsData, TunnelInfo } from './TunnelsData';
export { TokenData } from "./TokenData";

0 comments on commit 1cf5295

Please sign in to comment.