diff --git a/README.md b/README.md index 887d6878..290e66c8 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,7 @@ Features - 256-bit AES encryption - Tag system with relations - Multi-users ACL system +- Hierarchical groups - Audit log - Comments - Storage quota per user diff --git a/docs-android/app/app.iml b/docs-android/app/app.iml index f0c4da0a..e93ef14d 100644 --- a/docs-android/app/app.iml +++ b/docs-android/app/app.iml @@ -77,10 +77,13 @@ - - - - + + + + + + + @@ -92,19 +95,21 @@ - + + - - - - + + + + + \ No newline at end of file diff --git a/docs-android/app/build.gradle b/docs-android/app/build.gradle index 418302c4..1b86dd75 100644 --- a/docs-android/app/build.gradle +++ b/docs-android/app/build.gradle @@ -3,7 +3,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.0.0-beta5' + classpath 'com.android.tools.build:gradle:2.1.0-alpha3' } } apply plugin: 'com.android.application' @@ -50,11 +50,11 @@ android { dependencies { compile fileTree(dir: 'libs', include: '*.jar') - compile 'com.android.support:appcompat-v7:23.1.1' - compile 'com.android.support:recyclerview-v7:23.1.1' + compile 'com.android.support:appcompat-v7:23.2.1' + compile 'com.android.support:recyclerview-v7:23.2.1' + compile 'com.android.support:design:23.2.1' compile 'it.sephiroth.android.library.imagezoom:imagezoom:1.0.5' compile 'org.greenrobot:eventbus:3.0.0' - compile 'com.shamanland:fab:0.0.6' compile 'com.squareup.picasso:picasso:2.5.2' compile 'com.squareup.okhttp3:okhttp:3.1.1' compile "com.squareup.okhttp3:okhttp-urlconnection:3.1.1" diff --git a/docs-android/app/src/main/AndroidManifest.xml b/docs-android/app/src/main/AndroidManifest.xml index ff234698..55966780 100644 --- a/docs-android/app/src/main/AndroidManifest.xml +++ b/docs-android/app/src/main/AndroidManifest.xml @@ -47,6 +47,16 @@ android:name=".activity.DocumentEditActivity" android:label="@string/new_document"> + + + + + + diff --git a/docs-android/app/src/main/java/com/sismics/docs/activity/AuditLogActivity.java b/docs-android/app/src/main/java/com/sismics/docs/activity/AuditLogActivity.java new file mode 100644 index 00000000..391e9c81 --- /dev/null +++ b/docs-android/app/src/main/java/com/sismics/docs/activity/AuditLogActivity.java @@ -0,0 +1,121 @@ +package com.sismics.docs.activity; + +import android.content.Intent; +import android.os.Bundle; +import android.support.v4.widget.SwipeRefreshLayout; +import android.support.v7.app.AppCompatActivity; +import android.view.MenuItem; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ListView; +import android.widget.ProgressBar; + +import com.sismics.docs.R; +import com.sismics.docs.adapter.AuditLogListAdapter; +import com.sismics.docs.listener.HttpCallback; +import com.sismics.docs.model.application.ApplicationContext; +import com.sismics.docs.resource.AuditLogResource; + +import org.json.JSONObject; + +/** + * Audit log activity. + * + * @author bgamard. + */ +public class AuditLogActivity extends AppCompatActivity { + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + // Check if logged in + if (!ApplicationContext.getInstance().isLoggedIn()) { + startActivity(new Intent(this, LoginActivity.class)); + finish(); + return; + } + + // Handle activity context + if (getIntent() == null) { + finish(); + return; + } + + // Input document ID (optional) + final String documentId = getIntent().getStringExtra("documentId"); + + // Setup the activity + setContentView(R.layout.auditlog_activity); + if (getSupportActionBar() != null) { + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + getSupportActionBar().setHomeButtonEnabled(true); + } + + // Configure the swipe refresh layout + SwipeRefreshLayout swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipeRefreshLayout); + swipeRefreshLayout.setColorSchemeResources(android.R.color.holo_blue_bright, + android.R.color.holo_green_light, + android.R.color.holo_orange_light, + android.R.color.holo_red_light); + swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { + @Override + public void onRefresh() { + refreshView(documentId); + } + }); + + // Navigate to user profile on click + final ListView auditLogListView = (ListView) findViewById(R.id.auditLogListView); + auditLogListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + if (auditLogListView.getAdapter() == null) { + return; + } + AuditLogListAdapter adapter = (AuditLogListAdapter) auditLogListView.getAdapter(); + String username = adapter.getItem(position).optString("username"); + Intent intent = new Intent(AuditLogActivity.this, UserProfileActivity.class); + intent.putExtra("username", username); + startActivity(intent); + } + }); + + // Get audit log list + refreshView(documentId); + } + + /** + * Refresh the view. + */ + private void refreshView(String documentId) { + final SwipeRefreshLayout swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipeRefreshLayout); + final ProgressBar progressBar = (ProgressBar) findViewById(R.id.progressBar); + final ListView auditLogListView = (ListView) findViewById(R.id.auditLogListView); + progressBar.setVisibility(View.VISIBLE); + auditLogListView.setVisibility(View.GONE); + AuditLogResource.list(this, documentId, new HttpCallback() { + @Override + public void onSuccess(JSONObject response) { + auditLogListView.setAdapter(new AuditLogListAdapter(response.optJSONArray("logs"))); + } + + @Override + public void onFinish() { + progressBar.setVisibility(View.GONE); + auditLogListView.setVisibility(View.VISIBLE); + swipeRefreshLayout.setRefreshing(false); + } + }); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + finish(); + return true; + } + + return super.onOptionsItemSelected(item); + } +} diff --git a/docs-android/app/src/main/java/com/sismics/docs/activity/DocumentViewActivity.java b/docs-android/app/src/main/java/com/sismics/docs/activity/DocumentViewActivity.java index c5e8d12a..ec38eae4 100644 --- a/docs-android/app/src/main/java/com/sismics/docs/activity/DocumentViewActivity.java +++ b/docs-android/app/src/main/java/com/sismics/docs/activity/DocumentViewActivity.java @@ -154,7 +154,7 @@ public class DocumentViewActivity extends AppCompatActivity { * * @param document Document in JSON format */ - private void refreshDocument(JSONObject document) { + private void refreshDocument(final JSONObject document) { this.document = document; String title = document.optString("title"); @@ -249,7 +249,7 @@ public class DocumentViewActivity extends AppCompatActivity { @Override public void onClick(View view) { DialogFragment dialog = DocExportPdfFragment.newInstance( - DocumentViewActivity.this.document.optString("id"), DocumentViewActivity.this.document.optString("title")); + document.optString("id"), document.optString("title")); dialog.show(getSupportFragmentManager(), "DocExportPdfFragment"); } }); @@ -259,11 +259,22 @@ public class DocumentViewActivity extends AppCompatActivity { button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - DialogFragment dialog = DocShareFragment.newInstance(DocumentViewActivity.this.document.optString("id")); + DialogFragment dialog = DocShareFragment.newInstance(document.optString("id")); dialog.show(getSupportFragmentManager(), "DocShareFragment"); } }); + // Action audit log + button = (Button) findViewById(R.id.actionAuditLog); + button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Intent intent = new Intent(DocumentViewActivity.this, AuditLogActivity.class); + intent.putExtra("documentId", document.optString("id")); + startActivity(intent); + } + }); + // Button add a comment ImageButton imageButton = (ImageButton) findViewById(R.id.addCommentBtn); imageButton.setOnClickListener(new View.OnClickListener() { @@ -300,7 +311,7 @@ public class DocumentViewActivity extends AppCompatActivity { // Grab the attached files updateFiles(); - // Grab the full document (used for ACLs and writable status) + // Grab the full document (used for ACLs, remaining metadata and writable status) updateDocument(); } @@ -630,6 +641,7 @@ public class DocumentViewActivity extends AppCompatActivity { menu.findItem(R.id.delete_file).setVisible(writable); } + // Action only available if the document is writable findViewById(R.id.actionEditDocument).setVisibility(writable ? View.VISIBLE : View.INVISIBLE); findViewById(R.id.actionUploadFile).setVisibility(writable ? View.VISIBLE : View.INVISIBLE); findViewById(R.id.actionSharing).setVisibility(writable ? View.VISIBLE : View.INVISIBLE); @@ -637,7 +649,36 @@ public class DocumentViewActivity extends AppCompatActivity { // ACLs ListView aclListView = (ListView) findViewById(R.id.aclListView); - aclListView.setAdapter(new AclListAdapter(document.optJSONArray("acls"))); + final AclListAdapter aclListAdapter = new AclListAdapter(document.optJSONArray("acls")); + aclListView.setAdapter(aclListAdapter); + aclListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + AclListAdapter.AclItem acl = aclListAdapter.getItem(position); + if (acl.getType().equals("USER")) { + Intent intent = new Intent(DocumentViewActivity.this, UserProfileActivity.class); + intent.putExtra("username", acl.getName()); + startActivity(intent); + } else if (acl.getType().equals("GROUP")) { + Intent intent = new Intent(DocumentViewActivity.this, GroupProfileActivity.class); + intent.putExtra("name", acl.getName()); + startActivity(intent); + } + } + }); + + // Remaining metadata + TextView creatorTextView = (TextView) findViewById(R.id.creatorTextView); + final String creator = document.optString("creator"); + creatorTextView.setText(creator); + creatorTextView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(DocumentViewActivity.this, UserProfileActivity.class); + intent.putExtra("username", creator); + startActivity(intent); + } + }); } }); } diff --git a/docs-android/app/src/main/java/com/sismics/docs/activity/GroupProfileActivity.java b/docs-android/app/src/main/java/com/sismics/docs/activity/GroupProfileActivity.java new file mode 100644 index 00000000..e25b00c5 --- /dev/null +++ b/docs-android/app/src/main/java/com/sismics/docs/activity/GroupProfileActivity.java @@ -0,0 +1,92 @@ +package com.sismics.docs.activity; + +import android.content.Intent; +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.view.MenuItem; +import android.view.View; +import android.widget.ProgressBar; +import android.widget.TextView; + +import com.sismics.docs.R; +import com.sismics.docs.listener.HttpCallback; +import com.sismics.docs.model.application.ApplicationContext; +import com.sismics.docs.resource.UserResource; + +import org.json.JSONArray; +import org.json.JSONObject; + +/** + * Group profile activity. + * + * @author bgamard. + */ +public class GroupProfileActivity extends AppCompatActivity { + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + // Check if logged in + if (!ApplicationContext.getInstance().isLoggedIn()) { + startActivity(new Intent(this, LoginActivity.class)); + finish(); + return; + } + + // Handle activity context + if (getIntent() == null) { + finish(); + return; + } + + // Input name + final String name = getIntent().getStringExtra("name"); + if (name == null) { + finish(); + return; + } + + // Setup the activity + setTitle(name); + setContentView(R.layout.groupprofile_activity); + if (getSupportActionBar() != null) { + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + getSupportActionBar().setHomeButtonEnabled(true); + } + + // Get the group and populate the view + final ProgressBar progressBar = (ProgressBar) findViewById(R.id.progressBar); + final View layoutView = findViewById(R.id.layout); + progressBar.setVisibility(View.VISIBLE); + layoutView.setVisibility(View.GONE); + UserResource.get(this, name, new HttpCallback() { + @Override + public void onSuccess(JSONObject json) { + TextView membersTextView = (TextView) findViewById(R.id.membersTextView); + JSONArray members = json.optJSONArray("members"); + String output = ""; + for (int i = 0; i < members.length(); i++) { + output += members.optString(i) + "; "; + } + membersTextView.setText(output); + } + + @Override + public void onFinish() { + progressBar.setVisibility(View.GONE); + layoutView.setVisibility(View.VISIBLE); + } + }); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + finish(); + return true; + } + + return super.onOptionsItemSelected(item); + } +} diff --git a/docs-android/app/src/main/java/com/sismics/docs/activity/LoginActivity.java b/docs-android/app/src/main/java/com/sismics/docs/activity/LoginActivity.java index 096588bd..26c030b0 100644 --- a/docs-android/app/src/main/java/com/sismics/docs/activity/LoginActivity.java +++ b/docs-android/app/src/main/java/com/sismics/docs/activity/LoginActivity.java @@ -30,7 +30,6 @@ import org.json.JSONObject; * @author bgamard */ public class LoginActivity extends AppCompatActivity { - /** * User interface. */ diff --git a/docs-android/app/src/main/java/com/sismics/docs/activity/MainActivity.java b/docs-android/app/src/main/java/com/sismics/docs/activity/MainActivity.java index 6732e7f3..0c9232cb 100644 --- a/docs-android/app/src/main/java/com/sismics/docs/activity/MainActivity.java +++ b/docs-android/app/src/main/java/com/sismics/docs/activity/MainActivity.java @@ -42,7 +42,6 @@ import org.json.JSONObject; */ public class MainActivity extends AppCompatActivity { - private ActionBarDrawerToggle drawerToggle; private MenuItem searchItem; private DrawerLayout drawerLayout; @@ -72,7 +71,7 @@ public class MainActivity extends AppCompatActivity { // between the sliding drawer and the action bar app icon drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, R.string.drawer_open, R.string.drawer_close); - drawerLayout.setDrawerListener(drawerToggle); + drawerLayout.addDrawerListener(drawerToggle); // Fill the drawer user info JSONObject userInfo = ApplicationContext.getInstance().getUserInfo(); @@ -137,6 +136,15 @@ public class MainActivity extends AppCompatActivity { } }); + // Click on Latest activity + View auditLogLayout = findViewById(R.id.auditLogLayout); + auditLogLayout.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startActivity(new Intent(MainActivity.this, AuditLogActivity.class)); + } + }); + handleIntent(getIntent()); EventBus.getDefault().register(this); diff --git a/docs-android/app/src/main/java/com/sismics/docs/activity/SettingsActivity.java b/docs-android/app/src/main/java/com/sismics/docs/activity/SettingsActivity.java index 176e8120..54b81de9 100644 --- a/docs-android/app/src/main/java/com/sismics/docs/activity/SettingsActivity.java +++ b/docs-android/app/src/main/java/com/sismics/docs/activity/SettingsActivity.java @@ -12,7 +12,6 @@ import com.sismics.docs.fragment.SettingsFragment; * @author bgamard. */ public class SettingsActivity extends AppCompatActivity { - @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); diff --git a/docs-android/app/src/main/java/com/sismics/docs/activity/UserProfileActivity.java b/docs-android/app/src/main/java/com/sismics/docs/activity/UserProfileActivity.java new file mode 100644 index 00000000..28229365 --- /dev/null +++ b/docs-android/app/src/main/java/com/sismics/docs/activity/UserProfileActivity.java @@ -0,0 +1,91 @@ +package com.sismics.docs.activity; + +import android.content.Intent; +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.view.MenuItem; +import android.view.View; +import android.widget.ProgressBar; +import android.widget.TextView; + +import com.sismics.docs.R; +import com.sismics.docs.listener.HttpCallback; +import com.sismics.docs.model.application.ApplicationContext; +import com.sismics.docs.resource.UserResource; + +import org.json.JSONObject; + +/** + * User profile activity. + * + * @author bgamard. + */ +public class UserProfileActivity extends AppCompatActivity { + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + // Check if logged in + if (!ApplicationContext.getInstance().isLoggedIn()) { + startActivity(new Intent(this, LoginActivity.class)); + finish(); + return; + } + + // Handle activity context + if (getIntent() == null) { + finish(); + return; + } + + // Input username + final String username = getIntent().getStringExtra("username"); + if (username == null) { + finish(); + return; + } + + // Setup the activity + setTitle(username); + setContentView(R.layout.userprofile_activity); + if (getSupportActionBar() != null) { + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + getSupportActionBar().setHomeButtonEnabled(true); + } + + // Get the user and populate the view + final ProgressBar progressBar = (ProgressBar) findViewById(R.id.progressBar); + final View layoutView = findViewById(R.id.layout); + progressBar.setVisibility(View.VISIBLE); + layoutView.setVisibility(View.GONE); + UserResource.get(this, username, new HttpCallback() { + @Override + public void onSuccess(JSONObject json) { + TextView emailTextView = (TextView) findViewById(R.id.emailTextView); + emailTextView.setText(json.optString("email")); + + TextView quotaTextView = (TextView) findViewById(R.id.quotaTextView); + quotaTextView.setText(getString(R.string.storage_display, + Math.round(json.optLong("storage_current") / 1000000), + Math.round(json.optLong("storage_quota") / 1000000))); + } + + @Override + public void onFinish() { + progressBar.setVisibility(View.GONE); + layoutView.setVisibility(View.VISIBLE); + } + }); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + finish(); + return true; + } + + return super.onOptionsItemSelected(item); + } +} diff --git a/docs-android/app/src/main/java/com/sismics/docs/adapter/AclListAdapter.java b/docs-android/app/src/main/java/com/sismics/docs/adapter/AclListAdapter.java index 3ae874c7..bae59bf0 100644 --- a/docs-android/app/src/main/java/com/sismics/docs/adapter/AclListAdapter.java +++ b/docs-android/app/src/main/java/com/sismics/docs/adapter/AclListAdapter.java @@ -98,11 +98,19 @@ public class AclListAdapter extends BaseAdapter { * An ACL item in the list. * Permissions are grouped together. */ - private static class AclItem { + public static class AclItem { private String type; private String name; private List permList = new ArrayList<>(); + public String getType() { + return type; + } + + public String getName() { + return name; + } + @Override public int hashCode() { return (type + name).hashCode(); diff --git a/docs-android/app/src/main/java/com/sismics/docs/adapter/AuditLogListAdapter.java b/docs-android/app/src/main/java/com/sismics/docs/adapter/AuditLogListAdapter.java new file mode 100644 index 00000000..b77061d6 --- /dev/null +++ b/docs-android/app/src/main/java/com/sismics/docs/adapter/AuditLogListAdapter.java @@ -0,0 +1,93 @@ +package com.sismics.docs.adapter; + +import android.content.Context; +import android.content.Intent; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.TextView; + +import com.sismics.docs.R; + +import org.json.JSONArray; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.List; + +/** + * Audit log list adapter. + * + * @author bgamard. + */ +public class AuditLogListAdapter extends BaseAdapter { + /** + * Shares. + */ + private List logList; + + /** + * Audit log list adapter. + * + * @param logs Logs + */ + public AuditLogListAdapter(JSONArray logs) { + this.logList = new ArrayList<>(); + + for (int i = 0; i < logs.length(); i++) { + logList.add(logs.optJSONObject(i)); + } + } + + @Override + public int getCount() { + return logList.size(); + } + + @Override + public JSONObject getItem(int position) { + return logList.get(position); + } + + @Override + public long getItemId(int position) { + return getItem(position).hashCode(); + } + + @Override + public View getView(int position, View view, final ViewGroup parent) { + if (view == null) { + LayoutInflater vi = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); + view = vi.inflate(R.layout.auditlog_list_item, parent, false); + } + + // Build message + final JSONObject log = getItem(position); + StringBuilder message = new StringBuilder(log.optString("class")); + switch (log.optString("type")) { + case "CREATE": message.append(" created"); break; + case "UPDATE": message.append(" updated"); break; + case "DELETE": message.append(" deleted"); break; + } + switch (log.optString("class")) { + case "Document": + case "Acl": + case "Tag": + case "User": + case "Group": + message.append(" : "); + message.append(log.optString("message")); + break; + } + + // Fill the view + TextView usernameTextView = (TextView) view.findViewById(R.id.usernameTextView); + TextView messageTextView = (TextView) view.findViewById(R.id.messageTextView); + usernameTextView.setText(log.optString("username")); + messageTextView.setText(message); + + return view; + } +} diff --git a/docs-android/app/src/main/java/com/sismics/docs/fragment/SearchFragment.java b/docs-android/app/src/main/java/com/sismics/docs/fragment/SearchFragment.java index d5eeedc5..a1e8cadb 100644 --- a/docs-android/app/src/main/java/com/sismics/docs/fragment/SearchFragment.java +++ b/docs-android/app/src/main/java/com/sismics/docs/fragment/SearchFragment.java @@ -55,6 +55,7 @@ public class SearchFragment extends DialogFragment { View view = inflater.inflate(R.layout.search_dialog, null); final EditText searchEditText = (EditText) view.findViewById(R.id.searchEditText); final EditText fulltextEditText = (EditText) view.findViewById(R.id.fulltextEditText); + final EditText creatorEditText = (EditText) view.findViewById(R.id.creatorEditText); final CheckBox sharedCheckbox = (CheckBox) view.findViewById(R.id.sharedCheckbox); final Spinner languageSpinner = (Spinner) view.findViewById(R.id.languageSpinner); final DatePickerView beforeDatePicker = (DatePickerView) view.findViewById(R.id.beforeDatePicker); @@ -89,6 +90,7 @@ public class SearchFragment extends DialogFragment { // Build the simple criterias SearchQueryBuilder queryBuilder = new SearchQueryBuilder() .simpleSearch(searchEditText.getText().toString()) + .creator(creatorEditText.getText().toString()) .shared(sharedCheckbox.isChecked()) .language(((LanguageAdapter.Language) languageSpinner.getSelectedItem()).getId()) .before(beforeDatePicker.getDate()) diff --git a/docs-android/app/src/main/java/com/sismics/docs/resource/AuditLogResource.java b/docs-android/app/src/main/java/com/sismics/docs/resource/AuditLogResource.java new file mode 100644 index 00000000..bd909200 --- /dev/null +++ b/docs-android/app/src/main/java/com/sismics/docs/resource/AuditLogResource.java @@ -0,0 +1,38 @@ +package com.sismics.docs.resource; + +import android.content.Context; + +import com.sismics.docs.listener.HttpCallback; +import com.sismics.docs.util.OkHttpUtil; + +import okhttp3.HttpUrl; +import okhttp3.Request; + +/** + * Access to /auditlog API. + * + * @author bgamard + */ +public class AuditLogResource extends BaseResource { + /** + * GET /auditlog. + * + * @param context Context + * @param documentId Document ID + * @param callback Callback + */ + public static void list(Context context, String documentId, HttpCallback callback) { + HttpUrl.Builder httpUrlBuilder = HttpUrl.parse(getApiUrl(context) + "/auditlog") + .newBuilder(); + if (documentId != null) { + httpUrlBuilder.addQueryParameter("document", documentId); + } + Request request = new Request.Builder() + .url(httpUrlBuilder.build()) + .get() + .build(); + OkHttpUtil.buildClient(context) + .newCall(request) + .enqueue(HttpCallback.buildOkHttpCallback(callback)); + } +} diff --git a/docs-android/app/src/main/java/com/sismics/docs/resource/UserResource.java b/docs-android/app/src/main/java/com/sismics/docs/resource/UserResource.java index 3d35564a..79b245a1 100644 --- a/docs-android/app/src/main/java/com/sismics/docs/resource/UserResource.java +++ b/docs-android/app/src/main/java/com/sismics/docs/resource/UserResource.java @@ -53,6 +53,23 @@ public class UserResource extends BaseResource { .newCall(request) .enqueue(HttpCallback.buildOkHttpCallback(callback)); } + + /** + * GET /user/username. + * + * @param context Context + * param username Username + * @param callback Callback + */ + public static void get(Context context, String username, HttpCallback callback) { + Request request = new Request.Builder() + .url(HttpUrl.parse(getApiUrl(context) + "/user/" + username)) + .get() + .build(); + OkHttpUtil.buildClient(context) + .newCall(request) + .enqueue(HttpCallback.buildOkHttpCallback(callback)); + } /** * POST /user/logout. diff --git a/docs-android/app/src/main/java/com/sismics/docs/util/SearchQueryBuilder.java b/docs-android/app/src/main/java/com/sismics/docs/util/SearchQueryBuilder.java index 54ab1f94..42522174 100644 --- a/docs-android/app/src/main/java/com/sismics/docs/util/SearchQueryBuilder.java +++ b/docs-android/app/src/main/java/com/sismics/docs/util/SearchQueryBuilder.java @@ -59,6 +59,21 @@ public class SearchQueryBuilder { return this; } + /** + * Add a creator criteria. + * + * @param creator Creator criteria + * @return The builder + */ + public SearchQueryBuilder creator(String creator) { + if (isValid(creator)) { + query.append(SEARCH_SEPARATOR) + .append("by:") + .append(creator); + } + return this; + } + /** * Add a language criteria. * diff --git a/docs-android/app/src/main/res/drawable-xhdpi/ic_assignment_grey600_24dp.png b/docs-android/app/src/main/res/drawable-xhdpi/ic_assignment_grey600_24dp.png new file mode 100644 index 00000000..1d59bcf2 Binary files /dev/null and b/docs-android/app/src/main/res/drawable-xhdpi/ic_assignment_grey600_24dp.png differ diff --git a/docs-android/app/src/main/res/drawable-xhdpi/ic_assignment_grey600_48dp.png b/docs-android/app/src/main/res/drawable-xhdpi/ic_assignment_grey600_48dp.png new file mode 100644 index 00000000..9a050c74 Binary files /dev/null and b/docs-android/app/src/main/res/drawable-xhdpi/ic_assignment_grey600_48dp.png differ diff --git a/docs-android/app/src/main/res/drawable-xhdpi/ic_comment_black_24dp.png b/docs-android/app/src/main/res/drawable-xhdpi/ic_comment_black_24dp.png deleted file mode 100644 index 412de9b0..00000000 Binary files a/docs-android/app/src/main/res/drawable-xhdpi/ic_comment_black_24dp.png and /dev/null differ diff --git a/docs-android/app/src/main/res/drawable-xhdpi/ic_comment_grey600_24dp.png b/docs-android/app/src/main/res/drawable-xhdpi/ic_comment_grey600_24dp.png new file mode 100644 index 00000000..a8ba0fdc Binary files /dev/null and b/docs-android/app/src/main/res/drawable-xhdpi/ic_comment_grey600_24dp.png differ diff --git a/docs-android/app/src/main/res/drawable-xxhdpi/ic_assignment_grey600_24dp.png b/docs-android/app/src/main/res/drawable-xxhdpi/ic_assignment_grey600_24dp.png new file mode 100644 index 00000000..96caad84 Binary files /dev/null and b/docs-android/app/src/main/res/drawable-xxhdpi/ic_assignment_grey600_24dp.png differ diff --git a/docs-android/app/src/main/res/drawable-xxhdpi/ic_assignment_grey600_48dp.png b/docs-android/app/src/main/res/drawable-xxhdpi/ic_assignment_grey600_48dp.png new file mode 100644 index 00000000..0bd4b924 Binary files /dev/null and b/docs-android/app/src/main/res/drawable-xxhdpi/ic_assignment_grey600_48dp.png differ diff --git a/docs-android/app/src/main/res/drawable-xxhdpi/ic_comment_black_24dp.png b/docs-android/app/src/main/res/drawable-xxhdpi/ic_comment_black_24dp.png deleted file mode 100644 index 382ee7a1..00000000 Binary files a/docs-android/app/src/main/res/drawable-xxhdpi/ic_comment_black_24dp.png and /dev/null differ diff --git a/docs-android/app/src/main/res/drawable-xxhdpi/ic_comment_grey600_24dp.png b/docs-android/app/src/main/res/drawable-xxhdpi/ic_comment_grey600_24dp.png new file mode 100644 index 00000000..5af80651 Binary files /dev/null and b/docs-android/app/src/main/res/drawable-xxhdpi/ic_comment_grey600_24dp.png differ diff --git a/docs-android/app/src/main/res/layout/auditlog_activity.xml b/docs-android/app/src/main/res/layout/auditlog_activity.xml new file mode 100644 index 00000000..77680ad6 --- /dev/null +++ b/docs-android/app/src/main/res/layout/auditlog_activity.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/docs-android/app/src/main/res/layout/auditlog_list_item.xml b/docs-android/app/src/main/res/layout/auditlog_list_item.xml new file mode 100644 index 00000000..242401cd --- /dev/null +++ b/docs-android/app/src/main/res/layout/auditlog_list_item.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/docs-android/app/src/main/res/layout/doc_list_fragment.xml b/docs-android/app/src/main/res/layout/doc_list_fragment.xml index 3d781fde..ff83398e 100644 --- a/docs-android/app/src/main/res/layout/doc_list_fragment.xml +++ b/docs-android/app/src/main/res/layout/doc_list_fragment.xml @@ -37,7 +37,7 @@ android:textSize="16sp" android:layout_centerInParent="true"/> - + app:fabSize="normal"/> \ No newline at end of file diff --git a/docs-android/app/src/main/res/layout/doc_list_item.xml b/docs-android/app/src/main/res/layout/doc_list_item.xml index 43b56de0..0aae61da 100644 --- a/docs-android/app/src/main/res/layout/doc_list_item.xml +++ b/docs-android/app/src/main/res/layout/doc_list_item.xml @@ -13,6 +13,7 @@ android:layout_alignParentStart="true" android:layout_alignParentLeft="true" android:layout_marginRight="12dp" + android:layout_marginEnd="12dp" android:id="@+id/folderImageView" android:layout_width="wrap_content" android:layout_height="wrap_content" @@ -22,7 +23,9 @@ android:id="@+id/titleTextView" android:layout_alignParentTop="true" android:layout_toRightOf="@+id/folderImageView" + android:layout_toEndOf="@+id/folderImageView" android:layout_toLeftOf="@+id/dateTextView" + android:layout_toStartOf="@+id/dateTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:fontFamily="sans-serif-light" diff --git a/docs-android/app/src/main/res/layout/document_view_activity.xml b/docs-android/app/src/main/res/layout/document_view_activity.xml index e13fd81b..13c3e0f3 100644 --- a/docs-android/app/src/main/res/layout/document_view_activity.xml +++ b/docs-android/app/src/main/res/layout/document_view_activity.xml @@ -52,14 +52,14 @@ @@ -173,7 +173,7 @@ android:drawableTop="@drawable/ic_create_grey600_24dp" style="?android:buttonBarButtonStyle" android:text="@string/edit_document" - android:textColor="@color/button_material_dark" + android:textColor="#ff5a595b" android:textAllCaps="false" android:layout_margin="8dp"/> @@ -184,7 +184,7 @@ android:drawableTop="@drawable/ic_file_upload_grey600_24dp" style="?android:buttonBarButtonStyle" android:text="@string/upload_file" - android:textColor="@color/button_material_dark" + android:textColor="#ff5a595b" android:textAllCaps="false" android:layout_margin="8dp"/> @@ -195,7 +195,7 @@ android:drawableTop="@drawable/ic_file_download_grey600_24dp" style="?android:buttonBarButtonStyle" android:text="@string/download_document" - android:textColor="@color/button_material_dark" + android:textColor="#ff5a595b" android:textAllCaps="false" android:layout_margin="8dp"/> @@ -214,9 +214,9 @@ android:drawableTop="@drawable/ic_description_grey600_24dp" style="?android:buttonBarButtonStyle" android:text="@string/export_pdf" - android:textColor="@color/button_material_dark" + android:textColor="#ff5a595b" android:textAllCaps="false" - android:layout_margin="8dp"/> + android:layout_margin="0dp"/> diff --git a/docs-web/src/main/webapp/src/partial/docs/group.profile.html b/docs-web/src/main/webapp/src/partial/docs/group.profile.html new file mode 100644 index 00000000..8aa8c586 --- /dev/null +++ b/docs-web/src/main/webapp/src/partial/docs/group.profile.html @@ -0,0 +1,22 @@ + + +

