Skip to content

Commit 12e62ce

Browse files
committed
certificate uploader
1 parent ef91a9f commit 12e62ce

17 files changed

+628
-340
lines changed

arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -242,17 +242,18 @@ import {
242242
UploadFirmwareDialog,
243243
UploadFirmwareDialogProps,
244244
UploadFirmwareDialogWidget,
245-
} from './dialogs/firmware-uploader/upload-firmware-dialog';
246-
import {
247-
UploadCertificateDialog,
248-
UploadCertificateDialogProps,
249-
UploadCertificateDialogWidget,
250-
} from './dialogs/certificate-uploader/upload-certificate-dialog';
245+
} from './dialogs/firmware-uploader/firmware-uploader-dialog';
246+
251247
import { UploadCertificate } from './contributions/upload-certificate';
252248
import {
253249
ArduinoFirmwareUploader,
254250
ArduinoFirmwareUploaderPath,
255251
} from '../common/protocol/arduino-firmware-uploader';
252+
import {
253+
UploadCertificateDialog,
254+
UploadCertificateDialogProps,
255+
UploadCertificateDialogWidget,
256+
} from './dialogs/certificate-uploader/certificate-uploader-dialog';
256257

257258
const ElementQueries = require('css-element-queries/src/ElementQueries');
258259

arduino-ide-extension/src/browser/arduino-preferences.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,11 @@ export const ArduinoConfigSchema: PreferenceSchema = {
5555
'True to enable automatic update checks. The IDE will check for updates automatically and periodically.',
5656
default: true,
5757
},
58+
'arduino.board.certificates': {
59+
type: 'string',
60+
description: 'List of certificates that can be uploaded to boards',
61+
default: '',
62+
},
5863
'arduino.sketchbook.showAllFiles': {
5964
type: 'boolean',
6065
description:
@@ -123,6 +128,7 @@ export interface ArduinoConfiguration {
123128
'arduino.window.autoScale': boolean;
124129
'arduino.window.zoomLevel': number;
125130
'arduino.ide.autoUpdate': boolean;
131+
'arduino.board.certificates': string;
126132
'arduino.sketchbook.showAllFiles': boolean;
127133
'arduino.cloud.enabled': boolean;
128134
'arduino.cloud.pull.warn': boolean;

arduino-ide-extension/src/browser/contributions/upload-certificate.ts

Lines changed: 88 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,36 @@ import {
66
Contribution,
77
} from './contribution';
88
import { ArduinoMenus } from '../menu/arduino-menus';
9-
import { UploadCertificateDialog } from '../dialogs/certificate-uploader/upload-certificate-dialog';
9+
import { UploadCertificateDialog } from '../dialogs/certificate-uploader/certificate-uploader-dialog';
10+
import { ContextMenuRenderer } from '@theia/core/lib/browser/context-menu-renderer';
11+
import {
12+
PreferenceScope,
13+
PreferenceService,
14+
} from '@theia/core/lib/browser/preferences/preference-service';
15+
import { ArduinoPreferences } from '../arduino-preferences';
16+
import {
17+
arduinoCert,
18+
certificateList,
19+
} from '../dialogs/certificate-uploader/utils';
20+
import { ArduinoFirmwareUploader } from '../../common/protocol/arduino-firmware-uploader';
1021

1122
@injectable()
1223
export class UploadCertificate extends Contribution {
1324
@inject(UploadCertificateDialog)
1425
protected readonly dialog: UploadCertificateDialog;
1526

27+
@inject(ContextMenuRenderer)
28+
protected readonly contextMenuRenderer: ContextMenuRenderer;
29+
30+
@inject(PreferenceService)
31+
protected readonly preferenceService: PreferenceService;
32+
33+
@inject(ArduinoPreferences)
34+
protected readonly arduinoPreferences: ArduinoPreferences;
35+
36+
@inject(ArduinoFirmwareUploader)
37+
protected readonly arduinoFirmwareUploader: ArduinoFirmwareUploader;
38+
1639
protected dialogOpened = false;
1740

1841
registerCommands(registry: CommandRegistry): void {
@@ -27,6 +50,46 @@ export class UploadCertificate extends Contribution {
2750
},
2851
isEnabled: () => !this.dialogOpened,
2952
});
53+
54+
registry.registerCommand(UploadCertificate.Commands.REMOVE_CERT, {
55+
execute: async (certToRemove) => {
56+
const certs = this.arduinoPreferences.get('arduino.board.certificates');
57+
58+
this.preferenceService.set(
59+
'arduino.board.certificates',
60+
certificateList(certs)
61+
.filter((c) => c !== certToRemove)
62+
.join(','),
63+
PreferenceScope.User
64+
);
65+
},
66+
isEnabled: (certToRemove) => certToRemove !== arduinoCert,
67+
});
68+
69+
registry.registerCommand(UploadCertificate.Commands.UPLOAD_CERT, {
70+
execute: async ({ fqbn, address, urls }) => {
71+
return this.arduinoFirmwareUploader.uploadCertificates(
72+
`-b ${fqbn} -a ${address} ${urls
73+
.map((url: string) => `-u ${url}`)
74+
.join(' ')}`
75+
);
76+
},
77+
isEnabled: () => true,
78+
});
79+
80+
registry.registerCommand(UploadCertificate.Commands.OPEN_CERT_CONTEXT, {
81+
execute: async (args: any) => {
82+
this.contextMenuRenderer.render({
83+
menuPath: ArduinoMenus.ROOT_CERTIFICATES__CONTEXT,
84+
anchor: {
85+
x: args.x,
86+
y: args.y,
87+
},
88+
args: [args.cert],
89+
});
90+
},
91+
isEnabled: () => true,
92+
});
3093
}
3194

3295
registerMenus(registry: MenuModelRegistry): void {
@@ -35,6 +98,12 @@ export class UploadCertificate extends Contribution {
3598
label: UploadCertificate.Commands.OPEN.label,
3699
order: '1',
37100
});
101+
102+
registry.registerMenuAction(ArduinoMenus.ROOT_CERTIFICATES__CONTEXT, {
103+
commandId: UploadCertificate.Commands.REMOVE_CERT.id,
104+
label: UploadCertificate.Commands.REMOVE_CERT.label,
105+
order: '1',
106+
});
38107
}
39108
}
40109

