diff options
| author | Kelly Rauchenberger <fefferburbia@gmail.com> | 2008-08-13 03:56:10 +0000 |
|---|---|---|
| committer | Kelly Rauchenberger <fefferburbia@gmail.com> | 2008-08-13 03:56:10 +0000 |
| commit | bb8b50baffc429aa711e8c1a756a01924007745f (patch) | |
| tree | 5574477a084bb52d66621a688f8ffd833e25b2e8 /client/trunk/src | |
| parent | 3e6d87739117bd9908549180408f8145f3868de4 (diff) | |
| download | instadisc-bb8b50baffc429aa711e8c1a756a01924007745f.tar.gz instadisc-bb8b50baffc429aa711e8c1a756a01924007745f.tar.bz2 instadisc-bb8b50baffc429aa711e8c1a756a01924007745f.zip | |
Client: Added password protection support
Closes #10
Diffstat (limited to 'client/trunk/src')
8 files changed, 521 insertions, 23 deletions
| diff --git a/client/trunk/src/com/fourisland/instadisc/AskForPasswordForm.form b/client/trunk/src/com/fourisland/instadisc/AskForPasswordForm.form new file mode 100644 index 0000000..e16a917 --- /dev/null +++ b/client/trunk/src/com/fourisland/instadisc/AskForPasswordForm.form | |||
| @@ -0,0 +1,123 @@ | |||
| 1 | <?xml version="1.0" encoding="UTF-8" ?> | ||
| 2 | |||
| 3 | <Form version="1.5" maxVersion="1.5" type="org.netbeans.modules.form.forminfo.JDialogFormInfo"> | ||
| 4 | <Properties> | ||
| 5 | <Property name="defaultCloseOperation" type="int" value="2"/> | ||
| 6 | <Property name="name" type="java.lang.String" value="Form" noResource="true"/> | ||
| 7 | </Properties> | ||
| 8 | <SyntheticProperties> | ||
| 9 | <SyntheticProperty name="formSizePolicy" type="int" value="1"/> | ||
| 10 | </SyntheticProperties> | ||
| 11 | <AuxValues> | ||
| 12 | <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="2"/> | ||
| 13 | <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="true"/> | ||
| 14 | <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/> | ||
| 15 | <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/> | ||
| 16 | <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/> | ||
| 17 | <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/> | ||
| 18 | <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/> | ||
| 19 | <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/> | ||
| 20 | </AuxValues> | ||
| 21 | |||
| 22 | <Layout> | ||
| 23 | <DimensionLayout dim="0"> | ||
| 24 | <Group type="103" groupAlignment="0" attributes="0"> | ||
| 25 | <Group type="102" attributes="0"> | ||
| 26 | <EmptySpace max="-2" attributes="0"/> | ||
| 27 | <Group type="103" groupAlignment="0" attributes="0"> | ||
| 28 | <Group type="103" alignment="0" groupAlignment="0" attributes="0"> | ||
| 29 | <Group type="102" alignment="0" attributes="0"> | ||
| 30 | <Component id="jLabel1" min="-2" max="-2" attributes="0"/> | ||
| 31 | <EmptySpace min="-2" pref="136" max="-2" attributes="0"/> | ||
| 32 | </Group> | ||
| 33 | <Group type="102" alignment="0" attributes="0"> | ||
| 34 | <EmptySpace min="12" pref="12" max="12" attributes="0"/> | ||
| 35 | <Group type="103" groupAlignment="0" attributes="0"> | ||
| 36 | <Component id="jLabel2" alignment="0" min="-2" pref="354" max="-2" attributes="0"/> | ||
| 37 | <Group type="102" alignment="0" attributes="0"> | ||
| 38 | <Component id="jLabel3" min="-2" max="-2" attributes="0"/> | ||
| 39 | <EmptySpace max="-2" attributes="0"/> | ||
| 40 | <Component id="jPasswordField1" pref="278" max="32767" attributes="0"/> | ||
| 41 | </Group> | ||
| 42 | </Group> | ||
| 43 | <EmptySpace max="-2" attributes="0"/> | ||
| 44 | </Group> | ||
| 45 | </Group> | ||
| 46 | <Group type="102" alignment="1" attributes="0"> | ||
| 47 | <Component id="jButton2" min="-2" max="-2" attributes="0"/> | ||
| 48 | <EmptySpace max="-2" attributes="0"/> | ||
| 49 | <Component id="jButton1" min="-2" max="-2" attributes="0"/> | ||
| 50 | <EmptySpace max="-2" attributes="0"/> | ||
| 51 | </Group> | ||
| 52 | </Group> | ||
| 53 | </Group> | ||
| 54 | </Group> | ||
| 55 | </DimensionLayout> | ||
| 56 | <DimensionLayout dim="1"> | ||
| 57 | <Group type="103" groupAlignment="0" attributes="0"> | ||
| 58 | <Group type="102" alignment="0" attributes="0"> | ||
| 59 | <EmptySpace min="-2" max="-2" attributes="0"/> | ||
| 60 | <Component id="jLabel1" min="-2" max="-2" attributes="0"/> | ||
| 61 | <EmptySpace max="-2" attributes="0"/> | ||
| 62 | <Component id="jLabel2" pref="68" max="32767" attributes="0"/> | ||
| 63 | <EmptySpace max="-2" attributes="0"/> | ||
| 64 | <Group type="103" groupAlignment="3" attributes="0"> | ||
| 65 | <Component id="jLabel3" alignment="3" min="-2" max="-2" attributes="0"/> | ||
| 66 | <Component id="jPasswordField1" alignment="3" min="-2" max="-2" attributes="0"/> | ||
| 67 | </Group> | ||
| 68 | <EmptySpace min="-2" max="-2" attributes="0"/> | ||
| 69 | <Group type="103" groupAlignment="3" attributes="0"> | ||
| 70 | <Component id="jButton1" alignment="3" min="-2" max="-2" attributes="0"/> | ||
| 71 | <Component id="jButton2" alignment="3" min="-2" max="-2" attributes="0"/> | ||
| 72 | </Group> | ||
| 73 | <EmptySpace min="-2" max="-2" attributes="0"/> | ||
| 74 | </Group> | ||
| 75 | </Group> | ||
| 76 | </DimensionLayout> | ||
| 77 | </Layout> | ||
| 78 | <SubComponents> | ||
| 79 | <Component class="javax.swing.JLabel" name="jLabel1"> | ||
| 80 | <Properties> | ||
| 81 | <Property name="font" type="java.awt.Font" resourceKey="jLabel1.font"/> | ||
| 82 | <Property name="text" type="java.lang.String" resourceKey="jLabel1.text"/> | ||
| 83 | <Property name="name" type="java.lang.String" value="jLabel1" noResource="true"/> | ||
| 84 | </Properties> | ||
| 85 | </Component> | ||
| 86 | <Component class="javax.swing.JLabel" name="jLabel2"> | ||
| 87 | <Properties> | ||
| 88 | <Property name="text" type="java.lang.String" resourceKey="jLabel2.text"/> | ||
| 89 | <Property name="name" type="java.lang.String" value="jLabel2" noResource="true"/> | ||
| 90 | </Properties> | ||
| 91 | </Component> | ||
| 92 | <Component class="javax.swing.JLabel" name="jLabel3"> | ||
| 93 | <Properties> | ||
| 94 | <Property name="text" type="java.lang.String" resourceKey="jLabel3.text"/> | ||
| 95 | <Property name="name" type="java.lang.String" value="jLabel3" noResource="true"/> | ||
| 96 | </Properties> | ||
| 97 | </Component> | ||
| 98 | <Component class="javax.swing.JPasswordField" name="jPasswordField1"> | ||
| 99 | <Properties> | ||
| 100 | <Property name="text" type="java.lang.String" resourceKey="jPasswordField1.text"/> | ||
| 101 | <Property name="name" type="java.lang.String" value="jPasswordField1" noResource="true"/> | ||
| 102 | </Properties> | ||
| 103 | </Component> | ||
| 104 | <Component class="javax.swing.JButton" name="jButton1"> | ||
| 105 | <Properties> | ||
| 106 | <Property name="text" type="java.lang.String" resourceKey="jButton1.text"/> | ||
| 107 | <Property name="name" type="java.lang.String" value="jButton1" noResource="true"/> | ||
| 108 | </Properties> | ||
| 109 | <Events> | ||
| 110 | <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButton1ActionPerformed"/> | ||
| 111 | </Events> | ||
| 112 | </Component> | ||
| 113 | <Component class="javax.swing.JButton" name="jButton2"> | ||
| 114 | <Properties> | ||
| 115 | <Property name="text" type="java.lang.String" resourceKey="jButton2.text"/> | ||
| 116 | <Property name="name" type="java.lang.String" value="jButton2" noResource="true"/> | ||
| 117 | </Properties> | ||
| 118 | <Events> | ||
| 119 | <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButton2ActionPerformed"/> | ||
| 120 | </Events> | ||
| 121 | </Component> | ||
| 122 | </SubComponents> | ||
| 123 | </Form> | ||
| diff --git a/client/trunk/src/com/fourisland/instadisc/AskForPasswordForm.java b/client/trunk/src/com/fourisland/instadisc/AskForPasswordForm.java new file mode 100644 index 0000000..5b80edc --- /dev/null +++ b/client/trunk/src/com/fourisland/instadisc/AskForPasswordForm.java | |||
| @@ -0,0 +1,166 @@ | |||
| 1 | /* | ||
| 2 | * AskForPasswordForm.java | ||
| 3 | * | ||
| 4 | * Created on August 12, 2008, 4:24 PM | ||
| 5 | */ | ||
| 6 | |||
| 7 | package com.fourisland.instadisc; | ||
| 8 | |||
| 9 | /** | ||
| 10 | * | ||
| 11 | * @author hatkirby | ||
| 12 | */ | ||
| 13 | public class AskForPasswordForm extends javax.swing.JDialog { | ||
| 14 | |||
| 15 | /** Creates new form AskForPasswordForm */ | ||
| 16 | public AskForPasswordForm(java.awt.Frame parent, boolean modal) { | ||
| 17 | super(parent, modal); | ||
| 18 | initComponents(); | ||
| 19 | } | ||
| 20 | |||
| 21 | /** This method is called from within the constructor to | ||
| 22 | * initialize the form. | ||
| 23 | * WARNING: Do NOT modify this code. The content of this method is | ||
| 24 | * always regenerated by the Form Editor. | ||
| 25 | */ | ||
| 26 | // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents | ||
| 27 | private void initComponents() { | ||
| 28 | |||
| 29 | jLabel1 = new javax.swing.JLabel(); | ||
| 30 | jLabel2 = new javax.swing.JLabel(); | ||
| 31 | jLabel3 = new javax.swing.JLabel(); | ||
| 32 | jPasswordField1 = new javax.swing.JPasswordField(); | ||
| 33 | jButton1 = new javax.swing.JButton(); | ||
| 34 | jButton2 = new javax.swing.JButton(); | ||
| 35 | |||
| 36 | setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); | ||
| 37 | setName("Form"); // NOI18N | ||
| 38 | |||
| 39 | org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(com.fourisland.instadisc.InstaDiscApp.class).getContext().getResourceMap(AskForPasswordForm.class); | ||
| 40 | jLabel1.setFont(resourceMap.getFont("jLabel1.font")); // NOI18N | ||
| 41 | jLabel1.setText(resourceMap.getString("jLabel1.text")); // NOI18N | ||
| 42 | jLabel1.setName("jLabel1"); // NOI18N | ||
| 43 | |||
| 44 | jLabel2.setText(resourceMap.getString("jLabel2.text")); // NOI18N | ||
| 45 | jLabel2.setName("jLabel2"); // NOI18N | ||
| 46 | |||
| 47 | jLabel3.setText(resourceMap.getString("jLabel3.text")); // NOI18N | ||
| 48 | jLabel3.setName("jLabel3"); // NOI18N | ||
| 49 | |||
| 50 | jPasswordField1.setText(resourceMap.getString("jPasswordField1.text")); // NOI18N | ||
| 51 | jPasswordField1.setName("jPasswordField1"); // NOI18N | ||
| 52 | |||
| 53 | jButton1.setText(resourceMap.getString("jButton1.text")); // NOI18N | ||
| 54 | jButton1.setName("jButton1"); // NOI18N | ||
| 55 | jButton1.addActionListener(new java.awt.event.ActionListener() { | ||
| 56 | public void actionPerformed(java.awt.event.ActionEvent evt) { | ||
| 57 | jButton1ActionPerformed(evt); | ||
| 58 | } | ||
| 59 | }); | ||
| 60 | |||
| 61 | jButton2.setText(resourceMap.getString("jButton2.text")); // NOI18N | ||
| 62 | jButton2.setName("jButton2"); // NOI18N | ||
| 63 | jButton2.addActionListener(new java.awt.event.ActionListener() { | ||
| 64 | public void actionPerformed(java.awt.event.ActionEvent evt) { | ||
| 65 | jButton2ActionPerformed(evt); | ||
| 66 | } | ||
| 67 | }); | ||
| 68 | |||
| 69 | javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); | ||
| 70 | getContentPane().setLayout(layout); | ||
| 71 | layout.setHorizontalGroup( | ||
| 72 | layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) | ||
| 73 | .addGroup(layout.createSequentialGroup() | ||
| 74 | .addContainerGap() | ||
| 75 | .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) | ||
| 76 | .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) | ||
| 77 | .addGroup(layout.createSequentialGroup() | ||
| 78 | .addComponent(jLabel1) | ||
| 79 | .addGap(136, 136, 136)) | ||
| 80 | .addGroup(layout.createSequentialGroup() | ||
| 81 | .addGap(12, 12, 12) | ||
| 82 | .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) | ||
| 83 | .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 354, javax.swing.GroupLayout.PREFERRED_SIZE) | ||
| 84 | .addGroup(layout.createSequentialGroup() | ||
| 85 | .addComponent(jLabel3) | ||
| 86 | .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) | ||
| 87 | .addComponent(jPasswordField1, javax.swing.GroupLayout.DEFAULT_SIZE, 278, Short.MAX_VALUE))) | ||
| 88 | .addContainerGap())) | ||
| 89 | .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() | ||
| 90 | .addComponent(jButton2) | ||
| 91 | .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) | ||
| 92 | .addComponent(jButton1) | ||
| 93 | .addContainerGap()))) | ||
| 94 | ); | ||
| 95 | layout.setVerticalGroup( | ||
| 96 | layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) | ||
| 97 | .addGroup(layout.createSequentialGroup() | ||
| 98 | .addContainerGap() | ||
| 99 | .addComponent(jLabel1) | ||
| 100 | .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) | ||
| 101 | .addComponent(jLabel2, javax.swing.GroupLayout.DEFAULT_SIZE, 68, Short.MAX_VALUE) | ||
| 102 | .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) | ||
| 103 | .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) | ||
| 104 | .addComponent(jLabel3) | ||
| 105 | .addComponent(jPasswordField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) | ||
| 106 | .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) | ||
| 107 | .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) | ||
| 108 | .addComponent(jButton1) | ||
| 109 | .addComponent(jButton2)) | ||
| 110 | .addContainerGap()) | ||
| 111 | ); | ||
| 112 | |||
| 113 | pack(); | ||
| 114 | }// </editor-fold>//GEN-END:initComponents | ||
| 115 | |||
| 116 | private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed | ||
| 117 | entered = true; | ||
| 118 | password = new String(jPasswordField1.getPassword()); | ||
| 119 | setVisible(false); | ||
| 120 | }//GEN-LAST:event_jButton2ActionPerformed | ||
| 121 | |||
| 122 | private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed | ||
| 123 | entered = false; | ||
| 124 | password = ""; | ||
| 125 | setVisible(false); | ||
| 126 | }//GEN-LAST:event_jButton1ActionPerformed | ||
| 127 | |||
| 128 | /** | ||
| 129 | * @param args the command line arguments | ||
| 130 | */ | ||
| 131 | public static void main(String args[]) { | ||
| 132 | java.awt.EventQueue.invokeLater(new Runnable() { | ||
| 133 | public void run() { | ||
| 134 | AskForPasswordForm dialog = new AskForPasswordForm(new javax.swing.JFrame(), true); | ||
| 135 | dialog.addWindowListener(new java.awt.event.WindowAdapter() { | ||
| 136 | public void windowClosing(java.awt.event.WindowEvent e) { | ||
| 137 | System.exit(0); | ||
| 138 | } | ||
| 139 | }); | ||
| 140 | dialog.setVisible(true); | ||
| 141 | } | ||
| 142 | }); | ||
| 143 | } | ||
| 144 | |||
| 145 | // Variables declaration - do not modify//GEN-BEGIN:variables | ||
| 146 | private javax.swing.JButton jButton1; | ||
| 147 | private javax.swing.JButton jButton2; | ||
| 148 | private javax.swing.JLabel jLabel1; | ||
| 149 | private javax.swing.JLabel jLabel2; | ||
| 150 | private javax.swing.JLabel jLabel3; | ||
| 151 | private javax.swing.JPasswordField jPasswordField1; | ||
| 152 | // End of variables declaration//GEN-END:variables | ||
| 153 | private boolean entered; | ||
| 154 | private String password; | ||
| 155 | |||
| 156 | public boolean getEntered() | ||
| 157 | { | ||
| 158 | return entered; | ||
| 159 | } | ||
| 160 | |||
| 161 | public String getPassword() | ||
| 162 | { | ||
| 163 | return password; | ||
| 164 | } | ||
| 165 | |||
| 166 | } | ||
| diff --git a/client/trunk/src/com/fourisland/instadisc/Database/Subscription.java b/client/trunk/src/com/fourisland/instadisc/Database/Subscription.java index 529d60a..a3ab6ed 100644 --- a/client/trunk/src/com/fourisland/instadisc/Database/Subscription.java +++ b/client/trunk/src/com/fourisland/instadisc/Database/Subscription.java | |||
| @@ -19,6 +19,7 @@ public class Subscription { | |||
| 19 | private String url; | 19 | private String url; |
| 20 | private String category; | 20 | private String category; |
| 21 | private String title; | 21 | private String title; |
| 22 | private String password; | ||
| 22 | 23 | ||
| 23 | public String getURL() | 24 | public String getURL() |
| 24 | { | 25 | { |
| @@ -35,6 +36,11 @@ public class Subscription { | |||
| 35 | return title; | 36 | return title; |
| 36 | } | 37 | } |
| 37 | 38 | ||
| 39 | public String getPassword() | ||
| 40 | { | ||
| 41 | return password; | ||
| 42 | } | ||
| 43 | |||
| 38 | public void setURL(String url) | 44 | public void setURL(String url) |
| 39 | { | 45 | { |
| 40 | this.url = url; | 46 | this.url = url; |
| @@ -49,4 +55,9 @@ public class Subscription { | |||
| 49 | { | 55 | { |
| 50 | this.title = title; | 56 | this.title = title; |
| 51 | } | 57 | } |
| 58 | |||
| 59 | public void setPassword(String password) | ||
| 60 | { | ||
| 61 | this.password = password; | ||
| 62 | } | ||
| 52 | } | 63 | } |
| diff --git a/client/trunk/src/com/fourisland/instadisc/Functions.java b/client/trunk/src/com/fourisland/instadisc/Functions.java new file mode 100644 index 0000000..78c6eec --- /dev/null +++ b/client/trunk/src/com/fourisland/instadisc/Functions.java | |||
| @@ -0,0 +1,81 @@ | |||
| 1 | package com.fourisland.instadisc; | ||
| 2 | |||
| 3 | public class Functions { | ||
| 4 | |||
| 5 | public static boolean xor(boolean x, boolean y) | ||
| 6 | { | ||
| 7 | return (x == y); | ||
| 8 | } | ||
| 9 | |||
| 10 | public static int max(int x, int y) | ||
| 11 | { | ||
| 12 | return (x > y ? x : y); | ||
| 13 | } | ||
| 14 | |||
| 15 | public static String padleft(String in, String pad, int len) | ||
| 16 | { | ||
| 17 | while (in.length() < len) | ||
| 18 | { | ||
| 19 | in = pad + in; | ||
| 20 | } | ||
| 21 | |||
| 22 | if (in.length() > len) | ||
| 23 | { | ||
| 24 | in = in.substring(0,len); | ||
| 25 | } | ||
| 26 | |||
| 27 | return in; | ||
| 28 | } | ||
| 29 | |||
| 30 | public static String reverse(String in) | ||
| 31 | { | ||
| 32 | String out = ""; | ||
| 33 | int i=0; | ||
| 34 | |||
| 35 | for (i=0;i<in.length();i++) | ||
| 36 | { | ||
| 37 | out = in.charAt(i) + out; | ||
| 38 | } | ||
| 39 | |||
| 40 | return out; | ||
| 41 | } | ||
| 42 | |||
| 43 | public static byte[] hexToBytes(String str) | ||
| 44 | { | ||
| 45 | if (str==null) | ||
| 46 | { | ||
| 47 | return null; | ||
| 48 | } else if (str.length() < 2) | ||
| 49 | { | ||
| 50 | return null; | ||
| 51 | } else if (str.length() < 2) | ||
| 52 | { | ||
| 53 | return null; | ||
| 54 | } else { | ||
| 55 | int len = str.length() / 2; | ||
| 56 | byte[] buffer = new byte[len]; | ||
| 57 | for (int i=0; i<len; i++) { | ||
| 58 | buffer[i] = (byte) Integer.parseInt(str.substring(i*2,i*2+2),16); | ||
| 59 | } | ||
| 60 | |||
| 61 | return buffer; | ||
| 62 | } | ||
| 63 | } | ||
| 64 | |||
| 65 | public static String padright(String in, String pad, int len) | ||
| 66 | { | ||
| 67 | while (in.length() < len) | ||
| 68 | { | ||
| 69 | in += pad; | ||
| 70 | } | ||
| 71 | |||
| 72 | if (in.length() > len) | ||
| 73 | { | ||
| 74 | in = in.substring(0,len); | ||
| 75 | } | ||
| 76 | |||
| 77 | return in; | ||
| 78 | } | ||
| 79 | |||
| 80 | } | ||
| 81 | \ No newline at end of file | ||
| diff --git a/client/trunk/src/com/fourisland/instadisc/Item/MD5.java b/client/trunk/src/com/fourisland/instadisc/Item/MD5.java index 7c2096c..31a7a5c 100644 --- a/client/trunk/src/com/fourisland/instadisc/Item/MD5.java +++ b/client/trunk/src/com/fourisland/instadisc/Item/MD5.java | |||
| @@ -4,6 +4,7 @@ | |||
| 4 | */ | 4 | */ |
| 5 | package com.fourisland.instadisc.Item; | 5 | package com.fourisland.instadisc.Item; |
| 6 | 6 | ||
| 7 | import com.fourisland.instadisc.Functions; | ||
| 7 | import java.security.MessageDigest; | 8 | import java.security.MessageDigest; |
| 8 | import java.util.logging.Level; | 9 | import java.util.logging.Level; |
| 9 | import java.util.logging.Logger; | 10 | import java.util.logging.Logger; |
| @@ -43,7 +44,7 @@ public class MD5 { | |||
| 43 | byte buffer[] = md5.digest(create); | 44 | byte buffer[] = md5.digest(create); |
| 44 | for (i = 0; i < buffer.length; i++) { | 45 | for (i = 0; i < buffer.length; i++) { |
| 45 | String hex = Integer.toHexString(buffer[i]); | 46 | String hex = Integer.toHexString(buffer[i]); |
| 46 | verify.append(pad(hex.substring(max(hex.length() - 2, 0)),"0",2)); | 47 | verify.append(Functions.padleft(hex.substring(Functions.max(hex.length() - 2, 0)),"0",2)); |
| 47 | } | 48 | } |
| 48 | } catch (Exception ex) { | 49 | } catch (Exception ex) { |
| 49 | Logger.getLogger(WellFormedItem.class.getName()).log(Level.SEVERE, null, ex); | 50 | Logger.getLogger(WellFormedItem.class.getName()).log(Level.SEVERE, null, ex); |
| @@ -51,18 +52,4 @@ public class MD5 { | |||
| 51 | ver = ""; | 52 | ver = ""; |
| 52 | return verify.toString(); | 53 | return verify.toString(); |
| 53 | } | 54 | } |
| 54 | |||
| 55 | private int max(int x, int y) | ||
| 56 | { | ||
| 57 | return (x > y ? x : y); | ||
| 58 | } | ||
| 59 | |||
| 60 | private String pad(String in, String pad, int len) | ||
| 61 | { | ||
| 62 | while (in.length() < len) | ||
| 63 | { | ||
| 64 | in = pad + in; | ||
| 65 | } | ||
| 66 | return in; | ||
| 67 | } | ||
| 68 | } | 55 | } |
| diff --git a/client/trunk/src/com/fourisland/instadisc/Item/SubscriptionFile.java b/client/trunk/src/com/fourisland/instadisc/Item/SubscriptionFile.java index d9ed348..0236c11 100644 --- a/client/trunk/src/com/fourisland/instadisc/Item/SubscriptionFile.java +++ b/client/trunk/src/com/fourisland/instadisc/Item/SubscriptionFile.java | |||
| @@ -4,9 +4,11 @@ | |||
| 4 | */ | 4 | */ |
| 5 | package com.fourisland.instadisc.Item; | 5 | package com.fourisland.instadisc.Item; |
| 6 | 6 | ||
| 7 | import com.fourisland.instadisc.AskForPasswordForm; | ||
| 7 | import com.fourisland.instadisc.Database.Filter; | 8 | import com.fourisland.instadisc.Database.Filter; |
| 8 | import com.fourisland.instadisc.Database.Subscription; | 9 | import com.fourisland.instadisc.Database.Subscription; |
| 9 | import com.fourisland.instadisc.Database.Wrapper; | 10 | import com.fourisland.instadisc.Database.Wrapper; |
| 11 | import com.fourisland.instadisc.Functions; | ||
| 10 | import com.fourisland.instadisc.XmlRpc; | 12 | import com.fourisland.instadisc.XmlRpc; |
| 11 | import java.io.FileNotFoundException; | 13 | import java.io.FileNotFoundException; |
| 12 | import java.io.IOException; | 14 | import java.io.IOException; |
| @@ -16,6 +18,7 @@ import java.net.URL; | |||
| 16 | import java.util.HashMap; | 18 | import java.util.HashMap; |
| 17 | import java.util.logging.Level; | 19 | import java.util.logging.Level; |
| 18 | import java.util.logging.Logger; | 20 | import java.util.logging.Logger; |
| 21 | import javax.swing.JFrame; | ||
| 19 | import javax.swing.JLabel; | 22 | import javax.swing.JLabel; |
| 20 | 23 | ||
| 21 | /** | 24 | /** |
| @@ -135,14 +138,43 @@ class SubscriptionFileThread implements Runnable { | |||
| 135 | s.setURL(headerMap.get("Subscription")); | 138 | s.setURL(headerMap.get("Subscription")); |
| 136 | s.setTitle(headerMap.get("Title")); | 139 | s.setTitle(headerMap.get("Title")); |
| 137 | s.setCategory(headerMap.get("Category")); | 140 | s.setCategory(headerMap.get("Category")); |
| 138 | Wrapper.addSubscription(s); | 141 | |
| 139 | 142 | if (Functions.xor(headerMap.containsKey("Verification"),headerMap.containsKey("Verification-ID"))) | |
| 140 | XmlRpc xmlrpc = new XmlRpc("addSubscription"); | 143 | { |
| 141 | xmlrpc.addParam(headerMap.get("Subscription")); | 144 | if (headerMap.containsKey("Verification")) |
| 142 | xmlrpc.addParam(headerMap.get("Category")); | 145 | { |
| 143 | xmlrpc.execute(); | 146 | AskForPasswordForm afpf = new AskForPasswordForm(new JFrame(),true); |
| 144 | 147 | afpf.setVisible(true); | |
| 145 | status.setText("You've sucessfully subscribed to that website"); | 148 | |
| 149 | if (afpf.getEntered() || afpf.getPassword().equals("")) | ||
| 150 | { | ||
| 151 | MD5 md5 = new MD5(afpf.getPassword()); | ||
| 152 | MD5 hash = new MD5(s.getTitle() + ":" + md5.hash() + ":" + headerMap.get("Verification-ID")); | ||
| 153 | |||
| 154 | if (hash.hash().equals(headerMap.get("Verification"))) | ||
| 155 | { | ||
| 156 | s.setPassword(afpf.getPassword()); | ||
| 157 | } else { | ||
| 158 | status.setText("Error: Incorrect password entered"); | ||
| 159 | return; | ||
| 160 | } | ||
| 161 | } else { | ||
| 162 | status.setText("Error: No password entered"); | ||
| 163 | return; | ||
| 164 | } | ||
| 165 | } else { | ||
| 166 | s.setPassword(""); | ||
| 167 | } | ||
| 168 | |||
| 169 | Wrapper.addSubscription(s); | ||
| 170 | |||
| 171 | XmlRpc xmlrpc = new XmlRpc("addSubscription"); | ||
| 172 | xmlrpc.addParam(headerMap.get("Subscription")); | ||
| 173 | xmlrpc.addParam(headerMap.get("Category")); | ||
| 174 | xmlrpc.execute(); | ||
| 175 | |||
| 176 | status.setText("You've sucessfully subscribed to that website"); | ||
| 177 | } | ||
| 146 | } else { | 178 | } else { |
| 147 | status.setText("Error: Subscription file is not well-formed"); | 179 | status.setText("Error: Subscription file is not well-formed"); |
| 148 | } | 180 | } |
| diff --git a/client/trunk/src/com/fourisland/instadisc/Item/WellFormedItem.java b/client/trunk/src/com/fourisland/instadisc/Item/WellFormedItem.java index f0f5838..f04e2ad 100644 --- a/client/trunk/src/com/fourisland/instadisc/Item/WellFormedItem.java +++ b/client/trunk/src/com/fourisland/instadisc/Item/WellFormedItem.java | |||
| @@ -7,15 +7,28 @@ package com.fourisland.instadisc.Item; | |||
| 7 | import com.fourisland.instadisc.Database.Filter; | 7 | import com.fourisland.instadisc.Database.Filter; |
| 8 | import com.fourisland.instadisc.Database.Subscription; | 8 | import com.fourisland.instadisc.Database.Subscription; |
| 9 | import com.fourisland.instadisc.Database.Wrapper; | 9 | import com.fourisland.instadisc.Database.Wrapper; |
| 10 | import com.fourisland.instadisc.Functions; | ||
| 10 | import com.fourisland.instadisc.Item.Categories.Category; | 11 | import com.fourisland.instadisc.Item.Categories.Category; |
| 11 | import com.fourisland.instadisc.XmlRpc; | 12 | import com.fourisland.instadisc.XmlRpc; |
| 12 | import java.net.MalformedURLException; | 13 | import java.net.MalformedURLException; |
| 13 | import java.net.URI; | 14 | import java.net.URI; |
| 14 | import java.net.URISyntaxException; | 15 | import java.net.URISyntaxException; |
| 15 | import java.net.URL; | 16 | import java.net.URL; |
| 17 | import java.security.InvalidAlgorithmParameterException; | ||
| 18 | import java.security.InvalidKeyException; | ||
| 19 | import java.security.NoSuchAlgorithmException; | ||
| 20 | import java.util.Collection; | ||
| 16 | import java.util.HashMap; | 21 | import java.util.HashMap; |
| 22 | import java.util.Iterator; | ||
| 23 | import java.util.Map.Entry; | ||
| 17 | import java.util.logging.Level; | 24 | import java.util.logging.Level; |
| 18 | import java.util.logging.Logger; | 25 | import java.util.logging.Logger; |
| 26 | import javax.crypto.BadPaddingException; | ||
| 27 | import javax.crypto.Cipher; | ||
| 28 | import javax.crypto.IllegalBlockSizeException; | ||
| 29 | import javax.crypto.NoSuchPaddingException; | ||
| 30 | import javax.crypto.spec.IvParameterSpec; | ||
| 31 | import javax.crypto.spec.SecretKeySpec; | ||
| 19 | 32 | ||
| 20 | /** | 33 | /** |
| 21 | * | 34 | * |
| @@ -33,6 +46,7 @@ public class WellFormedItem { | |||
| 33 | boolean good = true; | 46 | boolean good = true; |
| 34 | good = (good ? checkForRequiredHeaders() : false); | 47 | good = (good ? checkForRequiredHeaders() : false); |
| 35 | good = (good ? checkForSubscription() : false); | 48 | good = (good ? checkForSubscription() : false); |
| 49 | good = (good ? checkForEncryption() : false); | ||
| 36 | good = (good ? Category.checkForLegalCategory(aThis.headerMap) : false); | 50 | good = (good ? Category.checkForLegalCategory(aThis.headerMap) : false); |
| 37 | good = (good ? Category.checkForRequiredSemantics(aThis.headerMap) : false); | 51 | good = (good ? Category.checkForRequiredSemantics(aThis.headerMap) : false); |
| 38 | good = (good ? checkForProperVerification() : false); | 52 | good = (good ? checkForProperVerification() : false); |
| @@ -41,6 +55,74 @@ public class WellFormedItem { | |||
| 41 | return good; | 55 | return good; |
| 42 | } | 56 | } |
| 43 | 57 | ||
| 58 | private boolean checkForEncryption() { | ||
| 59 | if (!Wrapper.getSubscription(aThis.headerMap.get("Subscription")).getPassword().equals("")) | ||
| 60 | { | ||
| 61 | try | ||
| 62 | { | ||
| 63 | Subscription s = Wrapper.getSubscription(aThis.headerMap.get("Subscription")); | ||
| 64 | MD5 md5 = new MD5(Functions.padright(s.getPassword(), aThis.headerMap.get("Encryption-ID"), 16).substring(0, 16)); | ||
| 65 | String key = md5.hash().substring(0, 16); | ||
| 66 | String iv = Functions.reverse(key); | ||
| 67 | |||
| 68 | Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); | ||
| 69 | SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES"); | ||
| 70 | IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes()); | ||
| 71 | cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec); | ||
| 72 | |||
| 73 | aThis.headerMap.put("Title", new String(cipher.doFinal(Functions.hexToBytes(aThis.headerMap.get("Title")))).trim()); | ||
| 74 | aThis.headerMap.put("Author", new String(cipher.doFinal(Functions.hexToBytes(aThis.headerMap.get("Author")))).trim()); | ||
| 75 | aThis.headerMap.put("URL", new String(cipher.doFinal(Functions.hexToBytes(aThis.headerMap.get("URL")))).trim()); | ||
| 76 | |||
| 77 | HashMap<String, String> temp = new HashMap<String, String>(aThis.headerMap); | ||
| 78 | temp.remove("ID"); | ||
| 79 | temp.remove("Verification"); | ||
| 80 | temp.remove("Verification-ID"); | ||
| 81 | temp.remove("Subscription"); | ||
| 82 | temp.remove("Title"); | ||
| 83 | temp.remove("Author"); | ||
| 84 | temp.remove("URL"); | ||
| 85 | temp.remove("Encryption-ID"); | ||
| 86 | |||
| 87 | Collection<Entry<String,String>> vals = temp.entrySet(); | ||
| 88 | Iterator<Entry<String,String>> i = vals.iterator(); | ||
| 89 | while (i.hasNext()) | ||
| 90 | { | ||
| 91 | Entry<String,String> e = (Entry<String,String>) i.next(); | ||
| 92 | aThis.headerMap.put(e.getKey(), new String(cipher.doFinal(Functions.hexToBytes(e.getValue()))).trim()); | ||
| 93 | } | ||
| 94 | |||
| 95 | return true; | ||
| 96 | } catch (IllegalBlockSizeException ex) | ||
| 97 | { | ||
| 98 | Logger.getLogger(WellFormedItem.class.getName()).log(Level.SEVERE, null, ex); | ||
| 99 | return false; | ||
| 100 | } catch (BadPaddingException ex) | ||
| 101 | { | ||
| 102 | Logger.getLogger(WellFormedItem.class.getName()).log(Level.SEVERE, null, ex); | ||
| 103 | return false; | ||
| 104 | } catch (InvalidKeyException ex) | ||
| 105 | { | ||
| 106 | Logger.getLogger(WellFormedItem.class.getName()).log(Level.SEVERE, null, ex); | ||
| 107 | return false; | ||
| 108 | } catch (InvalidAlgorithmParameterException ex) | ||
| 109 | { | ||
| 110 | Logger.getLogger(WellFormedItem.class.getName()).log(Level.SEVERE, null, ex); | ||
| 111 | return false; | ||
| 112 | } catch (NoSuchAlgorithmException ex) | ||
| 113 | { | ||
| 114 | Logger.getLogger(WellFormedItem.class.getName()).log(Level.SEVERE, null, ex); | ||
| 115 | return false; | ||
| 116 | } catch (NoSuchPaddingException ex) | ||
| 117 | { | ||
| 118 | Logger.getLogger(WellFormedItem.class.getName()).log(Level.SEVERE, null, ex); | ||
| 119 | return false; | ||
| 120 | } | ||
| 121 | } else { | ||
| 122 | return true; | ||
| 123 | } | ||
| 124 | } | ||
| 125 | |||
| 44 | private boolean checkForEqualFilters() { | 126 | private boolean checkForEqualFilters() { |
| 45 | boolean good = true; | 127 | boolean good = true; |
| 46 | 128 | ||
| @@ -117,6 +199,7 @@ public class WellFormedItem { | |||
| 117 | 199 | ||
| 118 | private boolean checkForRequiredHeaders() { | 200 | private boolean checkForRequiredHeaders() { |
| 119 | boolean good = true; | 201 | boolean good = true; |
| 202 | |||
| 120 | good = (good ? checkForRequiredHeader("ID") : false); | 203 | good = (good ? checkForRequiredHeader("ID") : false); |
| 121 | good = (good ? checkForRequiredHeader("Verification") : false); | 204 | good = (good ? checkForRequiredHeader("Verification") : false); |
| 122 | good = (good ? checkForRequiredHeader("Verification-ID") : false); | 205 | good = (good ? checkForRequiredHeader("Verification-ID") : false); |
| @@ -124,6 +207,12 @@ public class WellFormedItem { | |||
| 124 | good = (good ? checkForRequiredHeader("Title") : false); | 207 | good = (good ? checkForRequiredHeader("Title") : false); |
| 125 | good = (good ? checkForRequiredHeader("Author") : false); | 208 | good = (good ? checkForRequiredHeader("Author") : false); |
| 126 | good = (good ? checkForRequiredHeader("URL") : false); | 209 | good = (good ? checkForRequiredHeader("URL") : false); |
| 210 | |||
| 211 | if (!Wrapper.getSubscription(aThis.headerMap.get("Subscription")).getPassword().equals("")) | ||
| 212 | { | ||
| 213 | good = (good ? checkForRequiredHeader("Encryption-ID") : false); | ||
| 214 | } | ||
| 215 | |||
| 127 | return good; | 216 | return good; |
| 128 | } | 217 | } |
| 129 | 218 | ||
| diff --git a/client/trunk/src/com/fourisland/instadisc/resources/AskForPasswordForm.properties b/client/trunk/src/com/fourisland/instadisc/resources/AskForPasswordForm.properties new file mode 100644 index 0000000..a1d9d3e --- /dev/null +++ b/client/trunk/src/com/fourisland/instadisc/resources/AskForPasswordForm.properties | |||
| @@ -0,0 +1,9 @@ | |||
| 1 | |||
| 2 | jLabel1.text=Ask For Password | ||
| 3 | #NOI18N | ||
| 4 | jLabel1.font=DejaVu Sans-Plain-18 | ||
| 5 | jLabel2.text=<HTML>If you can see this form, that must mean you are attempting to subscribe to a password-protected subscription. If you don't have the password to this subscription, well then, you cannot subscribe to it. | ||
| 6 | jLabel3.text=Password: | ||
| 7 | jPasswordField1.text= | ||
| 8 | jButton1.text=Cancel | ||
| 9 | jButton2.text=OK | ||
