
Research
Malicious npm Packages Impersonate Flashbots SDKs, Targeting Ethereum Wallet Credentials
Four npm packages disguised as cryptographic tools steal developer credentials and send them to attacker-controlled Telegram infrastructure.
API client for Pritunl written in Ruby.
Pritunl is a distributed enterprise vpn server built using the OpenVPN protocol. See the official Pritunl API documentation here: https://pritunl.com/api.html. I am not affiliated with Pritunl.
gem install pritunl_api_client
require 'pritunl_api_client'
@pritunl = PritunlApiClient::Client.new(
base_url: 'https://localhost',
api_token: 'p7g444S3IZ5wmFvmzWmx14qACXdzQ25b',
api_secret: 'OpS9fjxkPI3DclkdKDDr6mqYVd0DJh4i',
verify_ssl: false
)
@pritunl.ping
@pritunl.status
{
"host_count" => 1,
"servers_online" => 1,
"hosts_online" => 1,
"server_count" => 2,
"server_version" => "1.11.813.26",
"public_ip" => "10.55.87.4",
"user_count" => 1,
"notification" => "",
"users_online" => 1,
"local_networks" => ["10.55.87.3/31", "10.2.214.0/31"],
"current_host" => "0f273a6c32ed45259c1ecb1ec3ac05ce",
"org_count" => 2
}
@pritunl.log
[
{
"timestamp" => 1450429682,
"message" => "Deleted organization 'org1'.",
"id" => "567386a32221390ea53d8047"
},
{
"timestamp" => 1450429682,
"message" => "Deleted user 'user1'.",
"id" => "567386a32221390ea53d8045"
},
{
"timestamp" => 1450429681,
"message" => "Enabled user 'user2'.",
"id" => "567386a22221390ea53d8042"
}
]
@pritunl.event( cursor: '55e9f1f1b0e730245677dc31' )
[
{
"id" => "55e9f1f1b0e730245677dc31",
"type" => "users_updated",
"timestamp" => 1388495793,
"resource_id" => "55e9f1f8b0e730245677dc34"
},
{
"id" => "55e9f1f2b0e730245677dc32",
"type" => "server_organizations_updated",
"timestamp" => 1388495805,
"resource_id" => "55e9f1f8b0e730245677dc33"
}
]
@pritunl.settings.all
{
"username" => "user6",
"sso_admin" => nil,
"theme" => "dark",
"sso" => nil,
"sso_match" => nil,
"server_cert" => "-----BEGIN CERTIFICATE----------END CERTIFICATE-----",
"public_address" => "10.5.8.46",
"routed_subnet6" => nil,
"email_username" => "user1",
"sso_saml_issuer_url" => nil,
"sso_saml_cert" => nil,
"sso_token" => nil,
"email_password" => true,
"sso_onelogin_key" => nil,
"email_server" => "smtp.example.com",
"auditing" => nil,
"sso_secret" => nil,
"server_key" => "-----BEGIN PRIVATE KEY----------END PRIVATE KEY-----",
"default" => nil,
"sso_host" => nil,
"public_address6" => "2605:1480:2:a210::1",
"secret" => "9D1ZJTscrr2mK4Xnxw76ltmpwnH7udeO",
"sso_okta_token" => nil,
"sso_saml_url" => nil,
"token" => "UQRM0R3bsXDpy3p6nqtjfrbjujSadaAx",
"sso_org" => nil,
"email_from" => "first.last@example.com"
}
@pritunl.settings.update( theme: 'dark' )
@pritunl.settings.update(
email_username: 'user1',
email_password: '12345',
email_server: 'smtp.example.com',
email_from: 'first.last@example.com'
)
@pritunl.user.all( organization_id: org['id'] )
[
{
"auth_type" => "local",
"status" => false,
"dns_servers" => nil,
"otp_secret" => "OPT4HTURJTW6JLQN",
"dns_mapping" => nil,
"dns_suffix" => nil,
"servers" => [
{
"status" => false,
"platform" => nil,
"server_id" => "567369be2231390ea53d76d4",
"local_address" => "10.139.82.6",
"remote_address" => "10.139.82.7",
"virt_address6" => "fd00:c0a8:e800:0:10.139.82.6",
"virt_address" => "10.139.82.6",
"name" => "server1",
"real_address" => "8.8.8.8:41536",
"connected_since" => 1388498640,
"id" => "55e9f995b0e73033d45b44da",
"device_name" => nil
}
],
"disabled" => false,
"network_links" => [],
"sso" => nil,
"bypass_secondary" => false,
"id" => "55e9f98cb0e73033d45b44d7",
"audit" => false,
"name" => "user0",
"organization_name" => "org1",
"gravatar" => true,
"otp_auth" => false,
"organization" => "55e9f7c7b0e73033d45b44d4",
"type" => "client",
"email" => "user0@example.com"
}
]
@pritunl.user.find( user['id'], organization_id: org['id'] )
{
"auth_type" => "local",
"dns_servers" => nil,
"otp_secret" => "OPT4HTURJTW6JLQN",
"dns_suffix" => nil,
"disabled" => true,
"bypass_secondary" => false,
"id" => "55e9f98cb0e73033d45b44d7",
"name" => "user0",
"organization_name" => "org1",
"organization" => "55e9f7c7b0e73033d45b44d4",
"type" => "client",
"email" => "user0@example.com"
}
@pritunl.user.create(
organization_id: org['id'],
name: 'new_user',
email: 'new_user@example.com',
disabled: true
)
@pritunl.user.update( user['id'],
organization_id: org['id'],
name: 'new_name',
email: 'new_email@example.com',
disabled: false
)
@pritunl.user.delete( user['id'], organization_id: org['id'] )
@pritunl.user.otp_secret( user['id'], organization_id: org['id'] )
@pritunl.organization.all
[
{
"user_count" => 512,
"id" => "55e99499b0e7300fef77e2b1",
"name" => "org1"
},
{
"user_count" => 1024,
"id" => "55e9f1d4b0e730245677dc2d",
"name" => "org2"
}
]
@pritunl.organization.find( org['id'] )
{
"user_count" => 512,
"id" => "55e99499b0e7300fef77e2b1",
"name" => "org1"
}
@pritunl.organization.create( name: 'new_org' )
@pritunl.organization.update( org['id'], name: 'new_name' )
@pritunl.organization.delete( org['id'] )
If you omit the path
parameter on any of the key
APIs below, the file content will be directly returned
from the method rather than to a downloaded file.
Deprecated: This method of downloading the OVPN file is not reliable. Use #download_tar
or #download_zip
instead.
User organization must be attached to a server AND user must be enabled and NOT connected!
@pritunl.key.download( organization_id: org['id'], user_id: user['id'], path: 'output.ovpn' )
@pritunl.key.download_tar( organization_id: org['id'], user_id: user['id'], path: 'output.tar' )
@pritunl.key.download_zip( organization_id: org['id'], user_id: user['id'], path: 'output.zip' )
@pritunl.key.download_chromebook_profile( organization_id: org['id'], user_id: user['id'], path: 'output.zip' )
@pritunl.key.temporary_url( organization_id: org['id'], user_id: user['id'] )
{
"view_url" => "/k/MjyaVvGk",
"key_url" => "/key/4f5bd04d85414e20b0a451d642dab06d.tar",
"uri_url" => "/ku/MjyaVvGk",
"key_zip_url" => "/key/4f5bd04d85414e20b0a451d642dab06d.zip",
"key_onc_url" => "/key_onc/4f5bd04d85414e20b0a451d642dab06d.zip",
"id" => "4f5bd04d85414e20b0a451d642dab06d"
}
@pritunl.server.all
@pritunl.server.find( server['id'] )
{
"status" => "pending",
"lzo_compression" => false,
"dns_servers" => ["8.8.4.4"],
"protocol" => "udp",
"ping_interval" => 10,
"dns_mapping" => false,
"network_mode" => "tunnel",
"debug" => false,
"network_end" => nil,
"bind_address" => nil,
"link_ping_interval" => 1,
"hash" => "sha1",
"ipv6_firewall" => true,
"inter_client" => true,
"id" => "5678d5286231390ea53eda96",
"network_start" => nil,
"network" => "10.11.6.0/24",
"local_networks" => [],
"uptime" => nil,
"user_count" => 0,
"name" => "server1",
"dh_param_bits" => 2048,
"max_clients" => 2048,
"users_online" => 0,
"replica_count" => 1,
"link_ping_timeout" => 5,
"port" => 12533,
"devices_online" => 0,
"ping_timeout" => 60,
"mode" => "all_traffic",
"ipv6" => false,
"otp_auth" => false,
"jumbo_frames" => false,
"multi_device" => false,
"search_domain" => "example.com",
"cipher" => "aes256"
}
@pritunl.server.create(
name: 'server1',
network: '10.11.6.0/24',
bind_address: nil,
port: 12533,
protocol: 'udp',
dh_param_bits: 2048,
mode: 'all_traffic',
network_mode: 'tunnel',
network_start: nil,
network_end: nil,
multi_device: false,
local_networks: [],
dns_servers: ['8.8.4.4'],
search_domain: 'pritunl.com',
otp_auth: false,
cipher: 'aes256',
jumbo_frames: false,
lzo_compression: false,
inter_client: true,
ping_interval: 10,
ping_timeout: 60,
max_clients: 2048,
replica_count: 1,
debug: false
)
@pritunl.server.update( server['id'], name: 'server1-rename', dns_servers: ['8.8.8.8', '8.8.4.4'] )
@pritunl.server.delete( server['id'] )
@pritunl.server.start( server['id'] )
@pritunl.server.stop( server['id'] )
@pritunl.server.restart( server['id'] )
@pritunl.server.organizations( server['id'] )
[
{
"id" => "5678d0f48831390da53ef8ae",
"name" => "org1",
"server" => "5678d5286231390ea53eda96"
},
{
"id" => "5678d0f48831392ba71ad3cb",
"name" => "org2",
"server" => "5678d5286231390ea53eda96"
}
]
@pritunl.server.attach_organization( server['id'], organization_id: org['id'] )
{
"id" => "5678d0f48831390da53ef8ae",
"name" => "org1",
"server" => "5678d5286231390ea53eda96"
}
@pritunl.server.remove_organization( server['id'], organization_id: org['id'] )
@pritunl.server.output( server['id'] )
{
"id" => "5678d5286231390ea53eda96",
"output" => [
"[patient-forest-4024] Mon Dec 21 23:45:15 2015 OpenVPN 2.3.2 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [EPOLL] [PKCS11] [eurephia] [MH] [IPv6] built on Dec 1 2014",
"[patient-forest-4024] Mon Dec 21 23:45:15 2015 Control Channel Authentication: tls-auth using INLINE static key file",
"[patient-forest-4024] Mon Dec 21 23:45:15 2015 TUN/TAP device tun11 opened",
"[patient-forest-4024] Mon Dec 21 23:45:15 2015 do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0",
"[patient-forest-4024] Mon Dec 21 23:45:15 2015 /sbin/ip link set dev tun11 up mtu 1500",
"[patient-forest-4024] Mon Dec 21 23:45:15 2015 /sbin/ip addr add dev tun11 10.11.6.1/24 broadcast 10.11.6.255",
"[patient-forest-4024] Mon Dec 21 23:45:15 2015 UDPv4 link local (bound): [undef]",
"[patient-forest-4024] Mon Dec 21 23:45:15 2015 UDPv4 link remote: [undef]",
"[patient-forest-4024] Mon Dec 21 23:45:15 2015 Initialization Sequence Completed"
]
}
@pritunl.server.clear_output( server['id'] )
Bug reports and pull requests are welcome on GitHub at https://github.com/eterry1388/pritunl_api_client. Please make sure all tests pass before making a pull request. The tests are system tests (not unit tests), so please have a live Pritunl server up and running when executing the tests.
BASE_URL='https://your-ip-address' API_TOKEN='your-api-token' API_SECRET='your-api-secret' rspec
The output should look something like this:
PritunlApiClient
Ping server
Get server status
Get logs
Get events
PritunlApiClient::Organization
Create organization
Find organization
Update organization
Get all organizations
Delete organization
PritunlApiClient::User
Create user
Find user
Update user
Get all users
Generate two-step auth for user
Delete user
PritunlApiClient::Key
Download key
Get key
Download tar key
Get tar key
Download zip key
Get zip key
Download chromebook profile onc zip key
Get chromebook profile onc zip key
Get key temporary url
PritunlApiClient::Server
Create server
Find server
Get all servers
Update server
Attach organization
Get all organizations on server
Remove organization
Start server
Restart server
Stop server
Get server output
Clear server output
PritunlApiClient::Settings
Get all settings
Update settings
Finished in 1 minute 11.62 seconds (files took 0.17043 seconds to load)
38 examples, 0 failures
The gem is available as open source under the terms of the MIT License.
FAQs
Unknown package
We found that pritunl_api_client demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Four npm packages disguised as cryptographic tools steal developer credentials and send them to attacker-controlled Telegram infrastructure.
Security News
Ruby maintainers from Bundler and rbenv teams are building rv to bring Python uv's speed and unified tooling approach to Ruby development.
Security News
Following last week’s supply chain attack, Nx published findings on the GitHub Actions exploit and moved npm publishing to Trusted Publishers.