|
| 1 | +import { createPublicKey } from 'node:crypto'; |
1 | 2 | import { ACT_JOB_STATUSES, ENV_VARS, KEY_VALUE_STORE_KEYS, WEBHOOK_EVENT_TYPES } from '@apify/consts';
|
2 | 3 | import log from '@apify/log';
|
| 4 | +import { encryptInputSecrets } from '@apify/input_secrets'; |
3 | 5 | import type { ApifyEnv } from 'apify';
|
4 | 6 | import { Actor, ProxyConfiguration } from 'apify';
|
5 | 7 | import type { WebhookUpdateData } from 'apify-client';
|
@@ -45,6 +47,14 @@ const setEnv = (env: ApifyEnv) => {
|
45 | 47 | if (env.memoryMbytes) process.env.APIFY_MEMORY_MBYTES = env.memoryMbytes.toString();
|
46 | 48 | };
|
47 | 49 |
|
| 50 | +const testingPublicKey = createPublicKey({ |
| 51 | + // eslint-disable-next-line max-len |
| 52 | + key: Buffer.from('LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUF0dis3NlNXbklhOFFKWC94RUQxRQpYdnBBQmE3ajBnQnVYenJNUU5adjhtTW1RU0t2VUF0TmpOL2xacUZpQ0haZUQxU2VDcGV1MnFHTm5XbGRxNkhUCnh5cXJpTVZEbFNKaFBNT09QSENISVNVdFI4Tk5lR1Y1MU0wYkxJcENabHcyTU9GUjdqdENWejVqZFRpZ1NvYTIKQWxrRUlRZWQ4UVlDKzk1aGJoOHk5bGcwQ0JxdEdWN1FvMFZQR2xKQ0hGaWNuaWxLVFFZay9MZzkwWVFnUElPbwozbUppeFl5bWFGNmlMZTVXNzg1M0VHWUVFVWdlWmNaZFNjaGVBMEdBMGpRSFVTdnYvMEZjay9adkZNZURJOTVsCmJVQ0JoQjFDbFg4OG4wZUhzUmdWZE5vK0NLMDI4T2IvZTZTK1JLK09VaHlFRVdPTi90alVMdGhJdTJkQWtGcmkKOFFJREFRQUIKLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tCg==', 'base64'), |
| 53 | +}); |
| 54 | +// eslint-disable-next-line max-len |
| 55 | +const testingPrivateKeyFile = 'LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpQcm9jLVR5cGU6IDQsRU5DUllQVEVECkRFSy1JbmZvOiBERVMtRURFMy1DQkMsNTM1QURERjIzNUQ4QkFGOQoKMXFWUzl0S0FhdkVhVUVFMktESnpjM3plMk1lZkc1dmVEd2o1UVJ0ZkRaMXdWNS9VZmIvcU5sVThTSjlNaGhKaQp6RFdrWExueUUzSW0vcEtITVZkS0czYWZkcFRtcis2TmtidXptd0dVMk0vSWpzRjRJZlpad0lGbGJoY09jUnp4CmZmWVIvTlVyaHNrS1RpNGhGV0lBUDlLb3Z6VDhPSzNZY3h6eVZQWUxYNGVWbWt3UmZzeWkwUU5Xb0tGT3d0ZC8KNm9HYzFnd2piRjI5ZDNnUThZQjFGWmRLa1AyMTJGbkt1cTIrUWgvbE1zTUZrTHlTQTRLTGJ3ZG1RSXExbE1QUwpjbUNtZnppV3J1MlBtNEZoM0dmWlQyaE1JWHlIRFdEVzlDTkxKaERodExOZ2RRamFBUFpVT1E4V2hwSkE5MS9vCjJLZzZ3MDd5Z2RCcVd5dTZrc0pXcjNpZ1JpUEJ5QmVNWEpEZU5HY3NhaUZ3Q2c5eFlja1VORXR3NS90WlRsTjIKSEdZV0NpVU5Ed0F2WllMUHR1SHpIOFRFMGxsZm5HR0VuVC9QQlp1UHV4andlZlRleE1mdzFpbGJRU3lkcy9HMgpOOUlKKzkydms0N0ZXR2NOdGh1Q3lCbklva0NpZ0c1ZlBlV2IwQTdpdjk0UGtwRTRJZ3plc0hGQ0ZFQWoxWldLCnpQdFRBQlkwZlJrUzBNc3UwMHYxOXloTTUrdFUwYkVCZWo2eWpzWHRoYzlwS01hcUNIZWlQTC9TSHRkaWsxNVMKQmU4Sml4dVJxZitUeGlYWWVuNTg2aDlzTFpEYzA3cGpkUGp2NVNYRnBYQjhIMlVxQ0tZY2p4R3RvQWpTV0pjWApMNHc3RHNEby80bVg1N0htR09iamlCN1ZyOGhVWEJDdFh2V0dmQXlmcEFZNS9vOXowdm4zREcxaDc1NVVwdDluCkF2MFZrbm9qcmJVYjM1ZlJuU1lYTVltS01LSnpNRlMrdmFvRlpwV0ZjTG10cFRWSWNzc0JGUEYyZEo3V1c0WHMKK0d2Vkl2eFl3S2wyZzFPTE1TTXRZa09vekdlblBXTzdIdU0yMUVKVGIvbHNEZ25GaTkrYWRGZHBLY3R2cm0zdgpmbW1HeG5pRmhLU05GU0xtNms5YStHL2pjK3NVQVBhb2FZNEQ3NHVGajh0WGp0eThFUHdRRGxVUGRVZld3SE9PClF3bVgyMys1REh4V0VoQy91Tm8yNHNNY2ZkQzFGZUpBV281bUNuVU5vUVVmMStNRDVhMzNJdDhhMmlrNUkxUWoKeSs1WGpRaG0xd3RBMWhWTWE4aUxBR0toT09lcFRuK1VBZHpyS0hvNjVtYzNKbGgvSFJDUXJabnVxWkErK0F2WgpjeWU0dWZGWC8xdmRQSTdLb2Q0MEdDM2dlQnhweFFNYnp1OFNUcGpOcElJRkJvRVc5dFRhemUzeHZXWnV6dDc0CnFjZS8xWURuUHBLeW5lM0xGMk94VWoyYWVYUW5YQkpYcGhTZTBVTGJMcWJtUll4bjJKWkl1d09RNHV5dm94NjUKdG9TWGNac054dUs4QTErZXNXR3JSN3pVc0djdU9QQTFERE9Ja2JjcGtmRUxMNjk4RTJRckdqTU9JWnhrcWdxZQoySE5VNktWRmV2NzdZeEJDbm1VcVdXZEhYMjcyU2NPMUYzdWpUdFVnRVBNWGN0aEdBckYzTWxEaUw1Q0k0RkhqCnhHc3pVemxzalRQTmpiY2MzdUE2MjVZS3VVZEI2c1h1Rk5NUHk5UDgwTzBpRWJGTXl3MWxmN2VpdFhvaUUxWVoKc3NhMDVxTUx4M3pPUXZTLzFDdFpqaFp4cVJMRW5pQ3NWa2JVRlVYclpodEU4dG94bGpWSUtpQ25qbitORmtqdwo2bTZ1anpBSytZZHd2Nk5WMFB4S0gwUk5NYVhwb1lmQk1oUmZ3dGlaS3V3Y2hyRFB5UEhBQ2J3WXNZOXdtUE9rCnpwdDNxWi9JdDVYTmVqNDI0RzAzcGpMbk1sd1B1T1VzYmFQUWQ2VHU4TFhsckZReUVjTXJDNHdjUTA1SzFVN3kKM1NNN3RFaTlnbjV3RjY1YVI5eEFBR0grTUtMMk5WNnQrUmlTazJVaWs1clNmeDE4Mk9wYmpSQ2grdmQ4UXhJdwotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo='; |
| 56 | +const testingPrivateKeyPassphrase = 'pwd1234'; |
| 57 | + |
48 | 58 | describe('Actor', () => {
|
49 | 59 | const localStorageEmulator = new MemoryStorageEmulator();
|
50 | 60 |
|
@@ -937,23 +947,43 @@ describe('Actor', () => {
|
937 | 947 | });
|
938 | 948 |
|
939 | 949 | describe('Actor.getInput', () => {
|
| 950 | + const TestingActor = new Actor(); |
| 951 | + |
940 | 952 | test('should work', async () => {
|
941 |
| - const defaultStore = await KeyValueStore.open(); |
942 |
| - // Uses default value. |
943 |
| - const oldGet = defaultStore.getValue; |
944 |
| - // @ts-expect-error TODO use spyOn instead of this |
945 |
| - defaultStore.getValue = async (key) => expect(key).toEqual(KEY_VALUE_STORE_KEYS.INPUT); |
946 |
| - await Actor.getInput(); |
| 953 | + const mockGetValue = jest.spyOn(TestingActor, 'getValue'); |
| 954 | + mockGetValue.mockImplementation(async (key) => expect(key).toEqual(KEY_VALUE_STORE_KEYS.INPUT)); |
| 955 | + |
| 956 | + await TestingActor.getInput(); |
947 | 957 |
|
948 | 958 | // Uses value from env var.
|
949 | 959 | process.env[ENV_VARS.INPUT_KEY] = 'some-value';
|
950 |
| - // @ts-expect-error TODO use spyOn instead of this |
951 |
| - defaultStore.getValue = async (key) => expect(key).toBe('some-value'); |
952 |
| - await Actor.getInput(); |
| 960 | + mockGetValue.mockImplementation(async (key) => expect(key).toBe('some-value')); |
| 961 | + await TestingActor.getInput(); |
953 | 962 |
|
954 | 963 | delete process.env[ENV_VARS.INPUT_KEY];
|
| 964 | + mockGetValue.mockRestore(); |
| 965 | + }); |
955 | 966 |
|
956 |
| - defaultStore.getValue = oldGet; |
| 967 | + test('should work with input secrets', async () => { |
| 968 | + const mockGetValue = jest.spyOn(TestingActor, 'getValue'); |
| 969 | + const originalInput = { secret: 'foo', nonSecret: 'bar' }; |
| 970 | + const likeInputSchema = { properties: { secret: { type: 'string', isSecret: true } }, nonSecret: { type: 'string' } }; |
| 971 | + const encryptedInput = encryptInputSecrets({ input: originalInput, inputSchema: likeInputSchema, publicKey: testingPublicKey }); |
| 972 | + // Checks if encrypts the right value |
| 973 | + expect(encryptedInput.secret.startsWith('ENCRYPTED_')).toBe(true); |
| 974 | + expect(encryptedInput.nonSecret).toBe(originalInput.nonSecret); |
| 975 | + |
| 976 | + mockGetValue.mockImplementation(async (key) => encryptedInput); |
| 977 | + |
| 978 | + process.env[ENV_VARS.INPUT_SECRETS_PRIVATE_KEY_FILE] = testingPrivateKeyFile; |
| 979 | + process.env[ENV_VARS.INPUT_SECRETS_PRIVATE_KEY_PASSPHRASE] = testingPrivateKeyPassphrase; |
| 980 | + const input = await TestingActor.getInput(); |
| 981 | + |
| 982 | + expect(input).toStrictEqual(originalInput); |
| 983 | + |
| 984 | + delete process.env[ENV_VARS.INPUT_SECRETS_PRIVATE_KEY_FILE]; |
| 985 | + delete process.env[ENV_VARS.INPUT_SECRETS_PRIVATE_KEY_PASSPHRASE]; |
| 986 | + mockGetValue.mockRestore(); |
957 | 987 | });
|
958 | 988 | });
|
959 | 989 |
|
|
0 commit comments