Git Product home page Git Product logo

interfax-java's Introduction

InterFAX Java Library

Build Status Maven Central

Installation | Getting Started | Usage | Contributing | License

Send and receive faxes in Java with the InterFAX REST API.

Installation

Use of the library requires Java 11 or higher and can be done via one of the following approaches.

Include as maven dependency

<dependency>
  <groupId>net.interfax</groupId>
  <artifactId>api-client</artifactId>
  <version>0.17</version>
</dependency>

Download jar and include in application classpath

Download the latest jar from the Maven central repository and place it in your application classpath.

Getting started

To send a fax from a PDF file:

java.io.File file = new File(absoluteFilePath);
InterFAX interFAX = new DefaultInterFAXClient("username", "password");
APIResponse apiResponse = interFAX.sendFax(faxNumber, file);

Usage

Client | Account | Outbound | Inbound | Documents

Client

The client follows the 12-factor apps principle and can be either set directly or via environment variables.

// Initialize using parameters
InterFAX interFAX = new DefaultInterFAXClient("username", "password");

// Alternative 1: Initialize using environment variables
// Ensure following env vars are initialized with values of your API credentials
// * INTERFAX_USERNAME
// * INTERFAX_PASSWORD
InterFAX interFAX = new DefaultInterFAXClient();

// Alternative 2: Initialize using yaml file
// Create a file called `interfax-api-credentials.yaml` with the following contents, replacing the value of `username`
// and `password` fields with those of your API credentials.
//   username: "api-username"
//   password: "api-password"
InterFAX interFAX = new DefaultInterFAXClient();

All connections are established over HTTPS.

Account

Credit balance

Determine the remaining faxing credits in your account

InterFAX interFAX = new DefaultInterFAXClient();
Double balance = interFAX.getAccountCredits();

More: documentation

Outbound

Send | Get list | Get completed list | Get record | Get image | Cancel fax | Search | Hide fax

Send Fax

Submit a fax to a single destination number.

There are a few ways to send a fax. One way is to directly provide a file path or url.

// with an absoluteFilePath
java.io.File file = new File(absoluteFilePath);
InterFAX interFAX = new DefaultInterFAXClient();
APIResponse apiResponse = interFAX.sendFax(faxNumber, file);

// with an inputstream
InputStream[] inputStreams = {inputStream};
String[] mediaTypes = {"application/pdf"};
InterFAX interFAX = new DefaultInterFAXClient();
APIResponse apiResponse = interFAX.sendFax(faxNumber, inputStreams, mediaTypes);

// with a URL
InterFAX interFAX = new DefaultInterFAXClient();
APIResponse apiResponse = interFAX.sendFax(faxNumber, "https://s3.aws.com/example/fax.html");

InterFAX supports over 20 file types including HTML, PDF, TXT, Word, and many more. For a full list see the Supported File Types documentation.

The returned object is a APIResponse with the statusCode and responseBody of the request submitted to InterFAX.

To send multiple files just pass in an array of files or inputstreams

// using Files
public APIResponse sendFax(final String faxNumber, 
                           final File[] filesToSendAsFax) 
                           throws IOException;
                           
// using Inputstreams
public APIResponse sendFax(final String faxNumber,
                           final InputStream[] streamsToSendAsFax,
                           final String mediaTypes[]) throws IOException;                           

All requests to send a fax can include the following Options: contact, postponeTime, retriesToPerform, csid, pageHeader, reference, pageSize, fitToPage, pageOrientation, resolution, rendering set via SendFaxOptions class


Get Outbound Fax List

Get a list of recent outbound faxes (which does not include batch faxes).

InterFAX interFAX = new DefaultInterFAXClient();
OutboundFaxStructure[] outboundFaxStructures = interFAX.getFaxList();

Using additional Options: limit, lastId, sortOrder, userId

GetFaxListOptions getFaxListOptions = new GetFaxListOptions();
getFaxListOptions.setLimit(Optional.of(5));

InterFAX interFAX = new DefaultInterFAXClient();
OutboundFaxStructure[] outboundFaxStructures = interFAX.getFaxList(Optional.of(getFaxListOptions));

More: documentation


Get Completed Fax List

