Home / Function/ BannedIPs() — supabase Function Reference

BannedIPs() — supabase Function Reference

Architecture documentation for the BannedIPs() function in BannedIPs.tsx from the supabase codebase.

Entity Profile

Relationship Graph

Source Code

apps/studio/components/interfaces/Settings/Database/BannedIPs.tsx lines 29–163

const BannedIPs = () => {
  const { ref } = useParams()
  const { data: project } = useSelectedProjectQuery()

  const [selectedIPToUnban, setSelectedIPToUnban] = useState<string | null>(null) // Track the selected IP for unban

  const {
    isPending: isLoadingIPList,
    isFetching: isFetchingIPList,
    data: ipList,
    error: ipListError,
  } = useBannedIPsQuery({
    projectRef: ref,
  })

  const { data: userIPAddress } = useUserIPAddressQuery()

  const ipListLoading = isLoadingIPList || isFetchingIPList

  const [showUnban, setShowUnban] = useState(false)
  const [confirmingIP, setConfirmingIP] = useState<string | null>(null) // Track the IP being confirmed for unban

  const { can: canUnbanNetworks } = useAsyncCheckPermissions(PermissionAction.UPDATE, 'projects', {
    resource: {
      project_id: project?.id,
    },
  })

  const { mutate: unbanIPs, isPending: isUnbanning } = useBannedIPsDeleteMutation({
    onSuccess: () => {
      toast.success('IP address successfully unbanned')
      setSelectedIPToUnban(null) // Reset the selected IP for unban
      setShowUnban(false)
    },
    onError: (error) => {
      toast.error(`Failed to unban IP: ${error?.message}`)
    },
  })

  const onConfirmUnbanIP = () => {
    if (confirmingIP == null || !ref) return
    unbanIPs({
      projectRef: ref,
      ips: [confirmingIP], // Pass the IP as an array
    })
  }

  const openConfirmationModal = (ip: string) => {
    setSelectedIPToUnban(ip) // Set the selected IP for unban
    setConfirmingIP(ip) // Set the IP being confirmed for unban
    setShowUnban(true)
  }

  return (
    <>
      <PageSection id="banned-ips">
        <PageSectionMeta>
          <PageSectionSummary>
            <PageSectionTitle>Network Bans</PageSectionTitle>
            <PageSectionDescription>
              List of IP addresses that are temporarily blocked if their traffic pattern looks
              abusive
            </PageSectionDescription>
          </PageSectionSummary>
          <DocsButton href={`${DOCS_URL}/reference/cli/supabase-network-bans`} />
        </PageSectionMeta>
        <PageSectionContent></PageSectionContent>
      </PageSection>
      {/* TODO: Remove mockIpList usage - using mock data for UI testing */}
      {ipListLoading ? (
        <Card>
          <CardContent className="space-y-4">
            <Skeleton className="h-4 w-full" />
            <Skeleton className="h-4 w-full" />
          </CardContent>
        </Card>
      ) : ipListError ? (
        <AlertError
          className="border-0 rounded-none"
          error={ipListError}
          subject="Failed to retrieve banned IP addresses"
        />
      ) : ipList.banned_ipv4_addresses.length > 0 ? (
        <Card>
          {ipList.banned_ipv4_addresses.map((ip) => (
            <CardContent key={ip} className="flex items-center justify-between">
              <div className="flex items-center space-x-5">
                <Globe size={16} className="text-foreground-lighter" />
                <p className="text-sm font-mono">{ip}</p>
                {ip === userIPAddress && <Badge>Your IP address</Badge>}
              </div>
              <ButtonTooltip
                type="default"
                disabled={!canUnbanNetworks}
                onClick={() => openConfirmationModal(ip)}
                tooltip={{
                  content: {
                    side: 'bottom',
                    text: !canUnbanNetworks
                      ? 'You need additional permissions to unban networks'
                      : undefined,
                  },
                }}
              >
                Unban IP
              </ButtonTooltip>
            </CardContent>
          ))}
        </Card>
      ) : (
        <Card>
          <CardContent className="text-foreground-light text-sm">
            There are no banned IP addresses for your project.
          </CardContent>
        </Card>
      )}

      <ConfirmationModal
        variant="destructive"
        size="medium"
        loading={isUnbanning}
        visible={showUnban}
        title="Confirm Unban IP"
        confirmLabel="Confirm Unban"
        confirmLabelLoading="Unbanning..."
        onCancel={() => setShowUnban(false)}
        onConfirm={onConfirmUnbanIP}
        alert={{
          title: 'This action cannot be undone',
          description: `Are you sure you want to unban this IP address ${selectedIPToUnban}?`,
        }}
      />
    </>
  )
}

Subdomains

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free