@@ -45,5 +114,23 @@ export namespace UploadCertificate {
45114
label: 'Upload SSL Root Certificates',
46115
category: 'Arduino',
47116
};
117+
118+
export const OPEN_CERT_CONTEXT: Command = {
119+
id: 'arduino-certificate-open-context',
120+
label: 'Open context',
121+
category: 'Arduino',
122+
};
123+
124+
export const REMOVE_CERT: Command = {
125+
id: 'arduino-certificate-remove',
126+
label: 'Remove',
127+
category: 'Arduino',
128+
};
129+
130+
export const UPLOAD_CERT: Command = {
131+
id: 'arduino-certificate-upload',
132+
label: 'Upload',
133+
category: 'Arduino',
134+
};
48135
}
49136
}

arduino-ide-extension/src/browser/contributions/upload-firmware.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import {
66
Contribution,
77
} from './contribution';
88
import { ArduinoMenus } from '../menu/arduino-menus';
9-
import { UploadFirmwareDialog } from '../dialogs/firmware-uploader/upload-firmware-dialog';
9+
import { UploadFirmwareDialog } from '../dialogs/firmware-uploader/firmware-uploader-dialog';
1010

1111
@injectable()
1212
export class UploadFirmware extends Contribution {
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import * as React from 'react';
2+
3+
export const CertificateListComponent = ({
4+
certificates,
5+
selectedCerts,
6+
setSelectedCerts,
7+
openContextMenu,
8+
}: {
9+
certificates: string[];
10+
selectedCerts: string[];
11+
setSelectedCerts: React.Dispatch<React.SetStateAction<string[]>>;
12+
openContextMenu: (x: number, y: number, cert: string) => void;
13+
}): React.ReactElement => {
14+
const handleOnChange = (event: any) => {
15+
const target = event.target;
16+
17+
const newSelectedCerts = selectedCerts.filter(
18+
(cert) => cert !== target.name
19+
);
20+
21+
if (target.checked) {
22+
newSelectedCerts.push(target.name);
23+
}
24+
25+
setSelectedCerts(newSelectedCerts);
26+
};
27+
28+
const handleContextMenu = (event: React.MouseEvent, cert: string) => {
29+
openContextMenu(event.clientX, event.clientY, cert);
30+
};
31+
32+
return (
33+
<div className="certificate-list">
34+
{certificates.map((certificate, i) => (
35+
<label
36+
key={i}
37+
className="certificate-row"
38+
onContextMenu={(e) => handleContextMenu(e, certificate)}
39+
>
40+
<span className="fl1">{certificate}</span>
41+
<input
42+
type="checkbox"
43+
name={certificate}
44+
checked={selectedCerts.includes(certificate)}
45+
onChange={handleOnChange}
46+
/>
47+
</label>
48+
))}
49+
</div>
50+
);
51+
};

0 commit comments

Comments
 (0)