Members

+ + +
+

Related links

+ +
\ No newline at end of file diff --git a/docs-web/src/main/webapp/src/partial/docs/login.html b/docs-web/src/main/webapp/src/partial/docs/login.html index 887bd9a7..4aabda53 100644 --- a/docs-web/src/main/webapp/src/partial/docs/login.html +++ b/docs-web/src/main/webapp/src/partial/docs/login.html @@ -1,5 +1,11 @@ -
-
+ + - {{ alert.msg }}
\ No newline at end of file diff --git a/docs-web/src/main/webapp/src/partial/docs/settings.user.html b/docs-web/src/main/webapp/src/partial/docs/settings.user.html index 0d918214..c4fb3c1b 100644 --- a/docs-web/src/main/webapp/src/partial/docs/settings.user.html +++ b/docs-web/src/main/webapp/src/partial/docs/settings.user.html @@ -10,7 +10,8 @@ - + {{ user.username }} {{ user.create_date | date: 'yyyy-MM-dd' }} diff --git a/docs-web/src/main/webapp/src/partial/docs/user.profile.html b/docs-web/src/main/webapp/src/partial/docs/user.profile.html index 4b225d04..b67c0f6c 100644 --- a/docs-web/src/main/webapp/src/partial/docs/user.profile.html +++ b/docs-web/src/main/webapp/src/partial/docs/user.profile.html @@ -2,6 +2,13 @@

