Skip to content

Commit

Permalink
hasPermission, getPermissions, grantPermissions, revokePermissions, s…
Browse files Browse the repository at this point in the history
…etPermissions
  • Loading branch information
teogeb committed Oct 1, 2024
1 parent 53e3fed commit b64f7a3
Show file tree
Hide file tree
Showing 32 changed files with 141 additions and 131 deletions.
8 changes: 6 additions & 2 deletions packages/cli-tools/bin/streamr-stream-show.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
#!/usr/bin/env node
import { StreamrClient, UserPermissionAssignment } from '@streamr/sdk'
import { Options as BaseOptions, createClientCommand } from '../src/command'
import '../src/logLevel'
import { StreamrClient } from '@streamr/sdk'
import { createClientCommand, Options as BaseOptions } from '../src/command'
import { getPermissionId } from '../src/permission'
import { toUserId } from '@streamr/utils'

interface Options extends BaseOptions {
includePermissions: boolean
Expand All @@ -16,6 +17,9 @@ createClientCommand(async (client: StreamrClient, streamId: string, options: Opt
obj.permissions = assigments.map((assignment) => {
return {
...assignment,
user: ((assignment as UserPermissionAssignment).user !== undefined)
? toUserId((assignment as UserPermissionAssignment).user)
: undefined,
permissions: assignment.permissions.map(getPermissionId)
}
})
Expand Down
3 changes: 2 additions & 1 deletion packages/cli-tools/src/permission.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { Argument } from 'commander'
import { PermissionAssignment, Stream, StreamPermission, StreamrClient } from '@streamr/sdk'
import { createClientCommand } from './command'
import { toUserId, toUserIdRaw } from '@streamr/utils'

const PUBLIC_USER_ID = 'public'

Expand Down Expand Up @@ -40,7 +41,7 @@ export const runModifyPermissionsCommand = (
} else {
assignment = {
permissions,
user
user: toUserIdRaw(toUserId(user))
}
}
await modify(stream, assignment)
Expand Down
7 changes: 4 additions & 3 deletions packages/cli-tools/test/stream-permission.test.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { fetchPrivateKeyWithGas, randomUserIdOld } from '@streamr/test-utils'
import { toUserIdRaw } from '@streamr/utils'
import { fetchPrivateKeyWithGas, randomUserId } from '@streamr/test-utils'
import 'jest-extended'
import { StreamPermission } from '@streamr/sdk'
import { createTestClient, runCommand } from './utils'
Expand All @@ -9,9 +10,9 @@ describe('permission', () => {
const privateKey = await fetchPrivateKeyWithGas()
const client = createTestClient(privateKey)
const stream = await client.createStream(`/${Date.now()}`)
const otherUser = randomUserIdOld()
const otherUser = randomUserId()
const hasPermission = () => client.hasPermission({
user: otherUser,
user: toUserIdRaw(otherUser),
permission: StreamPermission.PUBLISH,
streamId: stream.id,
allowPublic: false
Expand Down
4 changes: 2 additions & 2 deletions packages/cli-tools/test/stream-publish-subscribe.test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Wallet } from 'ethers'
import { fetchPrivateKeyWithGas } from '@streamr/test-utils'
import { collect } from '@streamr/utils'
import { collect, toUserId, toUserIdRaw } from '@streamr/utils'
import { StreamPermission } from '@streamr/sdk'
import { createTestClient, runCommand, startCommand } from './utils'

Expand All @@ -18,7 +18,7 @@ describe('publish and subscribe', () => {
const client = createTestClient(publisherPrivateKey)
const stream = await client.createStream(`/${Date.now()}`)
await stream.grantPermissions({
user: new Wallet(subscriberPrivateKey).address,
user: toUserIdRaw(toUserId(new Wallet(subscriberPrivateKey).address)),
permissions: [StreamPermission.SUBSCRIBE]
})
streamId = stream.id
Expand Down
4 changes: 2 additions & 2 deletions packages/node/test/integration/broker-subscriptions.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { Wallet } from 'ethers'
import mqtt, { AsyncMqttClient } from 'async-mqtt'
import { StreamrClient, Stream, StreamPartID, StreamPermission } from '@streamr/sdk'
import { fastWallet, fetchPrivateKeyWithGas } from '@streamr/test-utils'
import { wait, waitForCondition } from '@streamr/utils'
import { toUserId, toUserIdRaw, wait, waitForCondition } from '@streamr/utils'
import { Broker } from '../../src/broker'
import { startBroker, createClient, createTestStream } from '../utils'

Expand All @@ -18,7 +18,7 @@ const createMqttClient = (mqttPort: number) => {
const grantPermissions = async (streams: Stream[], brokerUsers: Wallet[]) => {
for await (const s of streams) {
const assignments = brokerUsers.map((user) => {
return { permissions: [StreamPermission.SUBSCRIBE], user: user.address }
return { permissions: [StreamPermission.SUBSCRIBE], user: toUserIdRaw(toUserId(user.address)) }
})
await s.grantPermissions(...assignments)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import {
_operatorContractUtils
} from '@streamr/sdk'
import { fastPrivateKey, fetchPrivateKeyWithGas } from '@streamr/test-utils'
import { collect, waitForCondition, StreamPartIDUtils, EthereumAddress, toEthereumAddress } from '@streamr/utils'
import { collect, waitForCondition, StreamPartIDUtils, EthereumAddress, toEthereumAddress, toUserIdRaw } from '@streamr/utils'
import { Wallet } from 'ethers'
import { Broker, createBroker } from '../../../../src/broker'
import { createClient, createTestStream, formConfig, startBroker } from '../../../utils'
Expand Down Expand Up @@ -60,7 +60,7 @@ describe('OperatorPlugin', () => {
const publisher = createClient(fastPrivateKey())
await stream.grantPermissions({
permissions: [StreamPermission.PUBLISH],
user: await publisher.getAddress()
user: toUserIdRaw(await publisher.getUserId())
})
const publishTimer = setInterval(async () => {
await publisher.publish({ id: stream.id }, { foo: 'bar' })
Expand Down
25 changes: 14 additions & 11 deletions packages/sdk/src/contracts/StreamRegistry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,14 @@ import {
Logger,
StreamID,
StreamIDUtils,
TheGraphClient, UserID, UserIDOld, collect,
TheGraphClient,
UserID,
collect,
isENSName,
toEthereumAddress,
toStreamID,
toUserId
toUserId,
toUserIdRaw
} from '@streamr/utils'
import { ContractTransactionResponse } from 'ethers'
import { Lifecycle, inject, scoped } from 'tsyringe'
Expand Down Expand Up @@ -356,9 +359,9 @@ export class StreamRegistry {
if (isPublicPermissionQuery(query)) {
return this.streamRegistryContractReadonly.hasPublicPermission(streamId, permissionType)
} else if (query.allowPublic) {
return this.streamRegistryContractReadonly.hasPermission(streamId, toEthereumAddress(query.user), permissionType)
return this.streamRegistryContractReadonly.hasPermission(streamId, toUserId(query.user), permissionType)
} else {
return this.streamRegistryContractReadonly.hasDirectPermission(streamId, toEthereumAddress(query.user), permissionType)
return this.streamRegistryContractReadonly.hasDirectPermission(streamId, toUserId(query.user), permissionType)
}
}

Expand Down Expand Up @@ -408,7 +411,7 @@ export class StreamRegistry {
})
} else {
assignments.push({
user: permissionResult.userAddress,
user: toUserIdRaw(toUserId(permissionResult.userAddress)),
permissions
})
}
Expand All @@ -419,7 +422,7 @@ export class StreamRegistry {

async grantPermissions(streamIdOrPath: string, ...assignments: PermissionAssignment[]): Promise<void> {
const overrides = await getEthersOverrides(this.rpcProviderSource, this.config)
return this.updatePermissions(streamIdOrPath, (streamId: StreamID, user: UserIDOld | undefined, solidityType: bigint) => {
return this.updatePermissions(streamIdOrPath, (streamId: StreamID, user: UserID | undefined, solidityType: bigint) => {
return (user === undefined)
? this.streamRegistryContract!.grantPublicPermission(streamId, solidityType, overrides)
: this.streamRegistryContract!.grantPermission(streamId, user, solidityType, overrides)
Expand All @@ -429,7 +432,7 @@ export class StreamRegistry {
/* eslint-disable max-len */
async revokePermissions(streamIdOrPath: string, ...assignments: PermissionAssignment[]): Promise<void> {
const overrides = await getEthersOverrides(this.rpcProviderSource, this.config)
return this.updatePermissions(streamIdOrPath, (streamId: StreamID, user: UserIDOld | undefined, solidityType: bigint) => {
return this.updatePermissions(streamIdOrPath, (streamId: StreamID, user: UserID | undefined, solidityType: bigint) => {
return (user === undefined)
? this.streamRegistryContract!.revokePublicPermission(streamId, solidityType, overrides)
: this.streamRegistryContract!.revokePermission(streamId, user, solidityType, overrides)
Expand All @@ -438,7 +441,7 @@ export class StreamRegistry {

private async updatePermissions(
streamIdOrPath: string,
createTransaction: (streamId: StreamID, user: UserIDOld | undefined, solidityType: bigint) => Promise<ContractTransactionResponse>,
createTransaction: (streamId: StreamID, user: UserID | undefined, solidityType: bigint) => Promise<ContractTransactionResponse>,
...assignments: PermissionAssignment[]
): Promise<void> {
const streamId = await this.streamIdBuilder.toStreamID(streamIdOrPath)
Expand All @@ -447,7 +450,7 @@ export class StreamRegistry {
for (const assignment of assignments) {
for (const permission of assignment.permissions) {
const solidityType = streamPermissionToSolidityType(permission)
const user = isPublicPermissionAssignment(assignment) ? undefined : toEthereumAddress(assignment.user)
const user = isPublicPermissionAssignment(assignment) ? undefined : toUserId(assignment.user)
const txToSubmit = createTransaction(streamId, user, solidityType)
// eslint-disable-next-line no-await-in-loop
await waitForTx(txToSubmit)
Expand All @@ -460,15 +463,15 @@ export class StreamRegistry {
assignments: PermissionAssignment[]
}[]): Promise<void> {
const streamIds: StreamID[] = []
const targets: string[][] = []
const targets: (UserID | typeof PUBLIC_PERMISSION_ADDRESS)[][] = []
const chainPermissions: ChainPermissions[][] = []
for (const item of items) {
// eslint-disable-next-line no-await-in-loop
const streamId = await this.streamIdBuilder.toStreamID(item.streamId)
this.clearStreamCache(streamId)
streamIds.push(streamId)
targets.push(item.assignments.map((assignment) => {
return isPublicPermissionAssignment(assignment) ? PUBLIC_PERMISSION_ADDRESS : assignment.user
return isPublicPermissionAssignment(assignment) ? PUBLIC_PERMISSION_ADDRESS : toUserId(assignment.user)
}))
chainPermissions.push(item.assignments.map((assignment) => {
return convertStreamPermissionsToChainPermission(assignment.permissions)
Expand Down
4 changes: 2 additions & 2 deletions packages/sdk/src/permission.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ export enum StreamPermission {
export interface UserPermissionQuery {
streamId: string
permission: StreamPermission
user: string
user: Uint8Array
allowPublic: boolean
}

Expand All @@ -26,7 +26,7 @@ export type PermissionQuery = UserPermissionQuery | PublicPermissionQuery

export interface UserPermissionAssignment {
permissions: StreamPermission[]
user: string
user: Uint8Array
}

export interface PublicPermissionAssignment {
Expand Down
2 changes: 1 addition & 1 deletion packages/sdk/test/browser-smoke-test/smoke-test.html
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
// 2. Grant permissions
await stream.grantPermissions({
permissions: ['subscribe'],
user: await subscriberClient.getAddress()
user: toUserIdRaw(await subscriberClient.getUserId())
})
document.getElementById('permissionGranted').checked = true
document.getElementById('permissionGrantedValue').value = await subscriberClient.getAddress()
Expand Down
Loading

0 comments on commit b64f7a3

Please sign in to comment.