Skip to content

Commit d2a53e3

Browse files
Merge pull request #564 from OpenDTU-App/218-implement-security-settings
2 parents ac27f7a + 26320f2 commit d2a53e3

10 files changed

Lines changed: 424 additions & 14 deletions

File tree

src/api/ApiHandler.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import {
2020
setNTPSettings,
2121
setNtpStatus,
2222
setPowerStatus,
23+
setSecuritySettings,
2324
setSystemStatus,
2425
setTriedToConnect,
2526
} from '@/slices/opendtu';
@@ -196,6 +197,10 @@ export const ApiProvider: FC<PropsWithChildren> = ({ children }) => {
196197
dispatch(setMqttSettings({ data, index }));
197198
});
198199

200+
api.registerOnSecuritySettingsHandler((data, index) => {
201+
dispatch(setSecuritySettings({ data, index }));
202+
});
203+
199204
log.debug('Connecting API Handler');
200205

201206
api.connect();

src/api/opendtuapi.ts

Lines changed: 95 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import type {
1515
NetworkSettings,
1616
NTPSettings,
1717
NTPTime,
18+
SecuritySettings,
1819
TimezoneData,
1920
} from '@/types/opendtu/settings';
2021
import type { InverterItem } from '@/types/opendtu/state';
@@ -126,6 +127,9 @@ class OpenDtuApi {
126127
private onMqttSettingsHandler:
127128
| ((data: MqttSettings, index: Index) => void)
128129
| null = null;
130+
private onSecuritySettingsHandler:
131+
| ((data: SecuritySettings, index: Index) => void)
132+
| null = null;
129133

130134
private ws: WebSocket | null = null;
131135
// communication
@@ -179,21 +183,23 @@ class OpenDtuApi {
179183
public startFetchHttpStateInterval(): void {
180184
log.debug('OpenDtuApi.startFetchHttpStateInterval()');
181185

182-
if (this.fetchHttpStateInterval) {
186+
if (this.fetchHttpStateInterval !== null) {
183187
log.debug('OpenDtuApi.startFetchHttpStateInterval() already running');
184188
clearInterval(this.fetchHttpStateInterval);
185189
}
186190

187-
this.fetchHttpStateInterval = setInterval(() => {
188-
this.updateHttpState();
191+
if (this.userString !== null) {
192+
this.fetchHttpStateInterval = setInterval(() => {
193+
this.updateHttpState();
189194

190-
log.debug(
191-
'interval -> OpenDtuApi.updateHttpState()',
192-
new Date(),
193-
this.index,
194-
this.isConnected(),
195-
);
196-
}, 5000); // 10 seconds
195+
log.debug(
196+
'interval -> OpenDtuApi.updateHttpState()',
197+
new Date(),
198+
this.index,
199+
this.isConnected(),
200+
);
201+
}, 5000); // 10 seconds
202+
}
197203

198204
this.updateHttpState();
199205
}
@@ -383,6 +389,18 @@ class OpenDtuApi {
383389
this.onMqttSettingsHandler = null;
384390
}
385391

392+
public registerOnSecuritySettingsHandler(
393+
handler: (data: SecuritySettings, index: Index) => void,
394+
): void {
395+
log.debug('OpenDtuApi.registerOnSecuritySettingsHandler()');
396+
this.onSecuritySettingsHandler = handler;
397+
}
398+
399+
public unregisterOnSecuritySettingsHandler(): void {
400+
log.debug('OpenDtuApi.unregisterOnSecuritySettingsHandler()');
401+
this.onSecuritySettingsHandler = null;
402+
}
403+
386404
public async getSystemStatusFromUrl(
387405
url: URL,
388406
): Promise<GetSystemStatusReturn> {
@@ -1583,6 +1601,73 @@ class OpenDtuApi {
15831601
return res.status === 200 && parsed.type === 'success';
15841602
}
15851603

1604+
public async getSecurityConfig(): Promise<DtuSettings | null> {
1605+
if (!this.baseUrl) {
1606+
log.error('getSecurityConfig', 'no base url');
1607+
return null;
1608+
}
1609+
1610+
const res = await this.makeAuthenticatedRequest(
1611+
'/api/security/config',
1612+
'GET',
1613+
);
1614+
1615+
if (!res) {
1616+
log.error('getSecurityConfig', 'no response');
1617+
return null;
1618+
}
1619+
1620+
if (res.status === 200) {
1621+
const json = await res.json();
1622+
1623+
if (this.onSecuritySettingsHandler && this.index !== null) {
1624+
this.onSecuritySettingsHandler(json, this.index);
1625+
}
1626+
1627+
log.debug('getSecurityConfig', 'success');
1628+
1629+
return json;
1630+
}
1631+
1632+
log.error('getSecurityConfig', 'invalid status', res.status);
1633+
1634+
return null;
1635+
}
1636+
1637+
public async setSecurityConfig(
1638+
config: SecuritySettings,
1639+
): Promise<boolean | null> {
1640+
if (!this.baseUrl) {
1641+
log.error('setSecurityConfig', 'no base url');
1642+
return null;
1643+
}
1644+
1645+
const formData = new FormData();
1646+
formData.append('data', JSON.stringify(config));
1647+
1648+
const res = await this.makeAuthenticatedRequest(
1649+
'/api/security/config',
1650+
'POST',
1651+
{
1652+
body: formData,
1653+
},
1654+
);
1655+
1656+
if (!res) {
1657+
log.error('setSecurityConfig', 'no response');
1658+
return null;
1659+
}
1660+
1661+
const parsed = await res.json();
1662+
1663+
log.debug('setSecurityConfig', 'success', {
1664+
status: res.status,
1665+
parsed,
1666+
});
1667+
1668+
return res.status === 200 && parsed.type === 'success';
1669+
}
1670+
15861671
public async makeAuthenticatedRequest(
15871672
route: string,
15881673
method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'HEAD' | 'OPTIONS' | 'PATCH',

src/slices/opendtu.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import type {
2121
SetNTPSettingsAction,
2222
SetNtpStatusAction,
2323
SetPowerStatusAction,
24+
SetSecuritySettingsAction,
2425
SetSetupBaseUrlAction,
2526
SetSetupUserStringAction,
2627
SetSystemStatusAction,
@@ -394,6 +395,21 @@ const opendtuSlice = createSlice({
394395
.settings as OpenDTUSettings
395396
).mqtt = action.payload.data;
396397
},
398+
setSecuritySettings: (state, action: SetSecuritySettingsAction) => {
399+
if (!state.dtuStates[action.payload.index]) {
400+
state.dtuStates[action.payload.index] = {};
401+
}
402+
403+
if (!state.dtuStates[action.payload.index]?.settings) {
404+
(state.dtuStates[action.payload.index] as OpenDTUDeviceState).settings =
405+
{};
406+
}
407+
408+
(
409+
(state.dtuStates[action.payload.index] as OpenDTUDeviceState)
410+
.settings as OpenDTUSettings
411+
).security = action.payload.data;
412+
},
397413
},
398414
});
399415

@@ -422,6 +438,7 @@ export const {
422438
setNTPSettings,
423439
setDtuSettings,
424440
setMqttSettings,
441+
setSecuritySettings,
425442
} = opendtuSlice.actions;
426443

427444
export const { reducer: OpenDTUReducer } = opendtuSlice;

src/translations

src/types/opendtu/settings.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,3 +102,8 @@ export interface MqttSettings {
102102
mqtt_hass_topic: string;
103103
mqtt_hass_individualpanels: boolean;
104104
}
105+
106+
export interface SecuritySettings {
107+
password: string;
108+
allow_readonly: boolean;
109+
}

src/types/opendtu/state.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import type {
77
MqttSettings,
88
NetworkSettings,
99
NTPSettings,
10+
SecuritySettings,
1011
} from '@/types/opendtu/settings';
1112
import type {
1213
InverterSerial,
@@ -27,6 +28,7 @@ export interface OpenDTUSettings {
2728
ntp?: NTPSettings;
2829
dtu?: DtuSettings;
2930
mqtt?: MqttSettings;
31+
security?: SecuritySettings;
3032
}
3133

3234
export enum DeviceState {
@@ -153,6 +155,11 @@ export type SetMqttSettingsAction = PayloadAction<{
153155
data: MqttSettings;
154156
}>;
155157

158+
export type SetSecuritySettingsAction = PayloadAction<{
159+
index: Index;
160+
data: SecuritySettings;
161+
}>;
162+
156163
export interface OpenDTUSetup {
157164
baseUrl: string | null;
158165
userString: string | null;

src/utils/log.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ const config: configLoggerType<
4747
string
4848
> = {
4949
transport: [consoleTransport, customTransport],
50-
severity: __DEV__ ? 'info' : 'warn',
50+
severity: __DEV__ ? 'debug' : 'warn',
5151
transportOptions: {
5252
colors: {
5353
debug: 'gray',

src/views/navigation/NavigationStack.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import DtuSettingsScreen from '@/views/navigation/screens/SettingsGroup/DtuSetti
2828
import MqttSettingsScreen from '@/views/navigation/screens/SettingsGroup/MqttSettingsScreen';
2929
import NetworkSettingsScreen from '@/views/navigation/screens/SettingsGroup/NetworkSettingsScreen';
3030
import NTPSettingsScreen from '@/views/navigation/screens/SettingsGroup/NTPSettingsScreen';
31+
import SecuritySettingsScreen from '@/views/navigation/screens/SettingsGroup/SecuritySettingsScreen';
3132
import SetupAddOpenDTUScreen from '@/views/navigation/screens/SetupGroup/SetupAddOpenDTUScreen';
3233
import SetupAuthenticateOpenDTUInstanceScreen from '@/views/navigation/screens/SetupGroup/SetupAuthenticateOpenDTUInstanceScreen';
3334
import SetupOpenDTUCompleteScreen from '@/views/navigation/screens/SetupGroup/SetupOpenDTUCompleteScreen';
@@ -137,6 +138,10 @@ const NavigationStack: FC = () => {
137138
<Stack.Screen name="NTPSettingsScreen" component={NTPSettingsScreen} />
138139
<Stack.Screen name="DtuSettingsScreen" component={DtuSettingsScreen} />
139140
<Stack.Screen name="MqttSettingsScreen" component={MqttSettingsScreen} />
141+
<Stack.Screen
142+
name="SecuritySettingsScreen"
143+
component={SecuritySettingsScreen}
144+
/>
140145
<Stack.Screen name="AppLogScreen" component={AppLogScreen} />
141146
</Stack.Navigator>
142147
);

0 commit comments

Comments
 (0)