{{ user.username }} {{ user.email }}

+

Groups

+ +

Quota used

@@ -20,9 +27,9 @@ Documents created by {{ user.username }} -
  • - - Edit {{ user.username}} user +
  • + + Edit {{ user.username }} user
  • \ No newline at end of file diff --git a/docs-web/src/main/webapp/src/partial/docs/user.html b/docs-web/src/main/webapp/src/partial/docs/usergroup.html similarity index 53% rename from docs-web/src/main/webapp/src/partial/docs/user.html rename to docs-web/src/main/webapp/src/partial/docs/usergroup.html index 07a5261d..6e0000b1 100644 --- a/docs-web/src/main/webapp/src/partial/docs/user.html +++ b/docs-web/src/main/webapp/src/partial/docs/usergroup.html @@ -3,12 +3,30 @@

    - +

    - + + + +
    + {{ group.name }} +
    +
    + +
    +

    + + +

    + + + +
    @@ -22,6 +40,6 @@
    -
    +
    \ No newline at end of file diff --git a/docs-web/src/main/webapp/src/partial/share/share.html b/docs-web/src/main/webapp/src/partial/share/share.html index e857d6f5..c581ae07 100644 --- a/docs-web/src/main/webapp/src/partial/share/share.html +++ b/docs-web/src/main/webapp/src/partial/share/share.html @@ -51,6 +51,16 @@
    {{ document.coverage }}
    rights
    {{ document.rights }}
    +
    Contributors
    +
    + + + + {{ contributor.username }} + + + +
    diff --git a/docs-web/src/main/webapp/src/style/main.less b/docs-web/src/main/webapp/src/style/main.less index e07a3b06..588f939b 100644 --- a/docs-web/src/main/webapp/src/style/main.less +++ b/docs-web/src/main/webapp/src/style/main.less @@ -12,6 +12,15 @@ background-color: #263238; } +// Selected table line +.table tr { + &.active { + td { + background-color: #e8e8e8 !important; + } + } +} + // Documents list .table-documents { thead th { @@ -20,12 +29,6 @@ tbody tr { cursor: pointer; - - &.active { - td { - background-color: #e8e8e8; - } - } } .cell-tags { @@ -208,4 +211,34 @@ input[readonly].share-link { white-space: nowrap; } } +} + +// Vertical alignment +.vertical-center { + min-height: 100vh; + + /* Make it a flex container */ + display: -webkit-box; + display: -moz-box; + display: -ms-flexbox; + display: -webkit-flex; + display: flex; + + /* Align the bootstrap's container vertically */ + -webkit-box-align : center; + -webkit-align-items : center; + -moz-box-align : center; + -ms-flex-align : center; + align-items : center; +} + +// Login +.login-box-container { + background: url('../img/background.jpg') no-repeat center; +} + +.login-box { + background: rgba(255, 255, 255, 0.5); + padding: 20px; + border-radius: 4px } \ No newline at end of file diff --git a/docs-web/src/prod/resources/config.properties b/docs-web/src/prod/resources/config.properties index 6c2faf82..44ddb414 100644 --- a/docs-web/src/prod/resources/config.properties +++ b/docs-web/src/prod/resources/config.properties @@ -1,3 +1,3 @@ api.current_version=${project.version} api.min_version=1.0 -db.version=6 \ No newline at end of file +db.version=8 \ No newline at end of file diff --git a/docs-web/src/stress/resources/config.properties b/docs-web/src/stress/resources/config.properties index 6c2faf82..44ddb414 100644 --- a/docs-web/src/stress/resources/config.properties +++ b/docs-web/src/stress/resources/config.properties @@ -1,3 +1,3 @@ api.current_version=${project.version} api.min_version=1.0 -db.version=6 \ No newline at end of file +db.version=8 \ No newline at end of file diff --git a/docs-web/src/test/java/com/sismics/docs/rest/TestAclResource.java b/docs-web/src/test/java/com/sismics/docs/rest/TestAclResource.java index 3dba5baf..1da249fe 100644 --- a/docs-web/src/test/java/com/sismics/docs/rest/TestAclResource.java +++ b/docs-web/src/test/java/com/sismics/docs/rest/TestAclResource.java @@ -28,15 +28,18 @@ public class TestAclResource extends BaseJerseyTest { */ @Test public void testAclResource() { + // Create aclGroup2 + clientUtil.createGroup("aclGroup2"); + // Login acl1 clientUtil.createUser("acl1"); String acl1Token = clientUtil.login("acl1"); // Login acl2 - clientUtil.createUser("acl2"); + clientUtil.createUser("acl2", "aclGroup2"); String acl2Token = clientUtil.login("acl2"); - // Create a document + // Create a document with acl1 JsonObject json = target().path("/document").request() .cookie(TokenBasedSecurityFilter.COOKIE_NAME, acl1Token) .put(Entity.form(new Form() @@ -57,7 +60,7 @@ public class TestAclResource extends BaseJerseyTest { Response response = target().path("/document/" + document1Id).request() .cookie(TokenBasedSecurityFilter.COOKIE_NAME, acl2Token) .get(); - Assert.assertEquals(Status.FORBIDDEN, Status.fromStatusCode(response.getStatus())); + Assert.assertEquals(Status.NOT_FOUND, Status.fromStatusCode(response.getStatus())); // Add an ACL READ for acl2 with acl1 json = target().path("/acl").request() @@ -65,7 +68,8 @@ public class TestAclResource extends BaseJerseyTest { .put(Entity.form(new Form() .param("source", document1Id) .param("perm", "READ") - .param("username", "acl2")), JsonObject.class); + .param("target", "acl2") + .param("type", "USER")), JsonObject.class); String acl2Id = json.getString("id"); // Add an ACL WRITE for acl2 with acl1 @@ -74,7 +78,8 @@ public class TestAclResource extends BaseJerseyTest { .put(Entity.form(new Form() .param("source", document1Id) .param("perm", "WRITE") - .param("username", "acl2")), JsonObject.class); + .param("target", "acl2") + .param("type", "USER")), JsonObject.class); // Add an ACL WRITE for acl2 with acl1 (again) json = target().path("/acl").request() @@ -82,7 +87,37 @@ public class TestAclResource extends BaseJerseyTest { .put(Entity.form(new Form() .param("source", document1Id) .param("perm", "WRITE") - .param("username", "acl2")), JsonObject.class); + .param("target", "acl2") + .param("type", "USER")), JsonObject.class); + + // Add an ACL READ for aclGroup2 with acl1 + json = target().path("/acl").request() + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, acl1Token) + .put(Entity.form(new Form() + .param("source", document1Id) + .param("perm", "READ") + .param("target", "aclGroup2") + .param("type", "GROUP")), JsonObject.class); + String aclGroup2Id = json.getString("id"); + + // Add an ACL WRITE for aclGroup2 with acl1 + json = target().path("/acl").request() + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, acl1Token) + .put(Entity.form(new Form() + .param("source", document1Id) + .param("perm", "WRITE") + .param("target", "aclGroup2") + .param("type", "GROUP")), JsonObject.class); + + // List all documents with acl2 + json = target().path("/document/list") + .queryParam("sort_column", 3) + .queryParam("asc", true) + .request() + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, acl2Token) + .get(JsonObject.class); + JsonArray documents = json.getJsonArray("documents"); + Assert.assertEquals(1, documents.size()); // Get the document as acl1 json = target().path("/document/" + document1Id).request() @@ -90,7 +125,8 @@ public class TestAclResource extends BaseJerseyTest { .get(JsonObject.class); Assert.assertEquals(document1Id, json.getString("id")); acls = json.getJsonArray("acls"); - Assert.assertEquals(4, acls.size()); + Assert.assertEquals(6, acls.size()); + Assert.assertTrue(json.getBoolean("writable")); // Get the document as acl2 json = target().path("/document/" + document1Id).request() @@ -98,13 +134,15 @@ public class TestAclResource extends BaseJerseyTest { .get(JsonObject.class); Assert.assertEquals(document1Id, json.getString("id")); acls = json.getJsonArray("acls"); - Assert.assertEquals(4, acls.size()); + Assert.assertEquals(6, acls.size()); + Assert.assertTrue(json.getBoolean("writable")); // Update the document as acl2 json = target().path("/document/" + document1Id).request() .cookie(TokenBasedSecurityFilter.COOKIE_NAME, acl2Token) .post(Entity.form(new Form() - .param("title", "My new super document 1")), JsonObject.class); + .param("title", "My new super document 1") + .param("language", "eng")), JsonObject.class); Assert.assertEquals(document1Id, json.getString("id")); // Get the document as acl2 @@ -120,6 +158,29 @@ public class TestAclResource extends BaseJerseyTest { .cookie(TokenBasedSecurityFilter.COOKIE_NAME, acl2Token) .delete(JsonObject.class); + // Get the document as acl2 + json = target().path("/document/" + document1Id).request() + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, acl2Token) + .get(JsonObject.class); + Assert.assertEquals(document1Id, json.getString("id")); + acls = json.getJsonArray("acls"); + Assert.assertEquals(5, acls.size()); + Assert.assertTrue(json.getBoolean("writable")); // Writable by aclGroup2 + + // Delete the ACL WRITE for aclGroup2 with acl2 + target().path("/acl/" + document1Id + "/WRITE/" + aclGroup2Id).request() + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, acl2Token) + .delete(JsonObject.class); + + // Get the document as acl2 + json = target().path("/document/" + document1Id).request() + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, acl2Token) + .get(JsonObject.class); + Assert.assertEquals(document1Id, json.getString("id")); + acls = json.getJsonArray("acls"); + Assert.assertEquals(4, acls.size()); + Assert.assertFalse(json.getBoolean("writable")); + // Delete the ACL READ for acl2 with acl2 (not authorized) response = target().path("/acl/" + document1Id + "/READ/" + acl2Id).request() .cookie(TokenBasedSecurityFilter.COOKIE_NAME, acl2Token) @@ -131,6 +192,16 @@ public class TestAclResource extends BaseJerseyTest { .cookie(TokenBasedSecurityFilter.COOKIE_NAME, acl1Token) .delete(JsonObject.class); + // Get the document as acl2 (visible by group) + target().path("/document/" + document1Id).request() + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, acl2Token) + .get(JsonObject.class); + + // Delete the ACL READ for aclGroup2 with acl1 + target().path("/acl/" + document1Id + "/READ/" + aclGroup2Id).request() + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, acl1Token) + .delete(JsonObject.class); + // Get the document as acl1 json = target().path("/document/" + document1Id).request() .cookie(TokenBasedSecurityFilter.COOKIE_NAME, acl1Token) @@ -144,7 +215,7 @@ public class TestAclResource extends BaseJerseyTest { response = target().path("/document/" + document1Id).request() .cookie(TokenBasedSecurityFilter.COOKIE_NAME, acl2Token) .get(); - Assert.assertEquals(Status.FORBIDDEN, Status.fromStatusCode(response.getStatus())); + Assert.assertEquals(Status.NOT_FOUND, Status.fromStatusCode(response.getStatus())); // Delete the ACL READ for acl1 with acl1 response = target().path("/acl/" + document1Id + "/READ/" + acl1Id).request() @@ -158,7 +229,7 @@ public class TestAclResource extends BaseJerseyTest { .delete(); Assert.assertEquals(Status.BAD_REQUEST, Status.fromStatusCode(response.getStatus())); - // Search target list + // Search target list (acl) json = target().path("/acl/target/search") .queryParam("search", "acl") .request() @@ -166,5 +237,18 @@ public class TestAclResource extends BaseJerseyTest { .get(JsonObject.class); JsonArray users = json.getJsonArray("users"); Assert.assertEquals(2, users.size()); + JsonArray groups = json.getJsonArray("groups"); + Assert.assertEquals(1, groups.size()); + + // Search target list (admin) + json = target().path("/acl/target/search") + .queryParam("search", "admin") + .request() + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, acl1Token) + .get(JsonObject.class); + users = json.getJsonArray("users"); + Assert.assertEquals(1, users.size()); + groups = json.getJsonArray("groups"); + Assert.assertEquals(1, groups.size()); } } \ No newline at end of file diff --git a/docs-web/src/test/java/com/sismics/docs/rest/TestAppResource.java b/docs-web/src/test/java/com/sismics/docs/rest/TestAppResource.java index 9c1b426f..e6cf2e40 100644 --- a/docs-web/src/test/java/com/sismics/docs/rest/TestAppResource.java +++ b/docs-web/src/test/java/com/sismics/docs/rest/TestAppResource.java @@ -27,11 +27,11 @@ public class TestAppResource extends BaseJerseyTest { @Test public void testAppResource() { // Login admin - String adminAuthenticationToken = clientUtil.login("admin", "admin", false); + String adminToken = clientUtil.login("admin", "admin", false); // Check the application info JsonObject json = target().path("/app").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminAuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminToken) .get(JsonObject.class); String currentVersion = json.getString("current_version"); Assert.assertNotNull(currentVersion); @@ -44,19 +44,19 @@ public class TestAppResource extends BaseJerseyTest { // Rebuild Lucene index Response response = target().path("/app/batch/reindex").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminAuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminToken) .post(Entity.form(new Form())); Assert.assertEquals(Status.OK, Status.fromStatusCode(response.getStatus())); // Clean storage response = target().path("/app/batch/clean_storage").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminAuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminToken) .post(Entity.form(new Form())); Assert.assertEquals(Status.OK, Status.fromStatusCode(response.getStatus())); // Recompute quota response = target().path("/app/batch/recompute_quota").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminAuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminToken) .post(Entity.form(new Form())); Assert.assertEquals(Status.OK, Status.fromStatusCode(response.getStatus())); } @@ -69,13 +69,13 @@ public class TestAppResource extends BaseJerseyTest { @Test public void testLogResource() { // Login admin - String adminAuthenticationToken = clientUtil.login("admin", "admin", false); + String adminToken = clientUtil.login("admin", "admin", false); // Check the logs (page 1) JsonObject json = target().path("/app/log") .queryParam("level", "DEBUG") .request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminAuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminToken) .get(JsonObject.class); JsonArray logs = json.getJsonArray("logs"); Assert.assertTrue(logs.size() > 0); @@ -88,7 +88,7 @@ public class TestAppResource extends BaseJerseyTest { .queryParam("offset", "10") .queryParam("level", "DEBUG") .request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminAuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminToken) .get(JsonObject.class); logs = json.getJsonArray("logs"); Assert.assertTrue(logs.size() > 0); diff --git a/docs-web/src/test/java/com/sismics/docs/rest/TestCommentResource.java b/docs-web/src/test/java/com/sismics/docs/rest/TestCommentResource.java index b59551dd..f4677dd9 100644 --- a/docs-web/src/test/java/com/sismics/docs/rest/TestCommentResource.java +++ b/docs-web/src/test/java/com/sismics/docs/rest/TestCommentResource.java @@ -108,7 +108,8 @@ public class TestCommentResource extends BaseJerseyTest { .put(Entity.form(new Form() .param("source", document1Id) .param("perm", "READ") - .param("username", "comment2")), JsonObject.class); + .param("target", "comment2") + .param("type", "USER")), JsonObject.class); // Create a comment with comment2 json = target().path("/comment").request() diff --git a/docs-web/src/test/java/com/sismics/docs/rest/TestDocumentResource.java b/docs-web/src/test/java/com/sismics/docs/rest/TestDocumentResource.java index 2bc19d0a..b48dd754 100644 --- a/docs-web/src/test/java/com/sismics/docs/rest/TestDocumentResource.java +++ b/docs-web/src/test/java/com/sismics/docs/rest/TestDocumentResource.java @@ -76,6 +76,16 @@ public class TestDocumentResource extends BaseJerseyTest { String document1Id = json.getString("id"); Assert.assertNotNull(document1Id); + // Create a document with document1 + json = target().path("/document").request() + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, document1Token) + .put(Entity.form(new Form() + .param("title", "My super title document 2") + .param("language", "eng") + .param("relations", document1Id)), JsonObject.class); + String document2Id = json.getString("id"); + Assert.assertNotNull(document2Id); + // Add a file String file1Id = null; try (InputStream is = Resources.getResource("file/Einstein-Roosevelt-letter.png").openStream()) { @@ -100,13 +110,13 @@ public class TestDocumentResource extends BaseJerseyTest { // List all documents json = target().path("/document/list") .queryParam("sort_column", 3) - .queryParam("asc", false) + .queryParam("asc", true) .request() .cookie(TokenBasedSecurityFilter.COOKIE_NAME, document1Token) .get(JsonObject.class); JsonArray documents = json.getJsonArray("documents"); JsonArray tags = documents.getJsonObject(0).getJsonArray("tags"); - Assert.assertTrue(documents.size() == 1); + Assert.assertTrue(documents.size() == 2); Assert.assertEquals(document1Id, documents.getJsonObject(0).getString("id")); Assert.assertEquals("eng", documents.getJsonObject(0).getString("language")); Assert.assertEquals(1, documents.getJsonObject(0).getInt("file_count")); @@ -130,8 +140,8 @@ public class TestDocumentResource extends BaseJerseyTest { json = target().path("/document").request() .cookie(TokenBasedSecurityFilter.COOKIE_NAME, document3Token) .put(Entity.form(new Form() - .param("title", "My super title document 1") - .param("description", "My super description for document 1") + .param("title", "My super title document 3") + .param("description", "My super description for document 3") .param("language", "eng") .param("create_date", Long.toString(create3Date))), JsonObject.class); String document3Id = json.getString("id"); @@ -165,8 +175,8 @@ public class TestDocumentResource extends BaseJerseyTest { // Search documents Assert.assertEquals(1, searchDocuments("full:uranium full:einstein", document1Token)); - Assert.assertEquals(1, searchDocuments("full:title", document1Token)); - Assert.assertEquals(1, searchDocuments("title", document1Token)); + Assert.assertEquals(2, searchDocuments("full:title", document1Token)); + Assert.assertEquals(2, searchDocuments("title", document1Token)); Assert.assertEquals(1, searchDocuments("super description", document1Token)); Assert.assertEquals(1, searchDocuments("subject", document1Token)); Assert.assertEquals(1, searchDocuments("identifier", document1Token)); @@ -177,15 +187,15 @@ public class TestDocumentResource extends BaseJerseyTest { Assert.assertEquals(1, searchDocuments("greenland", document1Token)); Assert.assertEquals(1, searchDocuments("public domain", document1Token)); Assert.assertEquals(0, searchDocuments("by:document3", document1Token)); - Assert.assertEquals(1, searchDocuments("by:document1", document1Token)); + Assert.assertEquals(2, searchDocuments("by:document1", document1Token)); Assert.assertEquals(0, searchDocuments("by:nobody", document1Token)); - Assert.assertEquals(1, searchDocuments("at:" + DateTimeFormat.forPattern("yyyy").print(new Date().getTime()), document1Token)); - Assert.assertEquals(1, searchDocuments("at:" + DateTimeFormat.forPattern("yyyy-MM").print(new Date().getTime()), document1Token)); - Assert.assertEquals(1, searchDocuments("at:" + DateTimeFormat.forPattern("yyyy-MM-dd").print(new Date().getTime()), document1Token)); - Assert.assertEquals(1, searchDocuments("after:2010 before:2040-08", document1Token)); + Assert.assertEquals(2, searchDocuments("at:" + DateTimeFormat.forPattern("yyyy").print(new Date().getTime()), document1Token)); + Assert.assertEquals(2, searchDocuments("at:" + DateTimeFormat.forPattern("yyyy-MM").print(new Date().getTime()), document1Token)); + Assert.assertEquals(2, searchDocuments("at:" + DateTimeFormat.forPattern("yyyy-MM-dd").print(new Date().getTime()), document1Token)); + Assert.assertEquals(2, searchDocuments("after:2010 before:2040-08", document1Token)); Assert.assertEquals(1, searchDocuments("tag:super", document1Token)); Assert.assertEquals(1, searchDocuments("shared:yes", document1Token)); - Assert.assertEquals(1, searchDocuments("lang:eng", document1Token)); + Assert.assertEquals(2, searchDocuments("lang:eng", document1Token)); Assert.assertEquals(1, searchDocuments("after:2010 before:2040-08 tag:super shared:yes lang:eng title description full:uranium", document1Token)); // Search documents (nothing) @@ -199,7 +209,7 @@ public class TestDocumentResource extends BaseJerseyTest { Assert.assertEquals(0, searchDocuments("tag:Nop", document1Token)); Assert.assertEquals(0, searchDocuments("lang:fra", document1Token)); - // Get a document + // Get document 1 json = target().path("/document/" + document1Id).request() .cookie(TokenBasedSecurityFilter.COOKIE_NAME, document1Token) .get(JsonObject.class); @@ -225,6 +235,22 @@ public class TestDocumentResource extends BaseJerseyTest { JsonArray contributors = json.getJsonArray("contributors"); Assert.assertEquals(1, contributors.size()); Assert.assertEquals("document1", contributors.getJsonObject(0).getString("username")); + JsonArray relations = json.getJsonArray("relations"); + Assert.assertEquals(1, relations.size()); + Assert.assertEquals(document2Id, relations.getJsonObject(0).getString("id")); + Assert.assertFalse(relations.getJsonObject(0).getBoolean("source")); + Assert.assertEquals("My super title document 2", relations.getJsonObject(0).getString("title")); + + // Get document 2 + json = target().path("/document/" + document2Id).request() + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, document1Token) + .get(JsonObject.class); + Assert.assertEquals(document2Id, json.getString("id")); + relations = json.getJsonArray("relations"); + Assert.assertEquals(1, relations.size()); + Assert.assertEquals(document1Id, relations.getJsonObject(0).getString("id")); + Assert.assertTrue(relations.getJsonObject(0).getBoolean("source")); + Assert.assertEquals("My super title document 1", relations.getJsonObject(0).getString("title")); // Export a document in PDF format Response response = target().path("/document/" + document1Id).request() @@ -241,7 +267,7 @@ public class TestDocumentResource extends BaseJerseyTest { String tag2Id = json.getString("id"); Assert.assertNotNull(tag1Id); - // Update a document + // Update document 1 json = target().path("/document/" + document1Id).request() .cookie(TokenBasedSecurityFilter.COOKIE_NAME, document1Token) .post(Entity.form(new Form() @@ -254,18 +280,29 @@ public class TestDocumentResource extends BaseJerseyTest { .param("source", "My new source for document 1") .param("type", "Image") .param("coverage", "France") + .param("language", "eng") .param("rights", "All Rights Reserved") .param("tags", tag2Id)), JsonObject.class); Assert.assertEquals(document1Id, json.getString("id")); + // Update document 2 + json = target().path("/document/" + document2Id).request() + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, document1Token) + .post(Entity.form(new Form() + .param("title", "My super title document 2") + .param("language", "eng")), JsonObject.class); + Assert.assertEquals(document2Id, json.getString("id")); + // Search documents by query json = target().path("/document/list") - .queryParam("search", "super") + .queryParam("search", "new") .request() .cookie(TokenBasedSecurityFilter.COOKIE_NAME, document1Token) .get(JsonObject.class); + documents = json.getJsonArray("documents"); + Assert.assertEquals(1, documents.size()); - // Get a document + // Get document 1 json = target().path("/document/" + document1Id).request() .cookie(TokenBasedSecurityFilter.COOKIE_NAME, document1Token) .get(JsonObject.class); @@ -285,6 +322,15 @@ public class TestDocumentResource extends BaseJerseyTest { contributors = json.getJsonArray("contributors"); Assert.assertEquals(1, contributors.size()); Assert.assertEquals("document1", contributors.getJsonObject(0).getString("username")); + relations = json.getJsonArray("relations"); + Assert.assertEquals(0, relations.size()); + + // Get document 2 + json = target().path("/document/" + document1Id).request() + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, document1Token) + .get(JsonObject.class); + relations = json.getJsonArray("relations"); + Assert.assertEquals(0, relations.size()); // Deletes a document json = target().path("/document/" + document1Id).request() diff --git a/docs-web/src/test/java/com/sismics/docs/rest/TestFileResource.java b/docs-web/src/test/java/com/sismics/docs/rest/TestFileResource.java index f4e851b3..93cd5a5c 100644 --- a/docs-web/src/test/java/com/sismics/docs/rest/TestFileResource.java +++ b/docs-web/src/test/java/com/sismics/docs/rest/TestFileResource.java @@ -42,12 +42,12 @@ public class TestFileResource extends BaseJerseyTest { public void testFileResource() throws Exception { // Login file1 clientUtil.createUser("file1"); - String file1AuthenticationToken = clientUtil.login("file1"); + String file1Token = clientUtil.login("file1"); // Create a document long create1Date = new Date().getTime(); JsonObject json = target().path("/document").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file1AuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file1Token) .put(Entity.form(new Form() .param("title", "File test document 1") .param("language", "eng") @@ -63,7 +63,7 @@ public class TestFileResource extends BaseJerseyTest { json = target() .register(MultiPartFeature.class) .path("/file").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file1AuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file1Token) .put(Entity.entity(multiPart.field("id", document1Id).bodyPart(streamDataBodyPart), MediaType.MULTIPART_FORM_DATA_TYPE), JsonObject.class); file1Id = json.getString("id"); @@ -80,7 +80,7 @@ public class TestFileResource extends BaseJerseyTest { json = target() .register(MultiPartFeature.class) .path("/file").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file1AuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file1Token) .put(Entity.entity(multiPart.field("id", document1Id).bodyPart(streamDataBodyPart), MediaType.MULTIPART_FORM_DATA_TYPE), JsonObject.class); file2Id = json.getString("id"); @@ -90,7 +90,7 @@ public class TestFileResource extends BaseJerseyTest { // Get the file data Response response = target().path("/file/" + file1Id + "/data").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file1AuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file1Token) .get(); InputStream is = (InputStream) response.getEntity(); byte[] fileBytes = ByteStreams.toByteArray(is); @@ -101,7 +101,7 @@ public class TestFileResource extends BaseJerseyTest { response = target().path("/file/" + file1Id + "/data") .queryParam("size", "thumb") .request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file1AuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file1Token) .get(); Assert.assertEquals(Status.OK, Status.fromStatusCode(response.getStatus())); is = (InputStream) response.getEntity(); @@ -113,7 +113,7 @@ public class TestFileResource extends BaseJerseyTest { response = target().path("/file/" + file1Id + "/data") .queryParam("size", "web") .request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file1AuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file1Token) .get(); Assert.assertEquals(Status.OK, Status.fromStatusCode(response.getStatus())); is = (InputStream) response.getEntity(); @@ -131,7 +131,7 @@ public class TestFileResource extends BaseJerseyTest { json = target().path("/file/list") .queryParam("id", document1Id) .request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file1AuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file1Token) .get(JsonObject.class); JsonArray files = json.getJsonArray("files"); Assert.assertEquals(2, files.size()); @@ -141,7 +141,7 @@ public class TestFileResource extends BaseJerseyTest { // Reorder files json = target().path("/file/reorder").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file1AuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file1Token) .post(Entity.form(new Form() .param("id", document1Id) .param("order", file2Id) @@ -151,7 +151,7 @@ public class TestFileResource extends BaseJerseyTest { json = target().path("/file/list") .queryParam("id", document1Id) .request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file1AuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file1Token) .get(JsonObject.class); files = json.getJsonArray("files"); Assert.assertEquals(2, files.size()); @@ -162,7 +162,7 @@ public class TestFileResource extends BaseJerseyTest { response = target().path("/file/zip") .queryParam("id", document1Id) .request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file1AuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file1Token) .get(); is = (InputStream) response.getEntity(); fileBytes = ByteStreams.toByteArray(is); @@ -170,13 +170,13 @@ public class TestFileResource extends BaseJerseyTest { // Deletes a file json = target().path("/file/" + file1Id).request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file1AuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file1Token) .delete(JsonObject.class); Assert.assertEquals("ok", json.getString("status")); // Get the file data (not found) response = target().path("/file/" + file1Id + "/data").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file1AuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file1Token) .get(); Assert.assertEquals(Status.NOT_FOUND, Status.fromStatusCode(response.getStatus())); @@ -192,7 +192,7 @@ public class TestFileResource extends BaseJerseyTest { json = target().path("/file/list") .queryParam("id", document1Id) .request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file1AuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file1Token) .get(JsonObject.class); files = json.getJsonArray("files"); Assert.assertEquals(1, files.size()); @@ -202,7 +202,7 @@ public class TestFileResource extends BaseJerseyTest { public void testOrphanFile() throws Exception { // Login file2 clientUtil.createUser("file2"); - String file2AuthenticationToken = clientUtil.login("file2"); + String file2Token = clientUtil.login("file2"); // Add a file String file1Id = null; @@ -212,7 +212,7 @@ public class TestFileResource extends BaseJerseyTest { JsonObject json = target() .register(MultiPartFeature.class) .path("/file").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file2AuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file2Token) .put(Entity.entity(multiPart.bodyPart(streamDataBodyPart), MediaType.MULTIPART_FORM_DATA_TYPE), JsonObject.class); file1Id = json.getString("id"); @@ -222,14 +222,14 @@ public class TestFileResource extends BaseJerseyTest { // Get all orphan files JsonObject json = target().path("/file/list").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file2AuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file2Token) .get(JsonObject.class); JsonArray files = json.getJsonArray("files"); Assert.assertEquals(1, files.size()); // Get the file data Response response = target().path("/file/" + file1Id + "/data").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file2AuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file2Token) .get(); InputStream is = (InputStream) response.getEntity(); byte[] fileBytes = ByteStreams.toByteArray(is); @@ -238,7 +238,7 @@ public class TestFileResource extends BaseJerseyTest { // Create a document json = target().path("/document").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file2AuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file2Token) .put(Entity.form(new Form() .param("title", "File test document 1") .param("language", "eng")), JsonObject.class); @@ -247,7 +247,7 @@ public class TestFileResource extends BaseJerseyTest { // Attach a file to a document json = target().path("/file/" + file1Id).request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file2AuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file2Token) .post(Entity.form(new Form() .param("id", document1Id)), JsonObject.class); @@ -255,7 +255,7 @@ public class TestFileResource extends BaseJerseyTest { json = target().path("/file/list") .queryParam("id", document1Id) .request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file2AuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file2Token) .get(JsonObject.class); files = json.getJsonArray("files"); Assert.assertEquals(1, files.size()); @@ -268,7 +268,7 @@ public class TestFileResource extends BaseJerseyTest { json = target() .register(MultiPartFeature.class) .path("/file").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file2AuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file2Token) .put(Entity.entity(multiPart.bodyPart(streamDataBodyPart), MediaType.MULTIPART_FORM_DATA_TYPE), JsonObject.class); file2Id = json.getString("id"); @@ -278,7 +278,7 @@ public class TestFileResource extends BaseJerseyTest { // Deletes a file json = target().path("/file/" + file2Id).request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file2AuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file2Token) .delete(JsonObject.class); Assert.assertEquals("ok", json.getString("status")); } @@ -287,7 +287,7 @@ public class TestFileResource extends BaseJerseyTest { public void testQuota() throws Exception { // Login file_quota clientUtil.createUser("file_quota"); - String fileQuotaAuthenticationToken = clientUtil.login("file_quota"); + String fileQuotaToken = clientUtil.login("file_quota"); // Add a file (292641 bytes large) String file1Id = null; @@ -297,7 +297,7 @@ public class TestFileResource extends BaseJerseyTest { JsonObject json = target() .register(MultiPartFeature.class) .path("/file").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, fileQuotaAuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, fileQuotaToken) .put(Entity.entity(multiPart.bodyPart(streamDataBodyPart), MediaType.MULTIPART_FORM_DATA_TYPE), JsonObject.class); file1Id = json.getString("id"); @@ -307,7 +307,7 @@ public class TestFileResource extends BaseJerseyTest { // Check current quota JsonObject json = target().path("/user").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, fileQuotaAuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, fileQuotaToken) .get(JsonObject.class); Assert.assertEquals(292641l, json.getJsonNumber("storage_current").longValue()); @@ -318,7 +318,7 @@ public class TestFileResource extends BaseJerseyTest { target() .register(MultiPartFeature.class) .path("/file").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, fileQuotaAuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, fileQuotaToken) .put(Entity.entity(multiPart.bodyPart(streamDataBodyPart), MediaType.MULTIPART_FORM_DATA_TYPE), JsonObject.class); } @@ -326,7 +326,7 @@ public class TestFileResource extends BaseJerseyTest { // Check current quota json = target().path("/user").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, fileQuotaAuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, fileQuotaToken) .get(JsonObject.class); Assert.assertEquals(585282l, json.getJsonNumber("storage_current").longValue()); @@ -337,7 +337,7 @@ public class TestFileResource extends BaseJerseyTest { target() .register(MultiPartFeature.class) .path("/file").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, fileQuotaAuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, fileQuotaToken) .put(Entity.entity(multiPart.bodyPart(streamDataBodyPart), MediaType.MULTIPART_FORM_DATA_TYPE), JsonObject.class); } @@ -345,7 +345,7 @@ public class TestFileResource extends BaseJerseyTest { // Check current quota json = target().path("/user").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, fileQuotaAuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, fileQuotaToken) .get(JsonObject.class); Assert.assertEquals(877923l, json.getJsonNumber("storage_current").longValue()); @@ -356,7 +356,7 @@ public class TestFileResource extends BaseJerseyTest { Response response = target() .register(MultiPartFeature.class) .path("/file").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, fileQuotaAuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, fileQuotaToken) .put(Entity.entity(multiPart.bodyPart(streamDataBodyPart), MediaType.MULTIPART_FORM_DATA_TYPE)); Assert.assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus()); @@ -365,13 +365,13 @@ public class TestFileResource extends BaseJerseyTest { // Deletes a file json = target().path("/file/" + file1Id).request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, fileQuotaAuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, fileQuotaToken) .delete(JsonObject.class); Assert.assertEquals("ok", json.getString("status")); // Check current quota json = target().path("/user").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, fileQuotaAuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, fileQuotaToken) .get(JsonObject.class); Assert.assertEquals(585282l, json.getJsonNumber("storage_current").longValue()); } diff --git a/docs-web/src/test/java/com/sismics/docs/rest/TestGroupResource.java b/docs-web/src/test/java/com/sismics/docs/rest/TestGroupResource.java new file mode 100644 index 00000000..834c1261 --- /dev/null +++ b/docs-web/src/test/java/com/sismics/docs/rest/TestGroupResource.java @@ -0,0 +1,186 @@ +package com.sismics.docs.rest; + +import java.util.ArrayList; +import java.util.List; + +import javax.json.JsonArray; +import javax.json.JsonObject; +import javax.ws.rs.client.Entity; +import javax.ws.rs.core.Form; + +import org.junit.Assert; +import org.junit.Test; + +import com.sismics.util.filter.TokenBasedSecurityFilter; + + +/** + * Test the group resource. + * + * @author bgamard + */ +public class TestGroupResource extends BaseJerseyTest { + /** + * Test the group resource. + * + * @throws JSONException + */ + @Test + public void testGroupResource() { + // Login admin + String adminToken = clientUtil.login("admin", "admin", false); + + // Create group hierarchy + clientUtil.createGroup("g1"); + clientUtil.createGroup("g11", "g1"); + clientUtil.createGroup("g12", "g1"); + clientUtil.createGroup("g111", "g11"); + clientUtil.createGroup("g112", "g11"); + + // Login group1 + clientUtil.createUser("group1", "g112", "g12"); + String group1Token = clientUtil.login("group1"); + + // Login admin2 + clientUtil.createUser("admin2", "administrators"); + String admin2Token = clientUtil.login("admin2"); + + // Create trashme + clientUtil.createUser("trashme"); + + // Delete trashme with admin2 + target().path("/user/trashme").request() + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, admin2Token) + .delete(JsonObject.class); + + // Get all groups + JsonObject json = target().path("/group") + .queryParam("sort_column", "1") + .queryParam("asc", "true") + .request() + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminToken) + .get(JsonObject.class); + JsonArray groups = json.getJsonArray("groups"); + Assert.assertEquals(6, groups.size()); + JsonObject groupG11 = groups.getJsonObject(2); + Assert.assertEquals("g11", groupG11.getString("name")); + Assert.assertEquals("g1", groupG11.getString("parent")); + + // Check admin groups (all computed groups) + json = target().path("/user").request() + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminToken) + .get(JsonObject.class); + groups = json.getJsonArray("groups"); + Assert.assertEquals(1, groups.size()); + Assert.assertEquals("administrators", groups.getString(0)); + + // Check group1 groups (all computed groups) + json = target().path("/user").request() + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, group1Token) + .get(JsonObject.class); + groups = json.getJsonArray("groups"); + List groupList = new ArrayList<>(); + for (int i = 0; i < groups.size(); i++) { + groupList.add(groups.getString(i)); + } + Assert.assertEquals(4, groups.size()); + Assert.assertTrue(groupList.contains("g1")); + Assert.assertTrue(groupList.contains("g12")); + Assert.assertTrue(groupList.contains("g11")); + Assert.assertTrue(groupList.contains("g112")); + + // Check group1 groups with admin (only direct groups) + json = target().path("/user/group1").request() + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminToken) + .get(JsonObject.class); + groups = json.getJsonArray("groups"); + Assert.assertEquals(2, groups.size()); + Assert.assertEquals("g112", groups.getString(0)); + Assert.assertEquals("g12", groups.getString(1)); + + // List all users in group1 + json = target().path("/user/list") + .queryParam("group", "g112") + .request() + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminToken) + .get(JsonObject.class); + JsonArray users = json.getJsonArray("users"); + Assert.assertEquals(1, users.size()); + + // Add group1 to g112 (again) + json = target().path("/group/g112").request() + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminToken) + .put(Entity.form(new Form() + .param("username", "group1")), JsonObject.class); + + // Check group1 groups (all computed groups) + json = target().path("/user").request() + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, group1Token) + .get(JsonObject.class); + groups = json.getJsonArray("groups"); + Assert.assertEquals(4, groups.size()); + + // Update group g12 + target().path("/group/g12").request() + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminToken) + .post(Entity.form(new Form() + .param("name", "g12new") + .param("parent", "g11")), JsonObject.class); + + // Check group1 groups with admin (only direct groups) + json = target().path("/user/group1").request() + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminToken) + .get(JsonObject.class); + groups = json.getJsonArray("groups"); + Assert.assertEquals(2, groups.size()); + Assert.assertEquals("g112", groups.getString(0)); + Assert.assertEquals("g12new", groups.getString(1)); + + // Get group g12new + json = target().path("/group/g12new").request() + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminToken) + .get(JsonObject.class); + Assert.assertEquals("g12new", json.getString("name")); + Assert.assertEquals("g11", json.getString("parent")); + JsonArray members = json.getJsonArray("members"); + Assert.assertEquals(1, members.size()); + Assert.assertEquals("group1", members.getString(0)); + + // Remove group1 from g12new + json = target().path("/group/g12new/group1").request() + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminToken) + .delete(JsonObject.class); + + // Check group1 groups (all computed groups) + json = target().path("/user").request() + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, group1Token) + .get(JsonObject.class); + groups = json.getJsonArray("groups"); + groupList = new ArrayList<>(); + for (int i = 0; i < groups.size(); i++) { + groupList.add(groups.getString(i)); + } + Assert.assertEquals(3, groups.size()); + Assert.assertTrue(groupList.contains("g1")); + Assert.assertTrue(groupList.contains("g11")); + Assert.assertTrue(groupList.contains("g112")); + + // Delete group g1 + json = target().path("/group/g1").request() + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminToken) + .delete(JsonObject.class); + + // Check group1 groups (all computed groups) + json = target().path("/user").request() + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, group1Token) + .get(JsonObject.class); + groups = json.getJsonArray("groups"); + groupList = new ArrayList<>(); + for (int i = 0; i < groups.size(); i++) { + groupList.add(groups.getString(i)); + } + Assert.assertEquals(2, groups.size()); + Assert.assertTrue(groupList.contains("g11")); + Assert.assertTrue(groupList.contains("g112")); + } +} \ No newline at end of file diff --git a/docs-web/src/test/java/com/sismics/docs/rest/TestSecurity.java b/docs-web/src/test/java/com/sismics/docs/rest/TestSecurity.java index a05571fd..0b938a64 100644 --- a/docs-web/src/test/java/com/sismics/docs/rest/TestSecurity.java +++ b/docs-web/src/test/java/com/sismics/docs/rest/TestSecurity.java @@ -38,11 +38,11 @@ public class TestSecurity extends BaseJerseyTest { Assert.assertEquals("You don't have access to this resource", json.getString("message")); // User testsecurity logs in - String testSecurityAuthenticationToken = clientUtil.login("testsecurity"); + String testSecurityToken = clientUtil.login("testsecurity"); // User testsecurity creates a new user KO : no permission response = target().path("/user").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, testSecurityAuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, testSecurityToken) .put(Entity.form(new Form())); Assert.assertEquals(Status.FORBIDDEN, Status.fromStatusCode(response.getStatus())); Assert.assertEquals("ForbiddenError", json.getString("type")); @@ -50,29 +50,29 @@ public class TestSecurity extends BaseJerseyTest { // User testsecurity changes his email OK json = target().path("/user").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, testSecurityAuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, testSecurityToken) .post(Entity.form(new Form() .param("email", "testsecurity2@docs.com")), JsonObject.class); Assert.assertEquals("ok", json.getString("status")); // User testsecurity logs out response = target().path("/user/logout").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, testSecurityAuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, testSecurityToken) .post(Entity.form(new Form())); Assert.assertEquals(Status.OK, Status.fromStatusCode(response.getStatus())); - testSecurityAuthenticationToken = clientUtil.getAuthenticationCookie(response); - Assert.assertTrue(StringUtils.isEmpty(testSecurityAuthenticationToken)); + testSecurityToken = clientUtil.getAuthenticationCookie(response); + Assert.assertTrue(StringUtils.isEmpty(testSecurityToken)); // User testsecurity logs out KO : he is not connected anymore response = target().path("/user/logout").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, testSecurityAuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, testSecurityToken) .post(Entity.form(new Form())); Assert.assertEquals(Status.FORBIDDEN, Status.fromStatusCode(response.getStatus())); // User testsecurity logs in with a long lived session - testSecurityAuthenticationToken = clientUtil.login("testsecurity", "12345678", true); + testSecurityToken = clientUtil.login("testsecurity", "12345678", true); // User testsecurity logs out - clientUtil.logout(testSecurityAuthenticationToken); + clientUtil.logout(testSecurityToken); } } \ No newline at end of file diff --git a/docs-web/src/test/java/com/sismics/docs/rest/TestShareResource.java b/docs-web/src/test/java/com/sismics/docs/rest/TestShareResource.java index eea8ab85..4bccaf43 100644 --- a/docs-web/src/test/java/com/sismics/docs/rest/TestShareResource.java +++ b/docs-web/src/test/java/com/sismics/docs/rest/TestShareResource.java @@ -36,11 +36,11 @@ public class TestShareResource extends BaseJerseyTest { public void testShareResource() throws Exception { // Login share1 clientUtil.createUser("share1"); - String share1AuthenticationToken = clientUtil.login("share1"); + String share1Token = clientUtil.login("share1"); // Create a document JsonObject json = target().path("/document").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, share1AuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, share1Token) .put(Entity.form(new Form() .param("title", "File test document 1") .param("language", "eng")), JsonObject.class); @@ -55,7 +55,7 @@ public class TestShareResource extends BaseJerseyTest { json = target() .register(MultiPartFeature.class) .path("/file").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, share1AuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, share1Token) .put(Entity.entity(multiPart.field("id", document1Id).bodyPart(streamDataBodyPart), MediaType.MULTIPART_FORM_DATA_TYPE), JsonObject.class); file1Id = json.getString("id"); @@ -64,7 +64,7 @@ public class TestShareResource extends BaseJerseyTest { // Share this document json = target().path("/share").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, share1AuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, share1Token) .put(Entity.form(new Form() .param("id", document1Id) .param("name", "4 All")), JsonObject.class); @@ -107,9 +107,9 @@ public class TestShareResource extends BaseJerseyTest { // Deletes the share (not allowed) clientUtil.createUser("share2"); - String share2AuthenticationToken = clientUtil.login("share2"); + String share2Token = clientUtil.login("share2"); response = target().path("/share/" + share1Id).request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, share2AuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, share2Token) .delete(); Assert.assertEquals(Status.BAD_REQUEST, Status.fromStatusCode(response.getStatus())); json = response.readEntity(JsonObject.class); @@ -117,13 +117,13 @@ public class TestShareResource extends BaseJerseyTest { // Deletes the share json = target().path("/share/" + share1Id).request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, share1AuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, share1Token) .delete(JsonObject.class); Assert.assertEquals("ok", json.getString("status")); // Deletes the share again response = target().path("/share/" + share1Id).request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, share1AuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, share1Token) .delete(); Assert.assertEquals(Status.BAD_REQUEST, Status.fromStatusCode(response.getStatus())); json = response.readEntity(JsonObject.class); diff --git a/docs-web/src/test/java/com/sismics/docs/rest/TestTagResource.java b/docs-web/src/test/java/com/sismics/docs/rest/TestTagResource.java index af9c8eb3..49f68a9d 100644 --- a/docs-web/src/test/java/com/sismics/docs/rest/TestTagResource.java +++ b/docs-web/src/test/java/com/sismics/docs/rest/TestTagResource.java @@ -85,6 +85,8 @@ public class TestTagResource extends BaseJerseyTest { response = target().path("/document/" + document2Id).request() .cookie(TokenBasedSecurityFilter.COOKIE_NAME, tag1Token) .post(Entity.form(new Form() + .param("title", "My super document 2") + .param("language", "eng") .param("tags", tag3Id) .param("tags", tag4Id))); Assert.assertEquals(Status.OK, Status.fromStatusCode(response.getStatus())); @@ -102,6 +104,8 @@ public class TestTagResource extends BaseJerseyTest { response = target().path("/document/" + document2Id).request() .cookie(TokenBasedSecurityFilter.COOKIE_NAME, tag1Token) .post(Entity.form(new Form() + .param("title", "My super document 2") + .param("language", "eng") .param("tags", tag4Id))); Assert.assertEquals(Status.OK, Status.fromStatusCode(response.getStatus())); diff --git a/docs-web/src/test/java/com/sismics/docs/rest/TestUserResource.java b/docs-web/src/test/java/com/sismics/docs/rest/TestUserResource.java index a67ce500..aca82154 100644 --- a/docs-web/src/test/java/com/sismics/docs/rest/TestUserResource.java +++ b/docs-web/src/test/java/com/sismics/docs/rest/TestUserResource.java @@ -37,14 +37,14 @@ public class TestUserResource extends BaseJerseyTest { clientUtil.createUser("alice"); // Login admin - String adminAuthenticationToken = clientUtil.login("admin", "admin", false); + String adminToken = clientUtil.login("admin", "admin", false); // List all users json = target().path("/user/list") .queryParam("sort_column", 2) .queryParam("asc", false) .request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminAuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminToken) .get(JsonObject.class); JsonArray users = json.getJsonArray("users"); Assert.assertTrue(users.size() > 0); @@ -58,7 +58,7 @@ public class TestUserResource extends BaseJerseyTest { // Create a user KO (login length validation) Response response = target().path("/user").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminAuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminToken) .put(Entity.form(new Form() .param("username", " bb ") .param("email", "bob@docs.com") @@ -71,7 +71,7 @@ public class TestUserResource extends BaseJerseyTest { // Create a user KO (login format validation) response = target().path("/user").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminAuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminToken) .put(Entity.form(new Form() .param("username", "bob-") .param("email", "bob@docs.com") @@ -84,7 +84,7 @@ public class TestUserResource extends BaseJerseyTest { // Create a user KO (invalid quota) response = target().path("/user").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminAuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminToken) .put(Entity.form(new Form() .param("username", "bob") .param("email", "bob@docs.com") @@ -97,7 +97,7 @@ public class TestUserResource extends BaseJerseyTest { // Create a user KO (email format validation) response = target().path("/user").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminAuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminToken) .put(Entity.form(new Form() .param("username", "bob") .param("email", "bobdocs.com") @@ -115,12 +115,12 @@ public class TestUserResource extends BaseJerseyTest { .param("password", " 12345678 ") .param("storage_quota", "10"); json = target().path("/user").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminAuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminToken) .put(Entity.form(form), JsonObject.class); // Create a user bob KO : duplicate username response = target().path("/user").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminAuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminToken) .put(Entity.form(form)); Assert.assertNotSame(Status.OK, Status.fromStatusCode(response.getStatus())); json = response.readEntity(JsonObject.class); @@ -144,12 +144,12 @@ public class TestUserResource extends BaseJerseyTest { String aliceAuthToken = clientUtil.getAuthenticationCookie(response); // Login user bob twice - String bobAuthToken = clientUtil.login("bob"); - String bobAuthToken2 = clientUtil.login("bob"); + String bobToken = clientUtil.login("bob"); + String bobToken2 = clientUtil.login("bob"); // List sessions response = target().path("/user/session").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, bobAuthToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, bobToken) .get(); Assert.assertEquals(Status.OK, Status.fromStatusCode(response.getStatus())); json = response.readEntity(JsonObject.class); @@ -160,13 +160,13 @@ public class TestUserResource extends BaseJerseyTest { // Delete all sessions response = target().path("/user/session").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, bobAuthToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, bobToken) .delete(); Assert.assertEquals(Status.OK, Status.fromStatusCode(response.getStatus())); // Check bob user information with token 2 (just deleted) response = target().path("/user").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, bobAuthToken2) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, bobToken2) .get(); Assert.assertEquals(Status.OK, Status.fromStatusCode(response.getStatus())); json = response.readEntity(JsonObject.class); @@ -183,7 +183,7 @@ public class TestUserResource extends BaseJerseyTest { // Check bob user information json = target().path("/user").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, bobAuthToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, bobToken) .get(JsonObject.class); Assert.assertEquals("bob@docs.com", json.getString("email")); @@ -238,11 +238,11 @@ public class TestUserResource extends BaseJerseyTest { clientUtil.createUser("admin_user1"); // Login admin - String adminAuthenticationToken = clientUtil.login("admin", "admin", false); + String adminToken = clientUtil.login("admin", "admin", false); // Check admin information JsonObject json = target().path("/user").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminAuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminToken) .get(JsonObject.class); Assert.assertTrue(json.getBoolean("is_default_password")); Assert.assertEquals(0l, json.getJsonNumber("storage_current").longValue()); @@ -250,27 +250,27 @@ public class TestUserResource extends BaseJerseyTest { // User admin updates his information json = target().path("/user").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminAuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminToken) .post(Entity.form(new Form() .param("email", "newadminemail@docs.com")), JsonObject.class); Assert.assertEquals("ok", json.getString("status")); // Check admin information update json = target().path("/user").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminAuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminToken) .get(JsonObject.class); Assert.assertEquals("newadminemail@docs.com", json.getString("email")); // User admin update admin_user1 information json = target().path("/user").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminAuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminToken) .post(Entity.form(new Form() .param("email", " alice2@docs.com ")), JsonObject.class); Assert.assertEquals("ok", json.getString("status")); // User admin deletes himself: forbidden Response response = target().path("/user").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminAuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminToken) .delete(); Assert.assertEquals(Status.BAD_REQUEST, Status.fromStatusCode(response.getStatus())); json = response.readEntity(JsonObject.class); @@ -278,13 +278,13 @@ public class TestUserResource extends BaseJerseyTest { // User admin deletes user admin_user1 json = target().path("/user/admin_user1").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminAuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminToken) .delete(JsonObject.class); Assert.assertEquals("ok", json.getString("status")); // User admin deletes user admin_user1 : KO (user doesn't exist) response = target().path("/user/admin_user1").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminAuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminToken) .delete(); Assert.assertEquals(Status.BAD_REQUEST, Status.fromStatusCode(response.getStatus())); json = response.readEntity(JsonObject.class); diff --git a/docs-web/src/test/java/com/sismics/docs/rest/TestVocabularyResource.java b/docs-web/src/test/java/com/sismics/docs/rest/TestVocabularyResource.java index 491bab7a..9d2005e3 100644 --- a/docs-web/src/test/java/com/sismics/docs/rest/TestVocabularyResource.java +++ b/docs-web/src/test/java/com/sismics/docs/rest/TestVocabularyResource.java @@ -29,7 +29,7 @@ public class TestVocabularyResource extends BaseJerseyTest { String vocabulary1Token = clientUtil.login("vocabulary1"); // Login admin - String adminAuthenticationToken = clientUtil.login("admin", "admin", false); + String adminToken = clientUtil.login("admin", "admin", false); // Get coverage vocabularies entries JsonObject json = target().path("/vocabulary/coverage").request() @@ -49,7 +49,7 @@ public class TestVocabularyResource extends BaseJerseyTest { // Create a vocabulary entry with admin json = target().path("/vocabulary").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminAuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminToken) .put(Entity.form(new Form() .param("name", "test-voc-1") .param("value", "First value") @@ -62,7 +62,7 @@ public class TestVocabularyResource extends BaseJerseyTest { // Create a vocabulary entry with admin Response response = target().path("/vocabulary").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminAuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminToken) .put(Entity.form(new Form() .param("name", "NOT_VALID") .param("value", "First value") @@ -81,7 +81,7 @@ public class TestVocabularyResource extends BaseJerseyTest { // Update a vocabulary entry with admin json = target().path("/vocabulary/" + vocabulary1Id).request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminAuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminToken) .post(Entity.form(new Form() .param("name", "test-voc-1-updated") .param("value", "First value updated") @@ -103,7 +103,7 @@ public class TestVocabularyResource extends BaseJerseyTest { // Delete a vocabulary entry with admin json = target().path("/vocabulary/" + vocabulary1Id).request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminAuthenticationToken) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminToken) .delete(JsonObject.class); // Get test-voc-1-updated vocabularies entries