mirror of
https://github.com/vanitasvitae/Smack.git
synced 2024-11-23 20:42:06 +01:00
DRAFT/WIP Started XEP-0373: OpenPGP for XMPP implementation
This commit is contained in:
parent
8011ba96bb
commit
dd9c693c3a
22 changed files with 807 additions and 1 deletions
|
@ -26,4 +26,6 @@ include 'smack-core',
|
||||||
'smack-omemo',
|
'smack-omemo',
|
||||||
'smack-omemo-signal',
|
'smack-omemo-signal',
|
||||||
'smack-omemo-signal-integration-test',
|
'smack-omemo-signal-integration-test',
|
||||||
'smack-repl'
|
'smack-repl',
|
||||||
|
'smack-openpgp',
|
||||||
|
'smack-openpgp-bouncycastle'
|
||||||
|
|
12
smack-openpgp-bouncycastle/build.gradle
Normal file
12
smack-openpgp-bouncycastle/build.gradle
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
description = """\
|
||||||
|
Smack API for OpenPGP using Bouncycastle."""
|
||||||
|
|
||||||
|
// Note that the test dependencies (junit, …) are inferred from the
|
||||||
|
// sourceSet.test of the core subproject
|
||||||
|
dependencies {
|
||||||
|
compile project(':smack-core')
|
||||||
|
compile project(':smack-openpgp')
|
||||||
|
compile 'org.bouncycastle:bcpg-jdk15on:1.56'
|
||||||
|
testCompile project(path: ":smack-core", configuration: "testRuntime")
|
||||||
|
testCompile project(path: ":smack-core", configuration: "archives")
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright 2017 Florian Schmaus.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.jivesoftware.smackx.ox.bouncycastle;
|
||||||
|
|
||||||
|
import java.io.InputStream;
|
||||||
|
|
||||||
|
import org.jivesoftware.smackx.ox.OpenPgpMessage;
|
||||||
|
import org.jivesoftware.smackx.ox.OpenPgpProvider;
|
||||||
|
|
||||||
|
public class BouncycastleOpenPgpProvider implements OpenPgpProvider {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public OpenPgpMessage toOpenPgpMessage(InputStream is) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright 2017 Florian Schmaus.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Providers for XEP-0373: OpenPGP for XMPP using Bouncycastle.
|
||||||
|
*/
|
||||||
|
package org.jivesoftware.smackx.ox.bouncycastle;
|
10
smack-openpgp/build.gradle
Normal file
10
smack-openpgp/build.gradle
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
description = """\
|
||||||
|
Smack API for XEP-0373: OpenPGP for XMPP."""
|
||||||
|
|
||||||
|
// Note that the test dependencies (junit, …) are inferred from the
|
||||||
|
// sourceSet.test of the core subproject
|
||||||
|
dependencies {
|
||||||
|
compile project(':smack-core')
|
||||||
|
testCompile project(path: ":smack-core", configuration: "testRuntime")
|
||||||
|
testCompile project(path: ":smack-core", configuration: "archives")
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright 2017 Florian Schmaus.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.jivesoftware.smackx.ox;
|
||||||
|
|
||||||
|
import java.io.InputStream;
|
||||||
|
|
||||||
|
public class OpenPgpManager {
|
||||||
|
|
||||||
|
public static OpenPgpMessage toOpenPgpMessage(InputStream is) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,82 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright 2017 Florian Schmaus.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.jivesoftware.smackx.ox;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import org.jivesoftware.smackx.ox.element.CryptElement;
|
||||||
|
import org.jivesoftware.smackx.ox.element.OpenPgpContentElement;
|
||||||
|
import org.jivesoftware.smackx.ox.element.SignElement;
|
||||||
|
import org.jivesoftware.smackx.ox.element.SigncryptElement;
|
||||||
|
import org.jivesoftware.smackx.ox.provider.OpenPgpContentElementProvider;
|
||||||
|
import org.xmlpull.v1.XmlPullParserException;
|
||||||
|
|
||||||
|
public class OpenPgpMessage {
|
||||||
|
|
||||||
|
enum State {
|
||||||
|
signcrypt,
|
||||||
|
sign,
|
||||||
|
crypt,
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
private final String element;
|
||||||
|
private final State state;
|
||||||
|
|
||||||
|
private OpenPgpContentElement openPgpContentElement;
|
||||||
|
|
||||||
|
public OpenPgpMessage(State state, String content) {
|
||||||
|
this.element = content;
|
||||||
|
this.state = state;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OpenPgpContentElement getOpenPgpContentElement() throws XmlPullParserException, IOException {
|
||||||
|
ensureOpenPgpContentElementSet();
|
||||||
|
|
||||||
|
return openPgpContentElement;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ensureOpenPgpContentElementSet() throws XmlPullParserException, IOException {
|
||||||
|
if (openPgpContentElement != null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
openPgpContentElement = OpenPgpContentElementProvider.parseOpenPgpContentElement(element);
|
||||||
|
switch (state) {
|
||||||
|
case signcrypt:
|
||||||
|
if (!(openPgpContentElement instanceof SigncryptElement)) {
|
||||||
|
throw new IllegalStateException(
|
||||||
|
"The used OpenPGP content element does not match the mode used in the raw OpenPGP message. Content element: "
|
||||||
|
+ openPgpContentElement.getElementName() + ". Mode: " + state);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case sign:
|
||||||
|
if (!(openPgpContentElement instanceof SignElement)) {
|
||||||
|
throw new IllegalStateException(
|
||||||
|
"The used OpenPGP content element does not match the mode used in the raw OpenPGP message. Content element: "
|
||||||
|
+ openPgpContentElement.getElementName() + ". Mode: " + state);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case crypt:
|
||||||
|
if (!(openPgpContentElement instanceof CryptElement)) {
|
||||||
|
throw new IllegalStateException(
|
||||||
|
"The used OpenPGP content element does not match the mode used in the raw OpenPGP message. Content element: "
|
||||||
|
+ openPgpContentElement.getElementName() + ". Mode: " + state);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,25 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright 2017 Florian Schmaus.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.jivesoftware.smackx.ox;
|
||||||
|
|
||||||
|
import java.io.InputStream;
|
||||||
|
|
||||||
|
public interface OpenPgpProvider {
|
||||||
|
|
||||||
|
public OpenPgpMessage toOpenPgpMessage(InputStream is);
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,44 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright 2017 Florian Schmaus.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.jivesoftware.smackx.ox.element;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.jivesoftware.smack.packet.ExtensionElement;
|
||||||
|
import org.jxmpp.jid.Jid;
|
||||||
|
|
||||||
|
public class CryptElement extends EncryptedOpenPgpContentElement {
|
||||||
|
|
||||||
|
public static final String ELEMENT = "crypt";
|
||||||
|
|
||||||
|
public CryptElement(List<Jid> to, String rpad, Date timestamp, List<ExtensionElement> payload) {
|
||||||
|
super(to, rpad, timestamp, payload);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getElementName() {
|
||||||
|
return ELEMENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CharSequence toXML() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,41 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright 2017 Florian Schmaus.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.jivesoftware.smackx.ox.element;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.jivesoftware.smack.packet.ExtensionElement;
|
||||||
|
import org.jivesoftware.smack.util.XmlStringBuilder;
|
||||||
|
import org.jxmpp.jid.Jid;
|
||||||
|
|
||||||
|
public abstract class EncryptedOpenPgpContentElement extends OpenPgpContentElement {
|
||||||
|
|
||||||
|
private final String rpad;
|
||||||
|
|
||||||
|
protected EncryptedOpenPgpContentElement(List<Jid> to, String rpad, Date timestamp, List<ExtensionElement> payload) {
|
||||||
|
super(to, timestamp, payload);
|
||||||
|
this.rpad = rpad;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void addCommonXml(XmlStringBuilder xml) {
|
||||||
|
super.addCommonXml(xml);
|
||||||
|
|
||||||
|
xml.openElement("rpad").escape(rpad).closeElement("rpad");
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,78 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright 2017 Florian Schmaus.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.jivesoftware.smackx.ox.element;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.jivesoftware.smack.packet.ExtensionElement;
|
||||||
|
import org.jivesoftware.smack.util.XmlStringBuilder;
|
||||||
|
import org.jxmpp.jid.Jid;
|
||||||
|
import org.jxmpp.util.XmppDateTime;
|
||||||
|
|
||||||
|
public abstract class OpenPgpContentElement implements ExtensionElement {
|
||||||
|
|
||||||
|
private final List<Jid> to;
|
||||||
|
private final Date timestamp;
|
||||||
|
private final List<ExtensionElement> payload;
|
||||||
|
|
||||||
|
private String timestampString;
|
||||||
|
|
||||||
|
protected OpenPgpContentElement(List<Jid> to, Date timestamp, List<ExtensionElement> payload) {
|
||||||
|
this.to = to;
|
||||||
|
this.timestamp = timestamp;
|
||||||
|
this.payload = payload;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final List<Jid> getTo() {
|
||||||
|
return to;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final Date getTimestamp() {
|
||||||
|
return timestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final List<ExtensionElement> getPayload() {
|
||||||
|
return payload;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getNamespace() {
|
||||||
|
return OpenPgpElement.NAMESPACE;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void ensureTimestampStringSet() {
|
||||||
|
if (timestampString != null) return;
|
||||||
|
|
||||||
|
timestampString = XmppDateTime.formatXEP0082Date(timestamp);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void addCommonXml(XmlStringBuilder xml) {
|
||||||
|
for (Jid toJid : to) {
|
||||||
|
xml.halfOpenElement("to").attribute("jid", toJid).closeEmptyElement();
|
||||||
|
}
|
||||||
|
|
||||||
|
ensureTimestampStringSet();
|
||||||
|
xml.halfOpenElement("time").attribute("stamp", timestampString).closeEmptyElement();
|
||||||
|
|
||||||
|
xml.openElement("payload");
|
||||||
|
for (ExtensionElement element : payload) {
|
||||||
|
xml.append(element.toXML());
|
||||||
|
}
|
||||||
|
xml.closeElement("payload");
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,85 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright 2017 Florian Schmaus.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.jivesoftware.smackx.ox.element;
|
||||||
|
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
|
||||||
|
import org.jivesoftware.smack.packet.ExtensionElement;
|
||||||
|
import org.jivesoftware.smack.util.stringencoder.Base64;
|
||||||
|
import org.jivesoftware.smackx.ox.OpenPgpManager;
|
||||||
|
import org.jivesoftware.smackx.ox.OpenPgpMessage;
|
||||||
|
import org.xmlpull.v1.XmlPullParserException;
|
||||||
|
|
||||||
|
public class OpenPgpElement implements ExtensionElement {
|
||||||
|
|
||||||
|
public static final String ELEMENT = "openpgp";
|
||||||
|
public static final String NAMESPACE = "urn:xmpp:openpg:0";
|
||||||
|
|
||||||
|
private final String base64EncodedOpenPgpMessage;
|
||||||
|
|
||||||
|
private OpenPgpMessage openPgpMessage;
|
||||||
|
|
||||||
|
private byte[] openPgpMessageBytes;
|
||||||
|
|
||||||
|
private OpenPgpContentElement openPgpContentElement;
|
||||||
|
|
||||||
|
public OpenPgpElement(String base64EncodedOpenPgpMessage) {
|
||||||
|
this.base64EncodedOpenPgpMessage = base64EncodedOpenPgpMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OpenPgpMessage getOpenPgpMessage() {
|
||||||
|
if (openPgpMessage == null) {
|
||||||
|
ensureOpenPgpMessageBytesSet();
|
||||||
|
InputStream is = new ByteArrayInputStream(openPgpMessageBytes);
|
||||||
|
openPgpMessage = OpenPgpManager.toOpenPgpMessage(is);
|
||||||
|
}
|
||||||
|
|
||||||
|
return openPgpMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OpenPgpContentElement getContentElement() throws XmlPullParserException, IOException {
|
||||||
|
if (openPgpContentElement == null) {
|
||||||
|
openPgpContentElement = getOpenPgpMessage().getOpenPgpContentElement();
|
||||||
|
}
|
||||||
|
|
||||||
|
return openPgpContentElement;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getElementName() {
|
||||||
|
return ELEMENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getNamespace() {
|
||||||
|
return NAMESPACE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CharSequence toXML() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private final void ensureOpenPgpMessageBytesSet() {
|
||||||
|
if (openPgpMessageBytes != null) return;
|
||||||
|
|
||||||
|
openPgpMessageBytes = Base64.decode(base64EncodedOpenPgpMessage);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,44 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright 2017 Florian Schmaus.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.jivesoftware.smackx.ox.element;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.jivesoftware.smack.packet.ExtensionElement;
|
||||||
|
import org.jxmpp.jid.Jid;
|
||||||
|
|
||||||
|
public class SignElement extends OpenPgpContentElement {
|
||||||
|
|
||||||
|
public SignElement(List<Jid> to, Date timestamp, List<ExtensionElement> payload) {
|
||||||
|
super(to, timestamp, payload);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final String ELEMENT = "sign";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getElementName() {
|
||||||
|
return ELEMENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CharSequence toXML() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,44 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright 2017 Florian Schmaus.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.jivesoftware.smackx.ox.element;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.jivesoftware.smack.packet.ExtensionElement;
|
||||||
|
import org.jxmpp.jid.Jid;
|
||||||
|
|
||||||
|
public class SigncryptElement extends EncryptedOpenPgpContentElement {
|
||||||
|
|
||||||
|
public static final String ELEMENT = "signcrypt";
|
||||||
|
|
||||||
|
public SigncryptElement(List<Jid> to, String rpad, Date timestamp, List<ExtensionElement> payload) {
|
||||||
|
super(to, rpad, timestamp, payload);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getElementName() {
|
||||||
|
return ELEMENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CharSequence toXML() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright 2017 Florian Schmaus.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* XML elements for XEP-0373: OpenPGP for XMPP.
|
||||||
|
*/
|
||||||
|
package org.jivesoftware.smackx.ox.element;
|
|
@ -0,0 +1,20 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright 2017 Florian Schmaus.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Smack API for XEP-0373: OpenPGP for XMPP.
|
||||||
|
*/
|
||||||
|
package org.jivesoftware.smackx.ox;
|
|
@ -0,0 +1,31 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright 2017 Florian Schmaus.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.jivesoftware.smackx.ox.provider;
|
||||||
|
|
||||||
|
import org.jivesoftware.smackx.ox.element.CryptElement;
|
||||||
|
import org.xmlpull.v1.XmlPullParser;
|
||||||
|
|
||||||
|
public class CryptElementProvider extends OpenPgpContentElementProvider<CryptElement> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CryptElement parse(XmlPullParser parser, int initialDepth) throws Exception {
|
||||||
|
OpenPgpContentElementData data = parseOpenPgpContentElementData(parser, initialDepth);
|
||||||
|
|
||||||
|
return new CryptElement(data.to, data.rpad, data.timestamp, data.payload);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,69 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright 2017 Florian Schmaus.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.jivesoftware.smackx.ox.provider;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.jivesoftware.smack.packet.ExtensionElement;
|
||||||
|
import org.jivesoftware.smack.provider.ExtensionElementProvider;
|
||||||
|
import org.jivesoftware.smack.util.PacketParserUtils;
|
||||||
|
import org.jivesoftware.smackx.ox.element.OpenPgpContentElement;
|
||||||
|
import org.jxmpp.jid.Jid;
|
||||||
|
import org.xmlpull.v1.XmlPullParser;
|
||||||
|
import org.xmlpull.v1.XmlPullParserException;
|
||||||
|
|
||||||
|
public abstract class OpenPgpContentElementProvider<O extends OpenPgpContentElement> extends ExtensionElementProvider<O> {
|
||||||
|
|
||||||
|
public static OpenPgpContentElement parseOpenPgpContentElement(String element)
|
||||||
|
throws XmlPullParserException, IOException {
|
||||||
|
XmlPullParser parser = PacketParserUtils.getParserFor(element);
|
||||||
|
return parseOpenPgpContentElement(parser);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static OpenPgpContentElement parseOpenPgpContentElement(XmlPullParser parser) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public abstract O parse(XmlPullParser parser, int initialDepth) throws Exception;
|
||||||
|
|
||||||
|
protected static OpenPgpContentElementData parseOpenPgpContentElementData(XmlPullParser parser, int initialDepth) {
|
||||||
|
List<Jid> to = new LinkedList<>();
|
||||||
|
Date timestamp = null;
|
||||||
|
String rpad = null;
|
||||||
|
List<ExtensionElement> payload = new LinkedList<>();
|
||||||
|
|
||||||
|
return new OpenPgpContentElementData(to, timestamp, rpad, payload);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected final static class OpenPgpContentElementData {
|
||||||
|
protected final List<Jid> to;
|
||||||
|
protected final Date timestamp;
|
||||||
|
protected final String rpad;
|
||||||
|
protected final List<ExtensionElement> payload;
|
||||||
|
|
||||||
|
private OpenPgpContentElementData(List<Jid> to, Date timestamp, String rpad, List<ExtensionElement> payload) {
|
||||||
|
this.to = to;
|
||||||
|
this.timestamp = timestamp;
|
||||||
|
this.rpad = rpad;
|
||||||
|
this.payload = payload;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright 2017 Florian Schmaus.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.jivesoftware.smackx.ox.provider;
|
||||||
|
|
||||||
|
import org.jivesoftware.smack.provider.ExtensionElementProvider;
|
||||||
|
import org.jivesoftware.smackx.ox.element.OpenPgpElement;
|
||||||
|
import org.xmlpull.v1.XmlPullParser;
|
||||||
|
|
||||||
|
public class OpenPgpElementProvider extends ExtensionElementProvider<OpenPgpElement> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public OpenPgpElement parse(XmlPullParser parser, int initialDepth) throws Exception {
|
||||||
|
String base64EncodedOpenPgpMessage = parser.nextText();
|
||||||
|
return new OpenPgpElement(base64EncodedOpenPgpMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright 2017 Florian Schmaus.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.jivesoftware.smackx.ox.provider;
|
||||||
|
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
import org.jivesoftware.smack.util.StringUtils;
|
||||||
|
import org.jivesoftware.smackx.ox.element.SignElement;
|
||||||
|
import org.xmlpull.v1.XmlPullParser;
|
||||||
|
|
||||||
|
public class SignElementProvider extends OpenPgpContentElementProvider<SignElement> {
|
||||||
|
|
||||||
|
private static final Logger LOGGER = Logger.getLogger(SigncryptElementProvider.class.getName());
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SignElement parse(XmlPullParser parser, int initialDepth) throws Exception {
|
||||||
|
OpenPgpContentElementData data = parseOpenPgpContentElementData(parser, initialDepth);
|
||||||
|
|
||||||
|
if (StringUtils.isNotEmpty(data.rpad)) {
|
||||||
|
LOGGER.warning("Ignoring rpad in XEP-0373 <sign/> element");
|
||||||
|
}
|
||||||
|
|
||||||
|
return new SignElement(data.to, data.timestamp, data.payload);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,30 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright 2017 Florian Schmaus.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.jivesoftware.smackx.ox.provider;
|
||||||
|
|
||||||
|
import org.jivesoftware.smackx.ox.element.SigncryptElement;
|
||||||
|
import org.xmlpull.v1.XmlPullParser;
|
||||||
|
|
||||||
|
public class SigncryptElementProvider extends OpenPgpContentElementProvider<SigncryptElement> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SigncryptElement parse(XmlPullParser parser, int initialDepth) throws Exception {
|
||||||
|
OpenPgpContentElementData data = parseOpenPgpContentElementData(parser, initialDepth);
|
||||||
|
return new SigncryptElement(data.to, data.rpad, data.timestamp, data.payload);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright 2017 Florian Schmaus.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Providers for XEP-0373: OpenPGP for XMPP.
|
||||||
|
*/
|
||||||
|
package org.jivesoftware.smackx.ox.provider;
|
Loading…
Reference in a new issue