Get details for a subset of completed faxes from a submitted list. (Submitted id's which have not completed are ignored).

InterFAX interFAX = new DefaultInterFAXClient();
OutboundFaxStructure[] outboundFaxStructures = interFAX.getCompletedFaxList(new String[]{"667915751", "667915471"});

More: documentation


Get Outbound Fax Record

Retrieves information regarding a previously-submitted fax, including its current status.

InterFAX interFAX = new DefaultInterFAXClient();
OutboundFaxStructure outboundFaxStructure = interFAX.getOutboundFaxRecord("667915751");

More: documentation


Get Outbound Fax Image

Retrieve the fax image (TIFF file) of a submitted fax.

InterFAX interFAX = new DefaultInterFAXClient();
byte[] faxImage = interFAX.getOutboundFaxImage("667915751");

More: documentation


Cancel a Fax

Cancel a fax in progress.

InterFAX interFAX = new DefaultInterFAXClient();
APIResponse apiResponse = interFAX.cancelFax("279499862");

More: documentation


Search Fax List

Search for outbound faxes.

InterFAX interFAX = new DefaultInterFAXClient();
OutboundFaxStructure[] outboundFaxStructures = interFAX.searchFaxList();

Using additional Options: ids, reference, dateFrom, dateTo, status, userId, faxNumber, limit, offset

SearchFaxOptions searchFaxOptions = new SearchFaxOptions();
searchFaxOptions.setLimit(Optional.of(3));
searchFaxOptions.setFaxNumber(Optional.of("+442084978672"));
InterFAX interFAX = new DefaultInterFAXClient();
OutboundFaxStructure[] outboundFaxStructures = interFAX.searchFaxList(Optional.of(searchFaxOptions));

More: documentation


Hide Fax

Hide a fax from listing in queries (there is no way to unhide a fax).

InterFAX interFAX = new DefaultInterFAXClient();
APIResponse apiResponse = interFAX.hideFax("667915469");

More: documentation

Inbound

Get list | Get record | Get image | Get emails | Mark as read | Resend to email

Get Inbound Fax List

Retrieves a user's list of inbound faxes. (Sort order is always in descending ID).

InterFAX interFAX = new DefaultInterFAXClient();
InboundFaxStructure[] inboundFaxStructures = interFAX.getInboundFaxList();

Using additional Options: unreadOnly, limit, lastId, allUsers

GetInboundFaxListOptions getInboundFaxListOptions = new GetInboundFaxListOptions();
getInboundFaxListOptions.setAllUsers(Optional.of(true));
getInboundFaxListOptions.setUnreadOnly(Optional.of(true));
getInboundFaxListOptions.setLimit(Optional.of(3));
InterFAX interFAX = new DefaultInterFAXClient();
InboundFaxStructure[] inboundFaxStructures = interFAX.getInboundFaxList(Optional.of(getInboundFaxListOptions));

More: documentation


Get Inbound Fax Record

Retrieves a single fax's metadata (receive time, sender number, etc.).

InterFAX interFAX = new DefaultInterFAXClient();
InboundFaxStructure inboundFaxStructure = interFAX.getInboundFaxRecord("292626603");

More: documentation


Get Inbound Fax Image

Retrieves a single fax's image.

InterFAX interFAX = new DefaultInterFAXClient();
byte[] faxImage = interFAX.getInboundFaxImage(292626603);

More: documentation


Get Forwarding Emails

Retrieve the list of email addresses to which a fax was forwarded.

InterFAX interFAX = new DefaultInterFAXClient();
InboundFaxesEmailsStructure inboundFaxesEmailsStructure = interFAX.getInboundFaxForwardingEmails("1234567");

More: documentation


Mark As Read/Unread

Mark a transaction as read/unread.

InterFAX interFAX = new DefaultInterFAXClient();
APIResponse apiResponse = interFAX.markInboundFax("292626603", Optional.of(true));

More: documentation


Resend Inbound Fax

Resend an inbound fax to a specific email address.

InterFAX interFAX = new DefaultInterFAXClient();
APIResponse apiResponse = interFAX.resendInboundFax("292626603", Optional.of("[email protected]"));

More: documentation

Documents

Upload Document | Get list | Status | Get Upload Status | Cancel

Document uploads are useful for several situations:

  • When your documents are larger than our System Limitations allow and you want to submit them in chunks.
  • When you plan to reuse a document for multiple faxes.
  • When you want a document to be available for use by other users in your account.

Upload Document

Upload a large file in 1 MB chunks

String absoluteFilePath = this.getClass().getClassLoader().getResource("A17_FlightPlan.pdf").getFile();
File file = new File(absoluteFilePath);

InterFAX interFAX = new DefaultInterFAXClient();
APIResponse apiResponse = interFAX.uploadDocument(file);

With additional options,

String absoluteFilePath = this.getClass().getClassLoader().getResource("A17_FlightPlan.pdf").getFile();
File file = new File(absoluteFilePath);

InterFAX interFAX = new DefaultInterFAXClient();
DocumentUploadSessionOptions documentUploadSessionOptions = new DocumentUploadSessionOptions();
documentUploadSessionOptions.setName(Optional.of("overriddenname.pdf"));
documentUploadSessionOptions.setSize(Optional.of(Integer.toUnsignedLong(12345)));
documentUploadSessionOptions.setDisposition(Optional.of(Disposition.multiUse));
documentUploadSessionOptions.setSharing(Optional.of(Sharing.privateDoc));
APIResponse apiResponse = interFAX.uploadDocument(file, Optional.of(documentUploadSessionOptions));

More: documentation - 1, 2


Get Document List

Get a list of previous document uploads which are currently available.

InterFAX interFAX = new DefaultInterFAXClient();
UploadedDocumentStatus[] uploadedDocumentStatuses = interFAX.getUploadedDocumentsList();

With additional Options: limit, offset

InterFAX interFAX = new DefaultInterFAXClient();
GetUploadedDocumentsListOptions getUploadedDocumentsListOptions = new GetUploadedDocumentsListOptions();
getUploadedDocumentsListOptions.setLimit(Optional.of(5));
getUploadedDocumentsListOptions.setOffset(Optional.of(1));
UploadedDocumentStatus[] uploadedDocumentStatuses = interFAX.getUploadedDocumentsList(Optional.of(getUploadedDocumentsListOptions));    

More: documentation


Get Upload Status

Get the current status of a specific document upload.

InterFAX interFAX = new DefaultInterFAXClient();
UploadedDocumentStatus uploadedDocumentStatus = interFAX.getUploadedDocumentStatus("deca890355b44b42944970d9773962b5");

More: documentation


Cancel Document

Cancel a document upload and tear down the upload session, or delete a previous upload.

InterFAX interFAX = new DefaultInterFAXClient();
APIResponse apiResponse = interFAX.cancelDocumentUploadSession("deca890355b44b42944970d9773962b5");

More: documentation

Contributing

  1. Fork the repo on GitHub
  2. Clone the project to your own machine
  3. Commit changes to your own branch
  4. Test the changes you have made
  5. Push your work back up to your fork
  6. Submit a Pull request so that we can review your changes

Testing

Before submitting a contribution please ensure all tests pass.

The project is setup using maven and tests can be run using the following command:

$ mvn clean test

Releasing

Versioning

The project uses semver for versioning.

Minor Releases

If a change is backwards compatible, it can be committed and pushed straight to master. Versioning is handled automatically by incrementing the minor version by 1 and released automatically by travisCI, using the release script.

Major Releases

For breaking changes / major releases, the version number needs to be manually updated in the project pom. Simply increment the major version by 1 and drop the minor version to 0. Example, if the version in the project pom is as follows:

<version>0.34-SNAPSHOT</version>

A major change should update it to:

<version>1.0-SNAPSHOT</version>

Once updated, committed and pushed to master, travisCI handles releasing the version to maven central.

License

This library is released under the MIT License.

interfax-java's People

Stargazers

 avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

interfax-java's Issues

Extract mimeType from retrieved image

Retrieved images can be .tiff or .pdf. In the ruby library we extract the mimeType from the response headers and pass it to the Image object.

https://github.com/interfax/interfax-ruby/blob/bb393008b079fc224eeef460b44dd463a709180f/lib/interfax/inbound.rb#L21

https://github.com/interfax/interfax-ruby/blob/bb393008b079fc224eeef460b44dd463a709180f/lib/interfax/client.rb#L107-L108

This was the user can query the file extension from the image object and use it to give it the right filename.

duplicate maven dependencies jetty

At the moment it is not possible to debug an project including interfax using eclipse jetty.
The jetty WebAppContext initialisation fails with the following error:

java.lang.IllegalArgumentException: Object of class 'org.eclipse.jetty.maven.plugin.JettyWebAppContext' is not of type 'org.eclipse.jetty.webapp.WebAppContext'. Object Class and type Class are from different loaders.

Some invenstigation showed me that the folowing dependency caused the error:

<dependency> <groupId>com.github.tomakehurst</groupId> <artifactId>wiremock</artifactId> <version>2.1.12</version> </dependency>

It is used in DefaultInterFAXClientTest.java.

Fix README formatting

I am spotting a lot of broken Markdown titles (#### in the rendered document). We should look at fixing this.

Exception When Setting PageHeader In SendFax

When sending a fax with sendFax providing SendFaxOptions, if I set the page header to the example found in the documentation thusly:

		options.setPageHeader(Optional.ofNullable("To: {To} From: {From} Pages: {TotalPages}"));

I get the following exception:


java.lang.illegalargumentexception: The template variable 'To' has no value
        at org.glassfish.jersey.uri.UriTemplate$1ValuesFromArrayStrategy.valueFor(UriTemplate.java:1020) ~[jersey-common-2.23.2.jar:?]
        at org.glassfish.jersey.uri.UriTemplate.resolveTemplate(UriTemplate.java:706) ~[jersey-common-2.23.2.jar:?]
at org.glassfish.jersey.uri.UriTemplate.createUriComponent(UriTemplate.java:1030) ~[jersey-common-2.23.2.jar:?]
        at org.glassfish.jersey.uri.UriTemplate.createURIWithStringValues(UriTemplate.java:970) ~[jersey-common-2.23.2.jar:?]
        at org.glassfish.jersey.uri.UriTemplate.createURIWithStringValues(UriTemplate.java:906) ~[jersey-common-2.23.2.jar:?]
        at org.glassfish.jersey.uri.UriTemplate.createURI(UriTemplate.java:871) ~[jersey-common-2.23.2.jar:?]
        at org.glassfish.jersey.uri.internal.JerseyUriBuilder._build(JerseyUriBuilder.java:914) ~[jersey-common-2.23.2.jar:?]
        at org.glassfish.jersey.uri.internal.JerseyUriBuilder.build(JerseyUriBuilder.java:831) ~[jersey-common-2.23.2.jar:?]
        at net.interfax.rest.client.impl.DefaultInterFAXClient.getSendFaxUri(DefaultInterFAXClient.java:705) ~[api-client-0.6.jar:?]
        at net.interfax.rest.client.impl.DefaultInterFAXClient.sendMultiPartFax(DefaultInterFAXClient.java:585) ~[api-client-0.6.jar:?]
	at net.interfax.rest.client.impl.DefaultInterFAXClient.sendFax(DefaultInterFAXClient.java:170) ~[api-client-0.6.jar:?]

I don't have time to debug this at the moment but I thought that it was important to document it.

Clarification on maven

@anuragkapur does this work as is? Or does ${latest-version} need to be replaced by 0.1.0?

<dependency>
  <groupId>net.interfax</groupId>
  <artifactId>api-client</artifactId>
  <version>${latest-version}</version>
</dependency>

Add syntax highlighting to README

@anuragkapur can we please add some syntax highlighting to the code samples?

You currently used indentation to make code samples:

    InterFAXClient interFAXClient = new InterFAXJerseyClient();
    APIResponse apiResponse = interFAXClient.hideFax("667915469");

If you replace this with backticks you can specify a language as well and get syntax highlighted code.

```java
InterFAXClient interFAXClient = new InterFAXJerseyClient();
APIResponse apiResponse = interFAXClient.hideFax("667915469");
```

Like this:

InterFAXClient interFAXClient = new InterFAXJerseyClient();
APIResponse apiResponse = interFAXClient.hideFax("667915469");

How to get Fax ID for sent fax?

@anuragkapur I am trying to write some samples for the Java library and getting rather stuck.

I can send a fax, but the response seems to be rather... simple. For example, as far as I can tell I can only get the response status, headers and raw body after sending a fax, where ideally I just need the fax ID at that point.

In the other SDKs we have wrapped the API return objects into their own classes/objects to make this kind of discovery a lot easier. Is there a reason why we didn't do this in Java?

Can we rename InterFAXJerseyClient?

@anuragkapur I understand we use Jersey under the hood, but do we really need to make that name appear in the class names?

I'd prefer

InterFAXClient interFAXClient = new InterFAXJerseyClient("api-username", "api-password");

to be

InterFAXClient interFAXClient = new InterFAXClient("api-username", "api-password");

If possible I'd even prefer it to be more like this:

InterFAX interfax = new InterFAX("api-username", "api-password");

but I might be pushing my ruby-ism here :)

Not all artifacts for 0.16 release are (consistently) published

[error] sbt.librarymanagement.ResolveException: Error downloading commons-beanutils:commons-beanutils-core:1.8.3-SONATYPE
[error] Not found
[error] Not found
[error] not found: /Users/jaguilera/KariusDx/karius/.cache/ivy2/local/commons-beanutils/commons-beanutils-core/1.8.3-SONATYPE/ivys/ivy.xml
[error] not found: https://karius.jfrog.io/karius/ivy/commons-beanutils/commons-beanutils-core/1.8.3-SONATYPE/ivys/ivy.xml
[error] not found: https://karius.jfrog.io/karius/mvn/commons-beanutils/commons-beanutils-core/1.8.3-SONATYPE/commons-beanutils-core-1.8.3-SONATYPE.pom
[error] at lmcoursier.CoursierDependencyResolution.unresolvedWarningOrThrow(CoursierDependencyResolution.scala:249)
[error] at lmcoursier.CoursierDependencyResolution.$anonfun$update$35(CoursierDependencyResolution.scala:218)
[error] at scala.util.Either$LeftProjection.map(Either.scala:573)
[error] at lmcoursier.CoursierDependencyResolution.update(CoursierDependencyResolution.scala:218)
[error] at sbt.librarymanagement.DependencyResolution.update(DependencyResolution.scala:60)
[error] at sbt.internal.LibraryManagement$.resolve$1(LibraryManagement.scala:52)
[error] at sbt.internal.LibraryManagement$.$anonfun$cachedUpdate$12(LibraryManagement.scala:102)
[error] at sbt.util.Tracked$.$anonfun$lastOutput$1(Tracked.scala:69)
[error] at sbt.internal.LibraryManagement$.$anonfun$cachedUpdate$20(LibraryManagement.scala:115)
[error] at scala.util.control.Exception$Catch.apply(Exception.scala:228)
[error] at sbt.internal.LibraryManagement$.$anonfun$cachedUpdate$11(LibraryManagement.scala:115)
[error] at sbt.internal.LibraryManagement$.$anonfun$cachedUpdate$11$adapted(LibraryManagement.scala:96)
[error] at sbt.util.Tracked$.$anonfun$inputChanged$1(Tracked.scala:150)
[error] at sbt.internal.LibraryManagement$.cachedUpdate(LibraryManagement.scala:129)
[error] at sbt.Classpaths$.$anonfun$updateTask0$5(Defaults.scala:2950)
[error] at scala.Function1.$anonfun$compose$1(Function1.scala:49)
[error] at sbt.internal.util.$tilde$greater.$anonfun$$u2219$1(TypeFunctions.scala:62)
[error] at sbt.std.Transform$$anon$4.work(Transform.scala:67)
[error] at sbt.Execute.$anonfun$submit$2(Execute.scala:281)
[error] at sbt.internal.util.ErrorHandling$.wideConvert(ErrorHandling.scala:19)
[error] at sbt.Execute.work(Execute.scala:290)
[error] at sbt.Execute.$anonfun$submit$1(Execute.scala:281)
[error] at sbt.ConcurrentRestrictions$$anon$4.$anonfun$submitValid$1(ConcurrentRestrictions.scala:178)
[error] at sbt.CompletionService$$anon$2.call(CompletionService.scala:37)
[error] at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
[error] at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
[error] at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
[error] at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
[error] at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
[error] at java.base/java.lang.Thread.run(Thread.java:834)
[error] (com-kariusdx-interfax / update) sbt.librarymanagement.ResolveException: Error downloading commons-beanutils:commons-beanutils-core:1.8.3-SONATYPE
[error] Not found
[error] Not found
[error] not found: /Users/jaguilera/KariusDx/karius/.cache/ivy2/local/commons-beanutils/commons-beanutils-core/1.8.3-SONATYPE/ivys/ivy.xml
[error] not found: https://karius.jfrog.io/karius/ivy/commons-beanutils/commons-beanutils-core/1.8.3-SONATYPE/ivys/ivy.xml
[error] not found: https://karius.jfrog.io/karius/mvn/commons-beanutils/commons-beanutils-core/1.8.3-SONATYPE/commons-beanutils-core-1.8.3-SONATYPE.pom

Some methods expect Strings where the API returns Longs

I ran into this issue here:

// get the faxes
InboundFaxStructure[] faxes = interfax.getInboundFaxList(
  Optional.of(options)
);

for (InboundFaxStructure fax : faxes) {
  byte[] image = interfax.getInboundFaxImage(fax.getMessageId());
}

This doesn't work as getMessageId() returns a long and getInboundFaxImage() requires a string.

Write a simple getting started sample

@anuragkapur please have a look at the Getting Started in the ruby library https://github.com/interfax/interfax-ruby

As you can see it's not the point to explain how to initialise the client, instead it's a few lines to demonstrate how to use the library to send a fax, and check it's status. Please move the client section to under Usage and expand the Getting started in the same way as we did for the Ruby library.

InvalidFormatException when contact is set in sendFaxOptions

I have a problem when retrieving the outbound queue (interFAX.getFaxList()). The problem occurred only after I started using SendFaxOptions to send faxes, before that when sending without SendFaxOptions the queue was retrieved OK. I use the last version of the API 0.11. The java version is 1.8. I have no other dependencies for JSON, Jackson etc, only net.interfax api-client.

Here is the code I use to send faxes.

....
SendFaxOptions sendFaxOptions = new SendFaxOptions();
sendFaxOptions.setContact(Optional.of("GABA Versicherungen"));
sendFaxOptions.setReference(Optional.of("Ref-20171117-2321423"));
Optional options = Optional.of(sendFaxOptions);
apiResponse = interFAX.sendFax(faxNumber, file, options);
...

The fax is sent OK, I can see it in the queue on the web interface, but when I try to retrieve it with the API
OutboundFaxStructure[] list = interFAX.getFaxList();
I got an exception:
....
Caused by: com.fasterxml.jackson.databind.exc.InvalidFormatException: Can not construct instance of java.lang.Integer from String value 'GABA Versicherungen': not a valid Integer value
at [Source: org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream@340da44c; line: 1, column: 48] (through reference chain: Object[][0]->net.interfax.rest.client.domain.OutboundFaxStructure["contact"])
...

Exactly the same problem with interFAX.searchFaxList(). As if It excepts the contract option to be integer, but in the documentation it is String, or maybe some other reason for the exception, anyway I can not get the Outbound queue, and it is important to me.

No way to send an in-memory document

With the old API it was possible to send documents using the Sendfax_Ex_2 call without ever writing them to disk. For security, performance and compliance (HIPAA) reasons that is very helpful.

I would like to ask that sendFax methods be added that take one or more input streams (or even byte arrays) and corresponding mime hints so that this function can be reproduced. With input streams, StreamDataBodyPart exists as a natural analog to FileDataBodyPart, so the code in the File array version of sendFax could be easily modified.

Having to write and manage temporary files that contain secure data is problematic.

Security warnings on several dependencies

Several of the dependencies of this library have critical security errors.

The following seem to be safe to update by just updating the versions to the following:

commons-beanutils:commons-beanutils-core:1.8.3
org.apache.maven.shared:maven-shared-utils:3.3.4
com.thoughtworks.xstream:xstream:1.4.19
jakarta.annotation:jakarta.annotation-api:1.3.5

The org.yaml:snakeyaml:1.30 dependency needs to be updated to 2.0 to resolve CVE-2022-1471. This requires code changes since the library is not backward compatible.

Link to latest JAR?

@anuragkapur currently the README links to the 0.1.0 version of the JAR (under the OSS Sonatype InterFAX repository link). Can we link instead to a page that lists all versions? Or the latest version?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.